From 7975d5156daa96cf47ad9f69a64b29fab0cc3a02 Mon Sep 17 00:00:00 2001 From: Rory& Date: Wed, 26 Nov 2025 23:36:03 +0100 Subject: [PATCH] Pagnation and guild scoping for mention inbox --- src/api/routes/users/@me/mentions.ts | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/api/routes/users/@me/mentions.ts b/src/api/routes/users/@me/mentions.ts index cd3bb684e..cb2aac33e 100644 --- a/src/api/routes/users/@me/mentions.ts +++ b/src/api/routes/users/@me/mentions.ts @@ -19,7 +19,7 @@ import { route } from "@spacebar/api"; import { Snowflake, User, Message, Member, Channel, Permissions, timePromise, NewUrlUserSignatureData, Stopwatch, Attachment } from "@spacebar/util"; import { Request, Response, Router } from "express"; -import { In } from "typeorm"; +import { In, LessThan } from "typeorm"; const router: Router = Router({ mergeParams: true }); @@ -37,17 +37,18 @@ router.get( }), // AFAICT this endpoint doesn't list DMs async (req: Request, res: Response) => { - const limit = req.query.limit && !isNaN(Number(req.query.limit)) ? Number(req.query.limit) : 50; - const everyone = !!req.query.everyone; - const roles = !!req.query.roles; - const before = req.query.before && BigInt(req.query.before as string); + const limit = req.query.limit && !isNaN(Number(req.query.limit)) ? Number(req.query.limit) : 25; + const everyone = req.query.everyone !== undefined ? Boolean(req.query.everyone) : true; + const roles = req.query.roles !== undefined ? Boolean(req.query.roles) : true; + const before = req.query.before !== undefined ? String(req.query.before as string) : undefined; + const guild_id = req.query.guild_id !== undefined ? req.query.guild_id : undefined; const user = await User.findOneOrFail({ where: { id: req.user_id }, }); const memberships = await Member.find({ - where: { id: req.user_id }, + where: { id: req.user_id, ...(guild_id === undefined ? {} : { guild_id: String(guild_id) }) }, select: { guild_id: true, id: true, @@ -69,7 +70,7 @@ router.get( const channels = await Channel.find({ where: { - guild_id: In(memberships.map((m) => m.guild_id)), + guild_id: In(memberships.map((m) => m.guild_id).distinct()), }, select: { id: true, guild_id: true, permission_overwrites: true }, }); @@ -77,7 +78,7 @@ router.get( const visibleChannels = channels.filter((c) => { const member = memberships.find((m) => m.guild_id === c.guild_id)!; return Permissions.finalPermission({ - user: { id: member.id, roles: member.roles.map((r) => r.id), communication_disabled_until: member.communication_disabled_until, flags: 0 }, + user: { id: member.id, roles: member.roles.map((r) => r.id).distinct(), communication_disabled_until: member.communication_disabled_until, flags: 0 }, guild: { id: member.guild.id, owner_id: member.guild.owner_id!, roles: member.roles }, channel: c, }).has("VIEW_CHANNEL"); @@ -99,6 +100,7 @@ router.get( where: { channel_id: In(visibleChannelIds), mentions: { id: user.id }, + ...(before === undefined ? {} : { id: LessThan(before) }), }, select: { id: true, @@ -117,6 +119,7 @@ router.get( where: { channel_id: In(visibleChannelIds), mention_roles: { id: In(ownedMentionableRoleIds) }, + ...(before === undefined ? {} : { id: LessThan(before) }), }, select: { id: true, @@ -135,6 +138,7 @@ router.get( where: { channel_id: In(visibleChannelIds), mention_everyone: true, + ...(before === undefined ? {} : { id: LessThan(before) }), }, select: { id: true,