summaryrefslogtreecommitdiff
path: root/src/server/api/endpoints/channels/timeline.ts
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2020-08-18 22:44:21 +0900
committerGitHub <noreply@github.com>2020-08-18 22:44:21 +0900
commit9855405b8989713b81709fc1700e2ead97423467 (patch)
tree54254d2159378d1903e962f0fb37c799bb0f4464 /src/server/api/endpoints/channels/timeline.ts
parentSign (request-target) Fix #6652 (#6656) (diff)
downloadmisskey-9855405b8989713b81709fc1700e2ead97423467.tar.gz
misskey-9855405b8989713b81709fc1700e2ead97423467.tar.bz2
misskey-9855405b8989713b81709fc1700e2ead97423467.zip
Channel (#6621)
* wip * wip * wip * wip * wip * wip * wip * wip * wop * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * add notes * wip * wip * wip * wip * sound * wip * add kick_gaba2 * wip
Diffstat (limited to 'src/server/api/endpoints/channels/timeline.ts')
-rw-r--r--src/server/api/endpoints/channels/timeline.ts99
1 files changed, 99 insertions, 0 deletions
diff --git a/src/server/api/endpoints/channels/timeline.ts b/src/server/api/endpoints/channels/timeline.ts
new file mode 100644
index 0000000000..3ae28fc67a
--- /dev/null
+++ b/src/server/api/endpoints/channels/timeline.ts
@@ -0,0 +1,99 @@
+import $ from 'cafy';
+import { ID } from '../../../../misc/cafy-id';
+import define from '../../define';
+import { ApiError } from '../../error';
+import { Notes, Channels } from '../../../../models';
+import { makePaginationQuery } from '../../common/make-pagination-query';
+import { activeUsersChart } from '../../../../services/chart';
+
+export const meta = {
+ tags: ['notes', 'channels'],
+
+ requireCredential: false as const,
+
+ params: {
+ channelId: {
+ validator: $.type(ID),
+ desc: {
+ 'ja-JP': 'チャンネルのID'
+ }
+ },
+
+ limit: {
+ validator: $.optional.num.range(1, 100),
+ default: 10,
+ desc: {
+ 'ja-JP': '最大数'
+ }
+ },
+
+ sinceId: {
+ validator: $.optional.type(ID),
+ desc: {
+ 'ja-JP': '指定すると、その投稿を基点としてより新しい投稿を取得します'
+ }
+ },
+
+ untilId: {
+ validator: $.optional.type(ID),
+ desc: {
+ 'ja-JP': '指定すると、その投稿を基点としてより古い投稿を取得します'
+ }
+ },
+
+ sinceDate: {
+ validator: $.optional.num,
+ desc: {
+ 'ja-JP': '指定した時間を基点としてより新しい投稿を取得します。数値は、1970年1月1日 00:00:00 UTC から指定した日時までの経過時間をミリ秒単位で表します。'
+ }
+ },
+
+ untilDate: {
+ validator: $.optional.num,
+ desc: {
+ 'ja-JP': '指定した時間を基点としてより古い投稿を取得します。数値は、1970年1月1日 00:00:00 UTC から指定した日時までの経過時間をミリ秒単位で表します。'
+ }
+ },
+ },
+
+ res: {
+ type: 'array' as const,
+ optional: false as const, nullable: false as const,
+ items: {
+ type: 'object' as const,
+ optional: false as const, nullable: false as const,
+ ref: 'Note',
+ }
+ },
+
+ errors: {
+ noSuchChannel: {
+ message: 'No such channel.',
+ code: 'NO_SUCH_CHANNEL',
+ id: '4d0eeeba-a02c-4c3c-9966-ef60d38d2e7f'
+ }
+ }
+};
+
+export default define(meta, async (ps, user) => {
+ const channel = await Channels.findOne({
+ id: ps.channelId,
+ });
+
+ if (channel == null) {
+ throw new ApiError(meta.errors.noSuchChannel);
+ }
+
+ //#region Construct query
+ const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId)
+ .andWhere('note.channelId = :channelId', { channelId: channel.id })
+ .leftJoinAndSelect('note.user', 'user')
+ .leftJoinAndSelect('note.channel', 'channel');
+ //#endregion
+
+ const timeline = await query.take(ps.limit!).getMany();
+
+ activeUsersChart.update(user);
+
+ return await Notes.packMany(timeline, user);
+});