import define from "../../define.js"; import { ApiError } from "../../error.js"; import { Notes, Channels } from "../../../../models/index.js"; import { makePaginationQuery } from "../../common/make-pagination-query.js"; import { activeUsersChart } from "../../../../services/chart/index.js"; import { generateExcludeMemorietQuery } from "../../common/generate-exclude-memoriet-query.js"; export const meta = { tags: [ "notes", "channels" ], requireCredential: true, res: { type: "array", optional: false, nullable: false, items: { type: "object", optional: false, nullable: false, ref: "Note" } }, errors: { noSuchChannel: { message: "No such channel.", code: "NO_SUCH_CHANNEL", id: "4d0eeeba-a02c-4c3c-9966-ef60d38d2e7f" } } }; export const paramDef = { type: "object", properties: { channelId: { type: "string", format: "misskey:id" }, limit: { type: "integer", minimum: 1, maximum: 100, default: 10 }, sinceId: { type: "string", format: "misskey:id" }, untilId: { type: "string", format: "misskey:id" }, sinceDate: { type: "integer" }, untilDate: { type: "integer" } }, required: [ "channelId" ] }; export default define(meta, paramDef, async (ps, user)=>{ const channel = await Channels.findOneBy({ 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, ps.sinceDate, ps.untilDate).andWhere("note.channelId = :channelId", { channelId: channel.id }).innerJoinAndSelect("note.user", "user").leftJoinAndSelect("note.reply", "reply").leftJoinAndSelect("note.renote", "renote").leftJoinAndSelect("reply.user", "replyUser").leftJoinAndSelect("renote.user", "renoteUser").leftJoinAndSelect("note.channel", "channel"); generateExcludeMemorietQuery(query); //#endregion const timeline = await query.take(ps.limit).getMany(); if (user) activeUsersChart.read(user); return await Notes.packMany(timeline, user); });