import { Announcements, AnnouncementReads } from "../../../models/index.js"; import define from "../define.js"; import { makePaginationQuery } from "../common/make-pagination-query.js"; export const meta = { tags: [ "meta" ], requireCredential: false, requireCredentialPrivateMode: true, res: { type: "array", optional: false, nullable: false, items: { type: "object", optional: false, nullable: false, properties: { id: { type: "string", optional: false, nullable: false, format: "id", example: "xxxxxxxxxx" }, createdAt: { type: "string", optional: false, nullable: false, format: "date-time" }, updatedAt: { type: "string", optional: false, nullable: true, format: "date-time" }, text: { type: "string", optional: false, nullable: false }, title: { type: "string", optional: false, nullable: false }, imageUrl: { type: "string", optional: false, nullable: true }, isRead: { type: "boolean", optional: true, nullable: false }, showPopup: { type: "boolean", optional: false, nullable: false }, isGoodNews: { type: "boolean", optional: false, nullable: false } } } } }; export const paramDef = { type: "object", properties: { limit: { type: "integer", minimum: 1, maximum: 100, default: 10 }, withUnreads: { type: "boolean", default: false }, sinceId: { type: "string", format: "misskey:id" }, untilId: { type: "string", format: "misskey:id" } }, required: [] }; export default define(meta, paramDef, async (ps, user)=>{ const query = makePaginationQuery(Announcements.createQueryBuilder("announcement"), ps.sinceId, ps.untilId); const announcements = await query.take(ps.limit).getMany(); if (user) { const reads = (await AnnouncementReads.findBy({ userId: user.id })).map((x)=>x.announcementId); for (const announcement of announcements){ announcement.isRead = reads.includes(announcement.id); } } return (ps.withUnreads ? announcements.filter((a)=>!a.isRead) : announcements).map((a)=>({ ...a, createdAt: a.createdAt.toISOString(), updatedAt: a.updatedAt?.toISOString() ?? null })); });