Implement featured note API
This commit is contained in:
parent
fb947da6a5
commit
8c8ff7d49a
4 changed files with 65 additions and 8 deletions
|
@ -22,11 +22,11 @@ Note.createIndex('userId');
|
|||
Note.createIndex('mentions');
|
||||
Note.createIndex('visibleUserIds');
|
||||
Note.createIndex('tagsLower');
|
||||
Note.createIndex('_user.host');
|
||||
Note.createIndex('_files._id');
|
||||
Note.createIndex('_files.contentType');
|
||||
Note.createIndex({
|
||||
createdAt: -1
|
||||
});
|
||||
Note.createIndex({ createdAt: -1 });
|
||||
Note.createIndex({ score: -1 }, { sparse: true });
|
||||
export default Note;
|
||||
|
||||
export function isValidText(text: string): boolean {
|
||||
|
@ -85,8 +85,14 @@ export type INote = {
|
|||
heading: number;
|
||||
speed: number;
|
||||
};
|
||||
|
||||
uri: string;
|
||||
|
||||
/**
|
||||
* 人気の投稿度合いを表すスコア
|
||||
*/
|
||||
score: number;
|
||||
|
||||
// 非正規化
|
||||
_reply?: {
|
||||
userId: mongo.ObjectID;
|
||||
|
@ -298,6 +304,7 @@ export const pack = async (
|
|||
delete _note.prev;
|
||||
delete _note.next;
|
||||
delete _note.tagsLower;
|
||||
delete _note.score;
|
||||
delete _note._user;
|
||||
delete _note._reply;
|
||||
delete _note._renote;
|
||||
|
|
49
src/server/api/endpoints/notes/featured.ts
Normal file
49
src/server/api/endpoints/notes/featured.ts
Normal file
|
@ -0,0 +1,49 @@
|
|||
import $ from 'cafy';
|
||||
import Note from '../../../../models/note';
|
||||
import { packMany } from '../../../../models/note';
|
||||
import { ILocalUser } from '../../../../models/user';
|
||||
import getParams from '../../get-params';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
'ja-JP': 'Featuredな投稿を取得します。',
|
||||
'en-US': 'Get featured notes.'
|
||||
},
|
||||
|
||||
requireCredential: false,
|
||||
|
||||
params: {
|
||||
limit: $.num.optional.range(1, 30).note({
|
||||
default: 10,
|
||||
desc: {
|
||||
'ja-JP': '最大数'
|
||||
}
|
||||
})
|
||||
}
|
||||
};
|
||||
|
||||
export default async (params: any, user: ILocalUser) => {
|
||||
const [ps, psErr] = getParams(meta, params);
|
||||
if (psErr) throw psErr;
|
||||
|
||||
const day = 1000 * 60 * 60 * 24;
|
||||
|
||||
const notes = await Note
|
||||
.find({
|
||||
createdAt: {
|
||||
$gt: new Date(Date.now() - day)
|
||||
},
|
||||
deletedAt: null,
|
||||
visibility: { $in: ['public', 'home'] }
|
||||
}, {
|
||||
limit: ps.limit,
|
||||
sort: {
|
||||
score: -1
|
||||
},
|
||||
hint: {
|
||||
score: -1
|
||||
}
|
||||
});
|
||||
|
||||
return await packMany(notes, user);
|
||||
};
|
|
@ -314,7 +314,8 @@ async function renderActivity(data: Option, note: INote) {
|
|||
function incRenoteCount(renote: INote) {
|
||||
Note.update({ _id: renote._id }, {
|
||||
$inc: {
|
||||
renoteCount: 1
|
||||
renoteCount: 1,
|
||||
score: 1
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -36,12 +36,12 @@ export default async (user: IUser, note: INote, reaction: string) => new Promise
|
|||
|
||||
res();
|
||||
|
||||
const inc: {[key: string]: number} = {};
|
||||
inc[`reactionCounts.${reaction}`] = 1;
|
||||
|
||||
// Increment reactions count
|
||||
await Note.update({ _id: note._id }, {
|
||||
$inc: inc
|
||||
$inc: {
|
||||
[`reactionCounts.${reaction}`]: 1,
|
||||
score: 1
|
||||
}
|
||||
});
|
||||
|
||||
perUserReactionsChart.update(user, note);
|
||||
|
|
Loading…
Reference in a new issue