summaryrefslogtreecommitdiff
path: root/src/server/api/endpoints/notes/global-timeline.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/api/endpoints/notes/global-timeline.ts')
-rw-r--r--src/server/api/endpoints/notes/global-timeline.ts89
1 files changed, 19 insertions, 70 deletions
diff --git a/src/server/api/endpoints/notes/global-timeline.ts b/src/server/api/endpoints/notes/global-timeline.ts
index 0eb761cdb6..7bf62f366b 100644
--- a/src/server/api/endpoints/notes/global-timeline.ts
+++ b/src/server/api/endpoints/notes/global-timeline.ts
@@ -1,11 +1,12 @@
import $ from 'cafy';
-import ID, { transform } from '../../../../misc/cafy-id';
-import Note from '../../../../models/note';
-import { packMany } from '../../../../models/note';
+import { ID } from '../../../../misc/cafy-id';
import define from '../../define';
import fetchMeta from '../../../../misc/fetch-meta';
-import { getHideUserIds } from '../../common/get-hide-users';
import { ApiError } from '../../error';
+import { makePaginationQuery } from '../../common/make-pagination-query';
+import { Notes } from '../../../../models';
+import { generateMuteQuery } from '../../common/generate-mute-query';
+import { activeUsersChart } from '../../../../services/chart';
export const meta = {
desc: {
@@ -22,14 +23,6 @@ export const meta = {
}
},
- mediaOnly: {
- validator: $.optional.bool,
- deprecated: true,
- desc: {
- 'ja-JP': 'ファイルが添付された投稿に限定するか否か (このパラメータは廃止予定です。代わりに withFiles を使ってください。)'
- }
- },
-
limit: {
validator: $.optional.num.range(1, 100),
default: 10
@@ -37,12 +30,10 @@ export const meta = {
sinceId: {
validator: $.optional.type(ID),
- transform: transform,
},
untilId: {
validator: $.optional.type(ID),
- transform: transform,
},
sinceDate: {
@@ -71,6 +62,7 @@ export const meta = {
};
export default define(meta, async (ps, user) => {
+ // TODO どっかにキャッシュ
const m = await fetchMeta();
if (m.disableGlobalTimeline) {
if (user == null || (!user.isAdmin && !user.isModerator)) {
@@ -78,68 +70,25 @@ export default define(meta, async (ps, user) => {
}
}
- // 隠すユーザーを取得
- const hideUserIds = await getHideUserIds(user);
-
//#region Construct query
- const sort = {
- _id: -1
- };
-
- const query = {
- deletedAt: null,
-
- // public only
- visibility: 'public',
+ const query = makePaginationQuery(Notes.createQueryBuilder('note'),
+ ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
+ .andWhere('note.visibility = \'public\'')
+ .andWhere('note.replyId IS NULL')
+ .leftJoinAndSelect('note.user', 'user');
- replyId: null
- } as any;
+ if (user) generateMuteQuery(query, user);
- if (hideUserIds && hideUserIds.length > 0) {
- query.userId = {
- $nin: hideUserIds
- };
-
- query['_reply.userId'] = {
- $nin: hideUserIds
- };
-
- query['_renote.userId'] = {
- $nin: hideUserIds
- };
+ if (ps.withFiles) {
+ query.andWhere('note.fileIds != \'{}\'');
}
+ //#endregion
- const withFiles = ps.withFiles != null ? ps.withFiles : ps.mediaOnly;
+ const timeline = await query.take(ps.limit).getMany();
- if (withFiles) {
- query.fileIds = { $exists: true, $ne: [] };
+ if (user) {
+ activeUsersChart.update(user);
}
- if (ps.sinceId) {
- sort._id = 1;
- query._id = {
- $gt: ps.sinceId
- };
- } else if (ps.untilId) {
- query._id = {
- $lt: ps.untilId
- };
- } else if (ps.sinceDate) {
- sort._id = 1;
- query.createdAt = {
- $gt: new Date(ps.sinceDate)
- };
- } else if (ps.untilDate) {
- query.createdAt = {
- $lt: new Date(ps.untilDate)
- };
- }
- //#endregion
-
- const timeline = await Note.find(query, {
- limit: ps.limit,
- sort: sort
- });
-
- return await packMany(timeline, user);
+ return await Notes.packMany(timeline, user);
});