From dc3a85f078e3c4242d22612e51c3729b11624c69 Mon Sep 17 00:00:00 2001 From: CyberL1 Date: Sun, 13 Jul 2025 10:56:30 +0200 Subject: [PATCH] refactor: use `pinned_at` to check if message is pinnned --- .../#channel_id/messages/#message_id/index.ts | 2 +- .../#channel_id/messages/pins/index.ts | 30 +++++++++++-------- src/api/routes/channels/#channel_id/pins.ts | 25 ++++++++++------ .../guilds/#guild_id/messages/search.ts | 2 +- src/util/entities/Message.ts | 7 ++--- .../1752383879533-message_pinned_at.ts | 2 ++ 6 files changed, 39 insertions(+), 29 deletions(-) diff --git a/src/api/routes/channels/#channel_id/messages/#message_id/index.ts b/src/api/routes/channels/#channel_id/messages/#message_id/index.ts index 95c995de..27c42cb3 100644 --- a/src/api/routes/channels/#channel_id/messages/#message_id/index.ts +++ b/src/api/routes/channels/#channel_id/messages/#message_id/index.ts @@ -133,7 +133,7 @@ router.patch( mentions: new_message.embeds, mention_roles: new_message.mention_roles, mention_everyone: new_message.mention_everyone, - pinned: new_message.pinned, + pinned: new_message.pinned_at != null, timestamp: new_message.timestamp, edited_timestamp: new_message.edited_timestamp, diff --git a/src/api/routes/channels/#channel_id/messages/pins/index.ts b/src/api/routes/channels/#channel_id/messages/pins/index.ts index 717f5d5a..3e04b157 100644 --- a/src/api/routes/channels/#channel_id/messages/pins/index.ts +++ b/src/api/routes/channels/#channel_id/messages/pins/index.ts @@ -55,14 +55,18 @@ router.put( // * in dm channels anyone can pin messages -> only check for guilds if (message.guild_id) req.permission?.hasThrow("MANAGE_MESSAGES"); - const pinned_count = await Message.count({ - where: { channel: { id: channel_id }, pinned: true }, - }); + const pinned_count = await Message.createQueryBuilder("message") + .leftJoinAndSelect("message.channel", "channel") + .leftJoinAndSelect("message.author", "author") + .where("channel.id = :channelId", { channelId: channel_id }) + .andWhere("message.pinned_at IS NOT NULL") + .orderBy("message.pinned_at", "DESC") + .getCount(); + const { maxPins } = Config.get().limits.channel; if (pinned_count >= maxPins) throw DiscordApiErrors.MAXIMUM_PINS.withParams(maxPins); - message.pinned = true; message.pinned_at = new Date(); const author = await User.getPublicUser(req.user_id); @@ -140,7 +144,7 @@ router.delete( if (message.guild_id) req.permission?.hasThrow("MANAGE_MESSAGES"); - message.pinned = false; + message.pinned_at = null; await Promise.all([ message.save(), @@ -180,15 +184,15 @@ router.get( async (req: Request, res: Response) => { const { channel_id } = req.params; - const pins = await Message.find({ - where: { channel_id: channel_id, pinned: true }, - relations: ["author"], - order: { - pinned_at: "DESC", - }, - }); + const pins = await Message.createQueryBuilder("message") + .leftJoinAndSelect("message.channel", "channel") + .leftJoinAndSelect("message.author", "author") + .where("channel.id = :channelId", { channelId: channel_id }) + .andWhere("message.pinned_at IS NOT NULL") + .orderBy("message.pinned_at", "DESC") + .getMany(); - const items = pins.map((message) => ({ + const items = pins.map((message: Message) => ({ message, pinned_at: message.pinned_at, })); diff --git a/src/api/routes/channels/#channel_id/pins.ts b/src/api/routes/channels/#channel_id/pins.ts index bf746148..a8790eab 100644 --- a/src/api/routes/channels/#channel_id/pins.ts +++ b/src/api/routes/channels/#channel_id/pins.ts @@ -56,14 +56,18 @@ router.put( // * in dm channels anyone can pin messages -> only check for guilds if (message.guild_id) req.permission?.hasThrow("MANAGE_MESSAGES"); - const pinned_count = await Message.count({ - where: { channel: { id: channel_id }, pinned: true }, - }); + const pinned_count = await Message.createQueryBuilder("message") + .leftJoinAndSelect("message.channel", "channel") + .leftJoinAndSelect("message.author", "author") + .where("channel.id = :channelId", { channelId: channel_id }) + .andWhere("message.pinned_at IS NOT NULL") + .orderBy("message.pinned_at", "DESC") + .getCount(); const { maxPins } = Config.get().limits.channel; if (pinned_count >= maxPins) throw DiscordApiErrors.MAXIMUM_PINS.withParams(maxPins); - message.pinned = true; + message.pinned_at = new Date(); const author = await User.getPublicUser(req.user_id); @@ -140,7 +144,7 @@ router.delete( if (message.guild_id) req.permission?.hasThrow("MANAGE_MESSAGES"); - message.pinned = false; + message.pinned_at = null; await Promise.all([ message.save(), @@ -180,10 +184,13 @@ router.get( async (req: Request, res: Response) => { const { channel_id } = req.params; - const pins = await Message.find({ - where: { channel_id: channel_id, pinned: true }, - relations: ["author"], - }); + const pins = await Message.createQueryBuilder("message") + .leftJoinAndSelect("message.channel", "channel") + .leftJoinAndSelect("message.author", "author") + .where("channel.id = :channelId", { channelId: channel_id }) + .andWhere("message.pinned_at IS NOT NULL") + .orderBy("message.pinned_at", "DESC") + .getMany(); res.send(pins); }, diff --git a/src/api/routes/guilds/#guild_id/messages/search.ts b/src/api/routes/guilds/#guild_id/messages/search.ts index 94adf9c6..91311b6a 100644 --- a/src/api/routes/guilds/#guild_id/messages/search.ts +++ b/src/api/routes/guilds/#guild_id/messages/search.ts @@ -155,7 +155,7 @@ router.get( embeds: x.embeds, mentions: x.mentions, mention_roles: x.mention_roles, - pinned: x.pinned, + pinned: x.pinned_at != null, mention_everyone: x.mention_everyone, tts: x.tts, timestamp: x.timestamp, diff --git a/src/util/entities/Message.ts b/src/util/entities/Message.ts index b089a196..6a9c430c 100644 --- a/src/util/entities/Message.ts +++ b/src/util/entities/Message.ts @@ -185,11 +185,8 @@ export class Message extends BaseClass { @Column({ type: "text", nullable: true }) nonce?: string; - @Column({ nullable: true }) - pinned?: boolean; - - @Column({ nullable: true }) - pinned_at?: Date; + @Column({ type: "timestamp", nullable: true }) + pinned_at: Date | null; @Column({ type: "int" }) type: MessageType; diff --git a/src/util/migration/postgres/1752383879533-message_pinned_at.ts b/src/util/migration/postgres/1752383879533-message_pinned_at.ts index f96d284c..62096b1a 100644 --- a/src/util/migration/postgres/1752383879533-message_pinned_at.ts +++ b/src/util/migration/postgres/1752383879533-message_pinned_at.ts @@ -7,11 +7,13 @@ export class MessagePinnedAt1752383879533 implements MigrationInterface { await queryRunner.query( `ALTER TABLE "messages" ADD "pinned_at" TIMESTAMP`, ); + await queryRunner.query(`ALTER TABLE "messages" DROP COLUMN "pinned"`); } public async down(queryRunner: QueryRunner): Promise { await queryRunner.query( `ALTER TABLE "messages" DROP COLUMN "pinned_at"`, ); + await queryRunner.query(`ALTER TABLE "messages" ADD "pinned" boolean`); } }