diff --git a/src/api/routes/users/#user_id/messages.ts b/src/api/routes/users/#user_id/messages.ts
index 9ce0b369..717bca96 100644
--- a/src/api/routes/users/#user_id/messages.ts
+++ b/src/api/routes/users/#user_id/messages.ts
@@ -19,7 +19,7 @@
import { route } from "@spacebar/api";
import { Config, Message, User } from "@spacebar/util";
import { Request, Response, Router } from "express";
-import { DmMessagesResponseSchema } from "@spacebar/schemas"
+import { DmMessagesResponseSchema } from "@spacebar/schemas";
const router = Router({ mergeParams: true });
router.get(
@@ -42,7 +42,7 @@ router.get(
await Message.find({
where: { channel_id: channel?.id },
order: { timestamp: "DESC" },
- take: Math.clamp(req.query.limit ? Number(req.query.limit) : 50, 1, Config.get().limits.message.maxPreloadCount),
+ take: Math.min(Math.max(req.query.limit ? Number(req.query.limit) : 50, 1), Config.get().limits.message.maxPreloadCount),
})
).filter((x) => x !== null) as Message[];
diff --git a/src/api/routes/users/@me/mentions.ts b/src/api/routes/users/@me/mentions.ts
index cb2aac33..37a7abe1 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, LessThan } from "typeorm";
+import { In, LessThan, FindOptionsWhere } from "typeorm";
const router: Router = Router({ mergeParams: true });
@@ -70,7 +70,7 @@ router.get(
const channels = await Channel.find({
where: {
- guild_id: In(memberships.map((m) => m.guild_id).distinct()),
+ guild_id: In(memberships.map((m) => m.guild_id)),
},
select: { id: true, guild_id: true, permission_overwrites: true },
});
@@ -78,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).distinct(), communication_disabled_until: member.communication_disabled_until, flags: 0 },
+ user: { id: member.id, roles: member.roles.map((r) => r.id), 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");
@@ -90,81 +90,32 @@ router.get(
return acc;
}, [] as Snowflake[]);
- const [
- { result: userMentions, elapsed: userMentionQueryTime },
- { result: roleMentions, elapsed: roleMentionQueryTime },
- { result: everyoneMentions, elapsed: everyoneMentionQueryTime },
- ] = await Promise.all([
- await timePromise(() =>
- Message.find({
- where: {
- channel_id: In(visibleChannelIds),
- mentions: { id: user.id },
- ...(before === undefined ? {} : { id: LessThan(before) }),
- },
- select: {
- id: true,
- timestamp: true,
- },
- order: {
- timestamp: "DESC",
- },
- take: limit,
- }),
- ),
- await timePromise(() =>
- !roles
- ? Promise.resolve([])
- : Message.find({
- where: {
- channel_id: In(visibleChannelIds),
- mention_roles: { id: In(ownedMentionableRoleIds) },
- ...(before === undefined ? {} : { id: LessThan(before) }),
- },
- select: {
- id: true,
- timestamp: true,
- },
- order: {
- timestamp: "DESC",
- },
- take: limit,
- }),
- ),
- await timePromise(() =>
- !everyone
- ? Promise.resolve([])
- : Message.find({
- where: {
- channel_id: In(visibleChannelIds),
- mention_everyone: true,
- ...(before === undefined ? {} : { id: LessThan(before) }),
- },
- select: {
- id: true,
- timestamp: true,
- },
- order: {
- timestamp: "DESC",
- },
- take: limit,
- }),
- ),
- ]);
-
- const allMentions = [...userMentions, ...roleMentions, ...everyoneMentions];
- console.log(
- `[Inbox/mentions] User ${user.id} query results: totalRecs=${allMentions.length} | user=${userMentions.length} (took ${userMentionQueryTime.totalMilliseconds}ms), role=${roleMentions.length} (took ${roleMentionQueryTime.totalMilliseconds}ms), everyone=${everyoneMentions.length} (took ${everyoneMentionQueryTime.totalMilliseconds}ms)`,
- );
- const messageIdsToReturn = allMentions
- .sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime())
- .distinctBy((m) => m.id)
- .slice(0, limit);
+ const whereQuery: FindOptionsWhere<Message>[] = [
+ {
+ channel_id: In(visibleChannelIds),
+ mentions: { id: user.id },
+ id: before ? LessThan(before) : undefined,
+ },
+ ];
+ if (everyone) {
+ whereQuery.push({
+ channel_id: In(visibleChannelIds),
+ mention_everyone: true,
+ id: before ? LessThan(before) : undefined,
+ });
+ }
+ if (roles) {
+ whereQuery.push({
+ channel_id: In(visibleChannelIds),
+ mention_roles: { id: In(ownedMentionableRoleIds) },
+ id: before ? LessThan(before) : undefined,
+ });
+ }
const sw = Stopwatch.startNew();
const finalMessages = (
await Message.find({
- where: { id: In(messageIdsToReturn.map((m) => m.id)) },
+ where: whereQuery,
order: { timestamp: "DESC" },
relations: [
"author",
@@ -185,6 +136,7 @@ router.get(
"referenced_message.sticker_items",
"referenced_message.attachments",
],
+ take: limit,
})
).map((m) => {
return {
diff --git a/src/api/routes/users/@me/settings.ts b/src/api/routes/users/@me/settings.ts
index beef662b..3a972424 100644
--- a/src/api/routes/users/@me/settings.ts
+++ b/src/api/routes/users/@me/settings.ts
@@ -19,7 +19,7 @@
import { route } from "@spacebar/api";
import { User, UserSettings } from "@spacebar/util";
import { Request, Response, Router } from "express";
-import { UserSettingsUpdateSchema, UserSettingsSchema } from "@spacebar/schemas"
+import { UserSettingsUpdateSchema, UserSettingsSchema } from "@spacebar/schemas";
const router = Router({ mergeParams: true });
@@ -36,7 +36,7 @@ router.get(
},
}),
async (req: Request, res: Response) => {
- const settings = await UserSettings.getOrDefault(req.user_id)
+ const settings = await UserSettings.getOrDefault(req.user_id);
return res.json(settings);
},
);
@@ -67,13 +67,10 @@ router.patch(
relations: ["settings"],
});
- if (!user.settings)
- user.settings = UserSettings.create(body as UserSettingsUpdateSchema);
- else
- user.settings.assign(body);
+ if (!user.settings) user.settings = UserSettings.create<UserSettings>(body);
+ else user.settings.assign(body);
- if (body.guild_folders)
- user.settings.guild_folders = body.guild_folders;
+ if (body.guild_folders) user.settings.guild_folders = body.guild_folders;
await user.settings.save();
await user.save();
|