mirror of
https://github.com/spacebarchat/server.git
synced 2024-11-07 03:12:39 +01:00
commit
924f3cc39a
@ -462,7 +462,11 @@
|
||||
"payload_json": {
|
||||
"type": "string"
|
||||
},
|
||||
"file": {}
|
||||
"file": {},
|
||||
"attachments": {
|
||||
"type": "array",
|
||||
"items": {}
|
||||
}
|
||||
},
|
||||
"additionalProperties": false,
|
||||
"definitions": {
|
||||
|
@ -3,6 +3,7 @@ import { Router, Response, Request } from "express";
|
||||
import { route } from "@fosscord/api";
|
||||
import { handleMessage, postHandleMessage } from "@fosscord/api";
|
||||
import { MessageCreateSchema } from "../index";
|
||||
import { deleteMessageAttachments } from "@fosscord/api/util/Attachments";
|
||||
|
||||
const router = Router();
|
||||
// TODO: message content/embed string length limit
|
||||
@ -11,7 +12,7 @@ router.patch("/", route({ body: "MessageCreateSchema", permission: "SEND_MESSAGE
|
||||
const { message_id, channel_id } = req.params;
|
||||
var body = req.body as MessageCreateSchema;
|
||||
|
||||
const message = await Message.findOneOrFail({ id: message_id, channel_id });
|
||||
const message = await Message.findOneOrFail({ where: { id: message_id, channel_id }, relations: ["attachments"] });
|
||||
|
||||
const permissions = await getPermission(req.user_id, undefined, channel_id);
|
||||
|
||||
@ -33,6 +34,7 @@ router.patch("/", route({ body: "MessageCreateSchema", permission: "SEND_MESSAGE
|
||||
});
|
||||
|
||||
await Promise.all([
|
||||
await deleteMessageAttachments(message_id, new_message.attachments), //This delete all the attachments not in the array
|
||||
new_message!.save(),
|
||||
await emitEvent({
|
||||
event: "MESSAGE_UPDATE",
|
||||
@ -46,8 +48,6 @@ router.patch("/", route({ body: "MessageCreateSchema", permission: "SEND_MESSAGE
|
||||
return res.json(message);
|
||||
});
|
||||
|
||||
// TODO: delete attachments in message
|
||||
|
||||
// permission check only if deletes messagr from other user
|
||||
router.delete("/", route({}), async (req: Request, res: Response) => {
|
||||
const { message_id, channel_id } = req.params;
|
||||
@ -60,6 +60,7 @@ router.delete("/", route({}), async (req: Request, res: Response) => {
|
||||
permission.hasThrow("MANAGE_MESSAGES");
|
||||
}
|
||||
|
||||
await deleteMessageAttachments(message_id);
|
||||
await Message.delete({ id: message_id });
|
||||
|
||||
await emitEvent({
|
||||
|
@ -51,6 +51,7 @@ export interface MessageCreateSchema {
|
||||
};
|
||||
payload_json?: string;
|
||||
file?: any;
|
||||
attachments?: any[]; //TODO we should create an interface for attachments
|
||||
}
|
||||
|
||||
// https://discord.com/developers/docs/resources/channel#create-message
|
||||
|
12
api/src/util/Attachments.ts
Normal file
12
api/src/util/Attachments.ts
Normal file
@ -0,0 +1,12 @@
|
||||
import { Attachment } from "@fosscord/util";
|
||||
import { deleteFile } from "@fosscord/api";
|
||||
import { URL } from "url";
|
||||
|
||||
export async function deleteMessageAttachments(messageId: string, keep?: Attachment[]) {
|
||||
let attachments = await Attachment.find({ message_id: messageId });
|
||||
if (keep)
|
||||
attachments = attachments.filter(x => !keep.map(k => k.id).includes(x.id));
|
||||
await Promise.all(attachments.map(a => a.remove()));
|
||||
|
||||
attachments.forEach(a => deleteFile((new URL(a.url)).pathname)); //We don't need to await since this is done on the cdn
|
||||
}
|
@ -38,3 +38,16 @@ export async function handleFile(path: string, body?: string): Promise<string |
|
||||
throw new HTTPError("Invalid " + path);
|
||||
}
|
||||
}
|
||||
|
||||
export async function deleteFile(path: string) {
|
||||
const response = await fetch(`${Config.get().cdn.endpoint || "http://localhost:3003"}${path}`, {
|
||||
headers: {
|
||||
signature: Config.get().security.requestSignature,
|
||||
},
|
||||
method: "DELETE",
|
||||
});
|
||||
const result = await response.json();
|
||||
|
||||
if (response.status !== 200) throw result;
|
||||
return result;
|
||||
}
|
||||
|
@ -37,6 +37,7 @@ export class FileStorage implements Storage {
|
||||
}
|
||||
|
||||
async delete(path: string) {
|
||||
//TODO we should delete the parent directory if empty
|
||||
fs.unlinkSync(getPath(path));
|
||||
}
|
||||
}
|
||||
|
@ -128,7 +128,7 @@ export class Message extends BaseClass {
|
||||
sticker_items?: Sticker[];
|
||||
|
||||
@JoinColumn({ name: "attachment_ids" })
|
||||
@OneToMany(() => Attachment, (attachment: Attachment) => attachment.message)
|
||||
@OneToMany(() => Attachment, (attachment: Attachment) => attachment.message, { cascade: true })
|
||||
attachments?: Attachment[];
|
||||
|
||||
@Column({ type: "simple-json" })
|
||||
|
Loading…
Reference in New Issue
Block a user