More relations

This commit is contained in:
Rory& 2025-09-28 23:47:32 +02:00
parent 2f1b131b0f
commit b6cfb32d5a
2 changed files with 20 additions and 66 deletions

View File

@ -45,13 +45,7 @@ import {
import { Request, Response, Router } from "express";
import { HTTPError } from "lambert-server";
import multer from "multer";
import {
FindManyOptions,
FindOperator,
LessThan,
MoreThan,
MoreThanOrEqual,
} from "typeorm";
import { FindManyOptions, FindOperator, LessThan, MoreThan, MoreThanOrEqual } from "typeorm";
import { URL } from "url";
import fetch from "node-fetch-commonjs";
import { CloudAttachment } from "../../../../../util/entities/CloudAttachment";
@ -75,8 +69,7 @@ router.get(
},
limit: {
type: "number",
description:
"max number of messages to return (1-100). defaults to 50",
description: "max number of messages to return (1-100). defaults to 50",
},
},
responses: {
@ -102,14 +95,9 @@ router.get(
const before = req.query.before ? `${req.query.before}` : undefined;
const after = req.query.after ? `${req.query.after}` : undefined;
const limit = Number(req.query.limit) || 50;
if (limit < 1 || limit > 100)
throw new HTTPError("limit must be between 1 and 100", 422);
if (limit < 1 || limit > 100) throw new HTTPError("limit must be between 1 and 100", 422);
const permissions = await getPermission(
req.user_id,
channel.guild_id,
channel_id,
);
const permissions = await getPermission(req.user_id, channel.guild_id, channel_id);
permissions.hasThrow("VIEW_CHANNEL");
if (!permissions.has("READ_MESSAGE_HISTORY")) return res.json([]);
@ -131,6 +119,8 @@ router.get(
"referenced_message",
"referenced_message.author",
"referenced_message.mentions",
"referenced_message.mention_roles",
"referenced_message.mention_channels",
],
};
@ -151,9 +141,7 @@ router.get(
}),
]);
left.push(...right);
messages = left.sort(
(a, b) => a.timestamp.getTime() - b.timestamp.getTime(),
);
messages = left.sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
} else {
query.take = 1;
const message = await Message.findOne({
@ -164,20 +152,12 @@ router.get(
}
} else {
if (after) {
if (BigInt(after) > BigInt(Snowflake.generate()))
throw new HTTPError(
"after parameter must not be greater than current time",
422,
);
if (BigInt(after) > BigInt(Snowflake.generate())) throw new HTTPError("after parameter must not be greater than current time", 422);
query.where.id = MoreThan(after);
query.order = { timestamp: "ASC" };
} else if (before) {
if (BigInt(before) > BigInt(Snowflake.generate()))
throw new HTTPError(
"before parameter must not be greater than current time",
422,
);
if (BigInt(before) > BigInt(Snowflake.generate())) throw new HTTPError("before parameter must not be greater than current time", 422);
query.where.id = LessThan(before);
}
@ -205,9 +185,7 @@ router.get(
});
x.attachments?.forEach((y: Attachment) => {
// dynamically set attachment proxy_url in case the endpoint changed
const uri = y.proxy_url.startsWith("http")
? y.proxy_url
: `https://example.org${y.proxy_url}`;
const uri = y.proxy_url.startsWith("http") ? y.proxy_url : `https://example.org${y.proxy_url}`;
const url = new URL(uri);
if (endpoint) {
@ -310,10 +288,7 @@ router.post(
relations: ["recipients", "recipients.user"],
});
if (!channel.isWritable()) {
throw new HTTPError(
`Cannot send messages to channel of type ${channel.type}`,
400,
);
throw new HTTPError(`Cannot send messages to channel of type ${channel.type}`, 400);
}
if (body.nonce) {
@ -335,12 +310,7 @@ router.post(
const count = await Message.count({
where: {
channel_id,
timestamp: MoreThan(
new Date(
Date.now() -
limits.absoluteRate.sendMessage.window,
),
),
timestamp: MoreThan(new Date(Date.now() - limits.absoluteRate.sendMessage.window)),
},
});
@ -357,13 +327,8 @@ router.post(
const files = (req.files as Express.Multer.File[]) ?? [];
for (const currFile of files) {
try {
const file = await uploadFile(
`/attachments/${channel.id}`,
currFile,
);
attachments.push(
Attachment.create({ ...file, proxy_url: file.url }),
);
const file = await uploadFile(`/attachments/${channel.id}`, currFile);
attachments.push(Attachment.create({ ...file, proxy_url: file.url }));
} catch (error) {
return res.status(400).json({ message: error?.toString() });
}
@ -400,9 +365,7 @@ router.post(
recipient.save(),
emitEvent({
event: "CHANNEL_CREATE",
data: channel_dto.excludedRecipients([
recipient.user_id,
]),
data: channel_dto.excludedRecipients([recipient.user_id]),
user_id: recipient.user_id,
}),
]);
@ -423,16 +386,13 @@ router.post(
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
//@ts-ignore
message.member.roles = message.member.roles
.filter((x) => x.id != x.guild_id)
.map((x) => x.id);
message.member.roles = message.member.roles.filter((x) => x.id != x.guild_id).map((x) => x.id);
}
let read_state = await ReadState.findOne({
where: { user_id: req.user_id, channel_id },
});
if (!read_state)
read_state = ReadState.create({ user_id: req.user_id, channel_id });
if (!read_state) read_state = ReadState.create({ user_id: req.user_id, channel_id });
read_state.last_message_id = message.id;
await Promise.all([
@ -443,19 +403,12 @@ router.post(
channel_id: channel_id,
data: message,
} as MessageCreateEvent),
message.guild_id
? Member.update(
{ id: req.user_id, guild_id: message.guild_id },
{ last_message_id: message.id },
)
: null,
message.guild_id ? Member.update({ id: req.user_id, guild_id: message.guild_id }, { last_message_id: message.id }) : null,
channel.save(),
]);
// no await as it shouldnt block the message send function and silently catch error
postHandleMessage(message).catch((e) =>
console.error("[Message] post-message handler failed", e),
);
postHandleMessage(message).catch((e) => console.error("[Message] post-message handler failed", e));
return res.json(
message.withSignedAttachments(

View File

@ -227,6 +227,7 @@ export async function handleMessage(opts: MessageOptions): Promise<Message> {
where: {
id: opts.message_reference.message_id,
},
relations: ["author", "mentions", "mention_roles", "mention_channels"],
});
if (message.referenced_message.channel_id !== opts.message_reference.channel_id) throw new HTTPError("Referenced message not found in the specified channel", 404);