Merge pull request #382 from fosscord/auto-delete-relations
Auto delete relations
This commit is contained in:
commit
fe34c5da87
@ -1,6 +1,15 @@
|
|||||||
import { Channel, ChannelDeleteEvent, ChannelPermissionOverwriteType, ChannelType, ChannelUpdateEvent, emitEvent, Recipient } from "@fosscord/util";
|
import {
|
||||||
|
Channel,
|
||||||
|
ChannelDeleteEvent,
|
||||||
|
ChannelPermissionOverwriteType,
|
||||||
|
ChannelType,
|
||||||
|
ChannelUpdateEvent,
|
||||||
|
emitEvent,
|
||||||
|
Recipient,
|
||||||
|
handleFile
|
||||||
|
} from "@fosscord/util";
|
||||||
import { Request, Response, Router } from "express";
|
import { Request, Response, Router } from "express";
|
||||||
import { handleFile, route } from "@fosscord/api";
|
import { route } from "@fosscord/api";
|
||||||
|
|
||||||
const router: Router = Router();
|
const router: Router = Router();
|
||||||
// TODO: delete channel
|
// TODO: delete channel
|
||||||
@ -20,15 +29,14 @@ router.delete("/", route({ permission: "MANAGE_CHANNELS" }), async (req: Request
|
|||||||
const channel = await Channel.findOneOrFail({ where: { id: channel_id }, relations: ["recipients"] });
|
const channel = await Channel.findOneOrFail({ where: { id: channel_id }, relations: ["recipients"] });
|
||||||
|
|
||||||
if (channel.type === ChannelType.DM) {
|
if (channel.type === ChannelType.DM) {
|
||||||
const recipient = await Recipient.findOneOrFail({ where: { channel_id: channel_id, user_id: req.user_id } })
|
const recipient = await Recipient.findOneOrFail({ where: { channel_id: channel_id, user_id: req.user_id } });
|
||||||
recipient.closed = true
|
recipient.closed = true;
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
recipient.save(),
|
recipient.save(),
|
||||||
emitEvent({ event: "CHANNEL_DELETE", data: channel, user_id: req.user_id } as ChannelDeleteEvent)
|
emitEvent({ event: "CHANNEL_DELETE", data: channel, user_id: req.user_id } as ChannelDeleteEvent)
|
||||||
]);
|
]);
|
||||||
|
|
||||||
} else if (channel.type === ChannelType.GROUP_DM) {
|
} else if (channel.type === ChannelType.GROUP_DM) {
|
||||||
await Channel.removeRecipientFromChannel(channel, req.user_id)
|
await Channel.removeRecipientFromChannel(channel, req.user_id);
|
||||||
} else {
|
} else {
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
Channel.delete({ id: channel_id }),
|
Channel.delete({ id: channel_id }),
|
||||||
|
@ -3,7 +3,6 @@ import { Router, Response, Request } from "express";
|
|||||||
import { route } from "@fosscord/api";
|
import { route } from "@fosscord/api";
|
||||||
import { handleMessage, postHandleMessage } from "@fosscord/api";
|
import { handleMessage, postHandleMessage } from "@fosscord/api";
|
||||||
import { MessageCreateSchema } from "../index";
|
import { MessageCreateSchema } from "../index";
|
||||||
import { deleteMessageAttachments } from "@fosscord/api/util/Attachments";
|
|
||||||
|
|
||||||
const router = Router();
|
const router = Router();
|
||||||
// TODO: message content/embed string length limit
|
// TODO: message content/embed string length limit
|
||||||
@ -34,7 +33,6 @@ router.patch("/", route({ body: "MessageCreateSchema", permission: "SEND_MESSAGE
|
|||||||
});
|
});
|
||||||
|
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
await deleteMessageAttachments(message_id, new_message.attachments), //This delete all the attachments not in the array
|
|
||||||
new_message!.save(),
|
new_message!.save(),
|
||||||
await emitEvent({
|
await emitEvent({
|
||||||
event: "MESSAGE_UPDATE",
|
event: "MESSAGE_UPDATE",
|
||||||
@ -60,7 +58,6 @@ router.delete("/", route({}), async (req: Request, res: Response) => {
|
|||||||
permission.hasThrow("MANAGE_MESSAGES");
|
permission.hasThrow("MANAGE_MESSAGES");
|
||||||
}
|
}
|
||||||
|
|
||||||
await deleteMessageAttachments(message_id);
|
|
||||||
await Message.delete({ id: message_id });
|
await Message.delete({ id: message_id });
|
||||||
|
|
||||||
await emitEvent({
|
await emitEvent({
|
||||||
|
@ -13,15 +13,8 @@ router.post("/", route({}), async (req: Request, res: Response) => {
|
|||||||
const guild = await Guild.findOneOrFail({ where: { id: guild_id }, select: ["owner_id"] });
|
const guild = await Guild.findOneOrFail({ where: { id: guild_id }, select: ["owner_id"] });
|
||||||
if (guild.owner_id !== req.user_id) throw new HTTPError("You are not the owner of this guild", 401);
|
if (guild.owner_id !== req.user_id) throw new HTTPError("You are not the owner of this guild", 401);
|
||||||
|
|
||||||
// do not put everything into promise all, because of "QueryFailedError: SQLITE_CONSTRAINT: FOREIGN KEY constraint failed"
|
|
||||||
|
|
||||||
await Message.delete({ guild_id }); // messages must be deleted before channel
|
|
||||||
|
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
Role.delete({ guild_id }),
|
Guild.delete({ id: guild_id }), // this will also delete all guild related data
|
||||||
Channel.delete({ guild_id }),
|
|
||||||
Emoji.delete({ guild_id }),
|
|
||||||
Member.delete({ guild_id }),
|
|
||||||
emitEvent({
|
emitEvent({
|
||||||
event: "GUILD_DELETE",
|
event: "GUILD_DELETE",
|
||||||
data: {
|
data: {
|
||||||
@ -31,9 +24,6 @@ router.post("/", route({}), async (req: Request, res: Response) => {
|
|||||||
} as GuildDeleteEvent)
|
} as GuildDeleteEvent)
|
||||||
]);
|
]);
|
||||||
|
|
||||||
await Invite.delete({ guild_id }); // invite must be deleted after channel
|
|
||||||
await Guild.delete({ id: guild_id }); // guild must be deleted after everything else
|
|
||||||
|
|
||||||
return res.sendStatus(204);
|
return res.sendStatus(204);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
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
|
|
||||||
}
|
|
@ -1,5 +1,4 @@
|
|||||||
export * from "./Base64";
|
export * from "./Base64";
|
||||||
export * from "./cdn";
|
|
||||||
export * from "./FieldError";
|
export * from "./FieldError";
|
||||||
export * from "./ipAddress";
|
export * from "./ipAddress";
|
||||||
export * from "./Message";
|
export * from "./Message";
|
||||||
|
98
util/package-lock.json
generated
98
util/package-lock.json
generated
@ -226,19 +226,19 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/helper-module-transforms": {
|
"node_modules/@babel/helper-module-transforms": {
|
||||||
"version": "7.15.4",
|
"version": "7.15.7",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.7.tgz",
|
||||||
"integrity": "sha512-9fHHSGE9zTC++KuXLZcB5FKgvlV83Ox+NLUmQTawovwlJ85+QMhk1CnVk406CQVj97LaWod6KVjl2Sfgw9Aktw==",
|
"integrity": "sha512-ZNqjjQG/AuFfekFTY+7nY4RgBSklgTu970c7Rj3m/JOhIu5KPBUuTA9AY6zaKcUvk4g6EbDXdBnhi35FAssdSw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/helper-module-imports": "^7.15.4",
|
"@babel/helper-module-imports": "^7.15.4",
|
||||||
"@babel/helper-replace-supers": "^7.15.4",
|
"@babel/helper-replace-supers": "^7.15.4",
|
||||||
"@babel/helper-simple-access": "^7.15.4",
|
"@babel/helper-simple-access": "^7.15.4",
|
||||||
"@babel/helper-split-export-declaration": "^7.15.4",
|
"@babel/helper-split-export-declaration": "^7.15.4",
|
||||||
"@babel/helper-validator-identifier": "^7.14.9",
|
"@babel/helper-validator-identifier": "^7.15.7",
|
||||||
"@babel/template": "^7.15.4",
|
"@babel/template": "^7.15.4",
|
||||||
"@babel/traverse": "^7.15.4",
|
"@babel/traverse": "^7.15.4",
|
||||||
"@babel/types": "^7.15.4"
|
"@babel/types": "^7.15.6"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
@ -305,9 +305,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/helper-validator-identifier": {
|
"node_modules/@babel/helper-validator-identifier": {
|
||||||
"version": "7.14.9",
|
"version": "7.15.7",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz",
|
||||||
"integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==",
|
"integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
@ -422,9 +422,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/parser": {
|
"node_modules/@babel/parser": {
|
||||||
"version": "7.15.6",
|
"version": "7.15.7",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.6.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.7.tgz",
|
||||||
"integrity": "sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q==",
|
"integrity": "sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"bin": {
|
"bin": {
|
||||||
"parser": "bin/babel-parser.js"
|
"parser": "bin/babel-parser.js"
|
||||||
@ -1204,9 +1204,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@types/node": {
|
"node_modules/@types/node": {
|
||||||
"version": "14.17.16",
|
"version": "14.17.17",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.16.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.17.tgz",
|
||||||
"integrity": "sha512-WiFf2izl01P1CpeY8WqFAeKWwByMueBEkND38EcN8N68qb0aDG3oIS1P5MhAX5kUdr469qRyqsY/MjanLjsFbQ=="
|
"integrity": "sha512-niAjcewgEYvSPCZm3OaM9y6YQrL2SEPH9PymtE6fuZAvFiP6ereCcvApGl2jKTq7copTIguX3PBvfP08LN4LvQ=="
|
||||||
},
|
},
|
||||||
"node_modules/@types/node-fetch": {
|
"node_modules/@types/node-fetch": {
|
||||||
"version": "2.5.12",
|
"version": "2.5.12",
|
||||||
@ -1941,9 +1941,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/caniuse-lite": {
|
"node_modules/caniuse-lite": {
|
||||||
"version": "1.0.30001257",
|
"version": "1.0.30001258",
|
||||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001257.tgz",
|
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001258.tgz",
|
||||||
"integrity": "sha512-JN49KplOgHSXpIsVSF+LUyhD8PUp6xPpAXeRrrcBh4KBeP7W864jHn6RvzJgDlrReyeVjMFJL3PLpPvKIxlIHA==",
|
"integrity": "sha512-RBByOG6xWXUp0CR2/WU2amXz3stjKpSl5J1xU49F1n2OxD//uBZO4wCKUiG+QMGf7CHGfDDcqoKriomoGVxTeA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": {
|
"funding": {
|
||||||
"type": "opencollective",
|
"type": "opencollective",
|
||||||
@ -2498,9 +2498,9 @@
|
|||||||
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
|
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
|
||||||
},
|
},
|
||||||
"node_modules/electron-to-chromium": {
|
"node_modules/electron-to-chromium": {
|
||||||
"version": "1.3.840",
|
"version": "1.3.843",
|
||||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.840.tgz",
|
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.843.tgz",
|
||||||
"integrity": "sha512-yRoUmTLDJnkIJx23xLY7GbSvnmDCq++NSuxHDQ0jiyDJ9YZBUGJcrdUqm+ZwZFzMbCciVzfem2N2AWiHJcWlbw==",
|
"integrity": "sha512-OWEwAbzaVd1Lk9MohVw8LxMXFlnYd9oYTYxfX8KS++kLLjDfbovLOcEEXwRhG612dqGQ6+44SZvim0GXuBRiKg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/emittery": {
|
"node_modules/emittery": {
|
||||||
@ -6249,13 +6249,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/stack-utils": {
|
"node_modules/stack-utils": {
|
||||||
"version": "2.0.4",
|
"version": "2.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz",
|
||||||
"integrity": "sha512-ERg+H//lSSYlZhBIUu+wJnqg30AbyBbpZlIhcshpn7BNzpoRODZgfyr9J+8ERf3ooC6af3u7Lcl01nleau7MrA==",
|
"integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"escape-string-regexp": "^2.0.0",
|
"escape-string-regexp": "^2.0.0"
|
||||||
"source-map-support": "^0.5.20"
|
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=10"
|
"node": ">=10"
|
||||||
@ -7535,19 +7534,19 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@babel/helper-module-transforms": {
|
"@babel/helper-module-transforms": {
|
||||||
"version": "7.15.4",
|
"version": "7.15.7",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.7.tgz",
|
||||||
"integrity": "sha512-9fHHSGE9zTC++KuXLZcB5FKgvlV83Ox+NLUmQTawovwlJ85+QMhk1CnVk406CQVj97LaWod6KVjl2Sfgw9Aktw==",
|
"integrity": "sha512-ZNqjjQG/AuFfekFTY+7nY4RgBSklgTu970c7Rj3m/JOhIu5KPBUuTA9AY6zaKcUvk4g6EbDXdBnhi35FAssdSw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@babel/helper-module-imports": "^7.15.4",
|
"@babel/helper-module-imports": "^7.15.4",
|
||||||
"@babel/helper-replace-supers": "^7.15.4",
|
"@babel/helper-replace-supers": "^7.15.4",
|
||||||
"@babel/helper-simple-access": "^7.15.4",
|
"@babel/helper-simple-access": "^7.15.4",
|
||||||
"@babel/helper-split-export-declaration": "^7.15.4",
|
"@babel/helper-split-export-declaration": "^7.15.4",
|
||||||
"@babel/helper-validator-identifier": "^7.14.9",
|
"@babel/helper-validator-identifier": "^7.15.7",
|
||||||
"@babel/template": "^7.15.4",
|
"@babel/template": "^7.15.4",
|
||||||
"@babel/traverse": "^7.15.4",
|
"@babel/traverse": "^7.15.4",
|
||||||
"@babel/types": "^7.15.4"
|
"@babel/types": "^7.15.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@babel/helper-optimise-call-expression": {
|
"@babel/helper-optimise-call-expression": {
|
||||||
@ -7596,9 +7595,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@babel/helper-validator-identifier": {
|
"@babel/helper-validator-identifier": {
|
||||||
"version": "7.14.9",
|
"version": "7.15.7",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz",
|
||||||
"integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==",
|
"integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@babel/helper-validator-option": {
|
"@babel/helper-validator-option": {
|
||||||
@ -7688,9 +7687,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@babel/parser": {
|
"@babel/parser": {
|
||||||
"version": "7.15.6",
|
"version": "7.15.7",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.6.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.7.tgz",
|
||||||
"integrity": "sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q==",
|
"integrity": "sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@babel/plugin-syntax-async-generators": {
|
"@babel/plugin-syntax-async-generators": {
|
||||||
@ -8336,9 +8335,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@types/node": {
|
"@types/node": {
|
||||||
"version": "14.17.16",
|
"version": "14.17.17",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.16.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.17.tgz",
|
||||||
"integrity": "sha512-WiFf2izl01P1CpeY8WqFAeKWwByMueBEkND38EcN8N68qb0aDG3oIS1P5MhAX5kUdr469qRyqsY/MjanLjsFbQ=="
|
"integrity": "sha512-niAjcewgEYvSPCZm3OaM9y6YQrL2SEPH9PymtE6fuZAvFiP6ereCcvApGl2jKTq7copTIguX3PBvfP08LN4LvQ=="
|
||||||
},
|
},
|
||||||
"@types/node-fetch": {
|
"@types/node-fetch": {
|
||||||
"version": "2.5.12",
|
"version": "2.5.12",
|
||||||
@ -8945,9 +8944,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"caniuse-lite": {
|
"caniuse-lite": {
|
||||||
"version": "1.0.30001257",
|
"version": "1.0.30001258",
|
||||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001257.tgz",
|
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001258.tgz",
|
||||||
"integrity": "sha512-JN49KplOgHSXpIsVSF+LUyhD8PUp6xPpAXeRrrcBh4KBeP7W864jHn6RvzJgDlrReyeVjMFJL3PLpPvKIxlIHA==",
|
"integrity": "sha512-RBByOG6xWXUp0CR2/WU2amXz3stjKpSl5J1xU49F1n2OxD//uBZO4wCKUiG+QMGf7CHGfDDcqoKriomoGVxTeA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"caseless": {
|
"caseless": {
|
||||||
@ -9405,9 +9404,9 @@
|
|||||||
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
|
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
|
||||||
},
|
},
|
||||||
"electron-to-chromium": {
|
"electron-to-chromium": {
|
||||||
"version": "1.3.840",
|
"version": "1.3.843",
|
||||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.840.tgz",
|
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.843.tgz",
|
||||||
"integrity": "sha512-yRoUmTLDJnkIJx23xLY7GbSvnmDCq++NSuxHDQ0jiyDJ9YZBUGJcrdUqm+ZwZFzMbCciVzfem2N2AWiHJcWlbw==",
|
"integrity": "sha512-OWEwAbzaVd1Lk9MohVw8LxMXFlnYd9oYTYxfX8KS++kLLjDfbovLOcEEXwRhG612dqGQ6+44SZvim0GXuBRiKg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"emittery": {
|
"emittery": {
|
||||||
@ -12300,13 +12299,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"stack-utils": {
|
"stack-utils": {
|
||||||
"version": "2.0.4",
|
"version": "2.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz",
|
||||||
"integrity": "sha512-ERg+H//lSSYlZhBIUu+wJnqg30AbyBbpZlIhcshpn7BNzpoRODZgfyr9J+8ERf3ooC6af3u7Lcl01nleau7MrA==",
|
"integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"escape-string-regexp": "^2.0.0",
|
"escape-string-regexp": "^2.0.0"
|
||||||
"source-map-support": "^0.5.20"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"statuses": {
|
"statuses": {
|
||||||
|
@ -41,7 +41,9 @@ export class Application extends BaseClass {
|
|||||||
verify_key: string;
|
verify_key: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "team_id" })
|
@JoinColumn({ name: "team_id" })
|
||||||
@ManyToOne(() => Team)
|
@ManyToOne(() => Team, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
team?: Team;
|
team?: Team;
|
||||||
|
|
||||||
@JoinColumn({ name: "guild_id" })
|
@JoinColumn({ name: "guild_id" })
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
import { Column, Entity, JoinColumn, ManyToOne, RelationId } from "typeorm";
|
import { BeforeRemove, Column, Entity, JoinColumn, ManyToOne, RelationId } from "typeorm";
|
||||||
|
import { URL } from "url";
|
||||||
|
import { deleteFile } from "../util/cdn";
|
||||||
import { BaseClass } from "./BaseClass";
|
import { BaseClass } from "./BaseClass";
|
||||||
|
|
||||||
@Entity("attachments")
|
@Entity("attachments")
|
||||||
@ -29,6 +31,13 @@ export class Attachment extends BaseClass {
|
|||||||
message_id: string;
|
message_id: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "message_id" })
|
@JoinColumn({ name: "message_id" })
|
||||||
@ManyToOne(() => require("./Message").Message, (message: import("./Message").Message) => message.attachments)
|
@ManyToOne(() => require("./Message").Message, (message: import("./Message").Message) => message.attachments, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
message: import("./Message").Message;
|
message: import("./Message").Message;
|
||||||
|
|
||||||
|
@BeforeRemove()
|
||||||
|
onDelete() {
|
||||||
|
return deleteFile(new URL(this.url).pathname);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,9 @@ export class Ban extends BaseClass {
|
|||||||
user_id: string;
|
user_id: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "user_id" })
|
@JoinColumn({ name: "user_id" })
|
||||||
@ManyToOne(() => User)
|
@ManyToOne(() => User, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
user: User;
|
user: User;
|
||||||
|
|
||||||
@Column({ nullable: true })
|
@Column({ nullable: true })
|
||||||
@ -18,7 +20,9 @@ export class Ban extends BaseClass {
|
|||||||
guild_id: string;
|
guild_id: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "guild_id" })
|
@JoinColumn({ name: "guild_id" })
|
||||||
@ManyToOne(() => Guild)
|
@ManyToOne(() => Guild, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
guild: Guild;
|
guild: Guild;
|
||||||
|
|
||||||
@Column({ nullable: true })
|
@Column({ nullable: true })
|
||||||
|
@ -1,5 +1,15 @@
|
|||||||
import "reflect-metadata";
|
import "reflect-metadata";
|
||||||
import { BaseEntity, BeforeInsert, BeforeUpdate, EntityMetadata, FindConditions, PrimaryColumn } from "typeorm";
|
import {
|
||||||
|
BaseEntity,
|
||||||
|
BeforeInsert,
|
||||||
|
BeforeUpdate,
|
||||||
|
EntityMetadata,
|
||||||
|
FindConditions,
|
||||||
|
getConnection,
|
||||||
|
getManager,
|
||||||
|
PrimaryColumn,
|
||||||
|
RemoveOptions,
|
||||||
|
} from "typeorm";
|
||||||
import { Snowflake } from "../util/Snowflake";
|
import { Snowflake } from "../util/Snowflake";
|
||||||
import "missing-native-js-functions";
|
import "missing-native-js-functions";
|
||||||
|
|
||||||
@ -69,6 +79,42 @@ export class BaseClassWithoutId extends BaseEntity {
|
|||||||
const repository = this.getRepository();
|
const repository = this.getRepository();
|
||||||
return repository.decrement(conditions, propertyPath, value);
|
return repository.decrement(conditions, propertyPath, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// static async delete<T>(criteria: FindConditions<T>, options?: RemoveOptions) {
|
||||||
|
// if (!criteria) throw new Error("You need to specify delete criteria");
|
||||||
|
|
||||||
|
// const repository = this.getRepository();
|
||||||
|
// const promises = repository.metadata.relations.map(async (x) => {
|
||||||
|
// if (x.orphanedRowAction !== "delete") return;
|
||||||
|
|
||||||
|
// const foreignKey =
|
||||||
|
// x.foreignKeys.find((key) => key.entityMetadata === repository.metadata) ||
|
||||||
|
// x.inverseRelation?.foreignKeys[0]; // find foreign key for this entity
|
||||||
|
// if (!foreignKey) {
|
||||||
|
// throw new Error(
|
||||||
|
// `Foreign key not found for entity ${repository.metadata.name} in relation ${x.propertyName}`
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
// const id = (criteria as any)[foreignKey.referencedColumnNames[0]];
|
||||||
|
// if (!id) throw new Error("id missing in criteria options " + foreignKey.referencedColumnNames);
|
||||||
|
|
||||||
|
// if (x.relationType === "many-to-many") {
|
||||||
|
// return getConnection()
|
||||||
|
// .createQueryBuilder()
|
||||||
|
// .relation(this, x.propertyName)
|
||||||
|
// .of(id)
|
||||||
|
// .remove({ [foreignKey.columnNames[0]]: id });
|
||||||
|
// } else if (
|
||||||
|
// x.relationType === "one-to-one" ||
|
||||||
|
// x.relationType === "many-to-one" ||
|
||||||
|
// x.relationType === "one-to-many"
|
||||||
|
// ) {
|
||||||
|
// return (x.inverseEntityMetadata.target as any).delete({ [foreignKey.columnNames[0]]: id });
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
// await Promise.all(promises);
|
||||||
|
// return super.delete(criteria, options);
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
export class BaseClass extends BaseClassWithoutId {
|
export class BaseClass extends BaseClassWithoutId {
|
||||||
|
@ -6,8 +6,12 @@ import { HTTPError } from "lambert-server";
|
|||||||
import { containsAll, emitEvent, getPermission, Snowflake, trimSpecial } from "../util";
|
import { containsAll, emitEvent, getPermission, Snowflake, trimSpecial } from "../util";
|
||||||
import { ChannelCreateEvent, ChannelRecipientRemoveEvent } from "../interfaces";
|
import { ChannelCreateEvent, ChannelRecipientRemoveEvent } from "../interfaces";
|
||||||
import { Recipient } from "./Recipient";
|
import { Recipient } from "./Recipient";
|
||||||
import { DmChannelDTO } from "../dtos";
|
|
||||||
import { Message } from "./Message";
|
import { Message } from "./Message";
|
||||||
|
import { ReadState } from "./ReadState";
|
||||||
|
import { Invite } from "./Invite";
|
||||||
|
import { VoiceState } from "./VoiceState";
|
||||||
|
import { Webhook } from "./Webhook";
|
||||||
|
import { DmChannelDTO } from "../dtos";
|
||||||
|
|
||||||
export enum ChannelType {
|
export enum ChannelType {
|
||||||
GUILD_TEXT = 0, // a text channel within a server
|
GUILD_TEXT = 0, // a text channel within a server
|
||||||
@ -32,13 +36,16 @@ export class Channel extends BaseClass {
|
|||||||
@Column({ nullable: true })
|
@Column({ nullable: true })
|
||||||
name?: string;
|
name?: string;
|
||||||
|
|
||||||
@Column({ type: 'text', nullable: true })
|
@Column({ type: "text", nullable: true })
|
||||||
icon?: string | null;
|
icon?: string | null;
|
||||||
|
|
||||||
@Column({ type: "simple-enum", enum: ChannelType })
|
@Column({ type: "simple-enum", enum: ChannelType })
|
||||||
type: ChannelType;
|
type: ChannelType;
|
||||||
|
|
||||||
@OneToMany(() => Recipient, (recipient: Recipient) => recipient.channel, { cascade: true })
|
@OneToMany(() => Recipient, (recipient: Recipient) => recipient.channel, {
|
||||||
|
cascade: true,
|
||||||
|
orphanedRowAction: "delete",
|
||||||
|
})
|
||||||
recipients?: Recipient[];
|
recipients?: Recipient[];
|
||||||
|
|
||||||
@Column({ nullable: true })
|
@Column({ nullable: true })
|
||||||
@ -49,7 +56,9 @@ export class Channel extends BaseClass {
|
|||||||
guild_id?: string;
|
guild_id?: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "guild_id" })
|
@JoinColumn({ name: "guild_id" })
|
||||||
@ManyToOne(() => Guild)
|
@ManyToOne(() => Guild, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
guild: Guild;
|
guild: Guild;
|
||||||
|
|
||||||
@Column({ nullable: true })
|
@Column({ nullable: true })
|
||||||
@ -99,6 +108,37 @@ export class Channel extends BaseClass {
|
|||||||
@Column({ nullable: true })
|
@Column({ nullable: true })
|
||||||
topic?: string;
|
topic?: string;
|
||||||
|
|
||||||
|
@OneToMany(() => Invite, (invite: Invite) => invite.channel, {
|
||||||
|
cascade: true,
|
||||||
|
orphanedRowAction: "delete",
|
||||||
|
})
|
||||||
|
invites?: Invite[];
|
||||||
|
|
||||||
|
@OneToMany(() => Message, (message: Message) => message.channel, {
|
||||||
|
cascade: true,
|
||||||
|
orphanedRowAction: "delete",
|
||||||
|
})
|
||||||
|
messages?: Message[];
|
||||||
|
|
||||||
|
@OneToMany(() => VoiceState, (voice_state: VoiceState) => voice_state.channel, {
|
||||||
|
cascade: true,
|
||||||
|
orphanedRowAction: "delete",
|
||||||
|
})
|
||||||
|
voice_states?: VoiceState[];
|
||||||
|
|
||||||
|
@OneToMany(() => ReadState, (read_state: ReadState) => read_state.channel, {
|
||||||
|
cascade: true,
|
||||||
|
orphanedRowAction: "delete",
|
||||||
|
})
|
||||||
|
read_states?: ReadState[];
|
||||||
|
|
||||||
|
@OneToMany(() => Webhook, (webhook: Webhook) => webhook.channel, {
|
||||||
|
cascade: true,
|
||||||
|
orphanedRowAction: "delete",
|
||||||
|
})
|
||||||
|
webhooks?: Webhook[];
|
||||||
|
|
||||||
|
// TODO: DM channel
|
||||||
static async createChannel(
|
static async createChannel(
|
||||||
channel: Partial<Channel>,
|
channel: Partial<Channel>,
|
||||||
user_id: string = "0",
|
user_id: string = "0",
|
||||||
@ -151,10 +191,10 @@ export class Channel extends BaseClass {
|
|||||||
new Channel(channel).save(),
|
new Channel(channel).save(),
|
||||||
!opts?.skipEventEmit
|
!opts?.skipEventEmit
|
||||||
? emitEvent({
|
? emitEvent({
|
||||||
event: "CHANNEL_CREATE",
|
event: "CHANNEL_CREATE",
|
||||||
data: channel,
|
data: channel,
|
||||||
guild_id: channel.guild_id,
|
guild_id: channel.guild_id,
|
||||||
} as ChannelCreateEvent)
|
} as ChannelCreateEvent)
|
||||||
: Promise.resolve(),
|
: Promise.resolve(),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
@ -174,17 +214,20 @@ export class Channel extends BaseClass {
|
|||||||
|
|
||||||
let channel = null;
|
let channel = null;
|
||||||
|
|
||||||
const channelRecipients = [...recipients, creator_user_id]
|
const channelRecipients = [...recipients, creator_user_id];
|
||||||
|
|
||||||
const userRecipients = await Recipient.find({ where: { user_id: creator_user_id }, relations: ["channel", "channel.recipients"] })
|
const userRecipients = await Recipient.find({
|
||||||
|
where: { user_id: creator_user_id },
|
||||||
|
relations: ["channel", "channel.recipients"],
|
||||||
|
});
|
||||||
|
|
||||||
for (let ur of userRecipients) {
|
for (let ur of userRecipients) {
|
||||||
let re = ur.channel.recipients!.map(r => r.user_id)
|
let re = ur.channel.recipients!.map((r) => r.user_id);
|
||||||
if (re.length === channelRecipients.length) {
|
if (re.length === channelRecipients.length) {
|
||||||
if (containsAll(re, channelRecipients)) {
|
if (containsAll(re, channelRecipients)) {
|
||||||
if (channel == null) {
|
if (channel == null) {
|
||||||
channel = ur.channel
|
channel = ur.channel;
|
||||||
await ur.assign({ closed: false }).save()
|
await ur.assign({ closed: false }).save();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -196,80 +239,83 @@ export class Channel extends BaseClass {
|
|||||||
channel = await new Channel({
|
channel = await new Channel({
|
||||||
name,
|
name,
|
||||||
type,
|
type,
|
||||||
owner_id: (type === ChannelType.DM ? undefined : creator_user_id),
|
owner_id: type === ChannelType.DM ? undefined : creator_user_id,
|
||||||
created_at: new Date(),
|
created_at: new Date(),
|
||||||
last_message_id: null,
|
last_message_id: null,
|
||||||
recipients: channelRecipients.map((x) => new Recipient({ user_id: x, closed: !(type === ChannelType.GROUP_DM || x === creator_user_id) })),
|
recipients: channelRecipients.map(
|
||||||
|
(x) =>
|
||||||
|
new Recipient({ user_id: x, closed: !(type === ChannelType.GROUP_DM || x === creator_user_id) })
|
||||||
|
),
|
||||||
}).save();
|
}).save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const channel_dto = await DmChannelDTO.from(channel);
|
||||||
const channel_dto = await DmChannelDTO.from(channel)
|
|
||||||
|
|
||||||
if (type === ChannelType.GROUP_DM) {
|
if (type === ChannelType.GROUP_DM) {
|
||||||
|
|
||||||
for (let recipient of channel.recipients!) {
|
for (let recipient of channel.recipients!) {
|
||||||
await emitEvent({
|
await emitEvent({
|
||||||
event: "CHANNEL_CREATE",
|
event: "CHANNEL_CREATE",
|
||||||
data: channel_dto.excludedRecipients([recipient.user_id]),
|
data: channel_dto.excludedRecipients([recipient.user_id]),
|
||||||
user_id: recipient.user_id
|
user_id: recipient.user_id,
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
await emitEvent({ event: "CHANNEL_CREATE", data: channel_dto, user_id: creator_user_id });
|
await emitEvent({ event: "CHANNEL_CREATE", data: channel_dto, user_id: creator_user_id });
|
||||||
}
|
}
|
||||||
|
|
||||||
return channel_dto.excludedRecipients([creator_user_id])
|
return channel_dto.excludedRecipients([creator_user_id]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static async removeRecipientFromChannel(channel: Channel, user_id: string) {
|
static async removeRecipientFromChannel(channel: Channel, user_id: string) {
|
||||||
await Recipient.delete({ channel_id: channel.id, user_id: user_id })
|
await Recipient.delete({ channel_id: channel.id, user_id: user_id });
|
||||||
channel.recipients = channel.recipients?.filter(r => r.user_id !== user_id)
|
channel.recipients = channel.recipients?.filter((r) => r.user_id !== user_id);
|
||||||
|
|
||||||
if (channel.recipients?.length === 0) {
|
if (channel.recipients?.length === 0) {
|
||||||
await Channel.deleteChannel(channel);
|
await Channel.deleteChannel(channel);
|
||||||
await emitEvent({
|
await emitEvent({
|
||||||
event: "CHANNEL_DELETE",
|
event: "CHANNEL_DELETE",
|
||||||
data: await DmChannelDTO.from(channel, [user_id]),
|
data: await DmChannelDTO.from(channel, [user_id]),
|
||||||
user_id: user_id
|
user_id: user_id,
|
||||||
});
|
});
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
await emitEvent({
|
await emitEvent({
|
||||||
event: "CHANNEL_DELETE",
|
event: "CHANNEL_DELETE",
|
||||||
data: await DmChannelDTO.from(channel, [user_id]),
|
data: await DmChannelDTO.from(channel, [user_id]),
|
||||||
user_id: user_id
|
user_id: user_id,
|
||||||
});
|
});
|
||||||
|
|
||||||
//If the owner leave we make the first recipient in the list the new owner
|
//If the owner leave we make the first recipient in the list the new owner
|
||||||
if (channel.owner_id === user_id) {
|
if (channel.owner_id === user_id) {
|
||||||
channel.owner_id = channel.recipients!.find(r => r.user_id !== user_id)!.user_id //Is there a criteria to choose the new owner?
|
channel.owner_id = channel.recipients!.find((r) => r.user_id !== user_id)!.user_id; //Is there a criteria to choose the new owner?
|
||||||
await emitEvent({
|
await emitEvent({
|
||||||
event: "CHANNEL_UPDATE",
|
event: "CHANNEL_UPDATE",
|
||||||
data: await DmChannelDTO.from(channel, [user_id]),
|
data: await DmChannelDTO.from(channel, [user_id]),
|
||||||
channel_id: channel.id
|
channel_id: channel.id,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
await channel.save()
|
await channel.save();
|
||||||
|
|
||||||
await emitEvent({
|
await emitEvent({
|
||||||
event: "CHANNEL_RECIPIENT_REMOVE", data: {
|
event: "CHANNEL_RECIPIENT_REMOVE",
|
||||||
|
data: {
|
||||||
channel_id: channel.id,
|
channel_id: channel.id,
|
||||||
user: await User.findOneOrFail({ where: { id: user_id }, select: PublicUserProjection })
|
user: await User.findOneOrFail({ where: { id: user_id }, select: PublicUserProjection }),
|
||||||
}, channel_id: channel.id
|
},
|
||||||
|
channel_id: channel.id,
|
||||||
} as ChannelRecipientRemoveEvent);
|
} as ChannelRecipientRemoveEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
static async deleteChannel(channel: Channel) {
|
static async deleteChannel(channel: Channel) {
|
||||||
await Message.delete({ channel_id: channel.id }) //TODO we should also delete the attachments from the cdn but to do that we need to move cdn.ts in util
|
await Message.delete({ channel_id: channel.id }); //TODO we should also delete the attachments from the cdn but to do that we need to move cdn.ts in util
|
||||||
//TODO before deleting the channel we should check and delete other relations
|
//TODO before deleting the channel we should check and delete other relations
|
||||||
await Channel.delete({ id: channel.id })
|
await Channel.delete({ id: channel.id });
|
||||||
}
|
}
|
||||||
|
|
||||||
isDm() {
|
isDm() {
|
||||||
return this.type === ChannelType.DM || this.type === ChannelType.GROUP_DM
|
return this.type === ChannelType.DM || this.type === ChannelType.GROUP_DM;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,7 +11,9 @@ export class ConnectedAccount extends BaseClass {
|
|||||||
user_id: string;
|
user_id: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "user_id" })
|
@JoinColumn({ name: "user_id" })
|
||||||
@ManyToOne(() => User)
|
@ManyToOne(() => User, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
user: User;
|
user: User;
|
||||||
|
|
||||||
@Column({ select: false })
|
@Column({ select: false })
|
||||||
|
@ -15,7 +15,9 @@ export class Emoji extends BaseClass {
|
|||||||
guild_id: string;
|
guild_id: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "guild_id" })
|
@JoinColumn({ name: "guild_id" })
|
||||||
@ManyToOne(() => Guild)
|
@ManyToOne(() => Guild, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
guild: Guild;
|
guild: Guild;
|
||||||
|
|
||||||
@Column()
|
@Column()
|
||||||
|
@ -81,7 +81,10 @@ export class Guild extends BaseClass {
|
|||||||
// application?: string;
|
// application?: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "ban_ids" })
|
@JoinColumn({ name: "ban_ids" })
|
||||||
@OneToMany(() => Ban, (ban: Ban) => ban.guild)
|
@OneToMany(() => Ban, (ban: Ban) => ban.guild, {
|
||||||
|
cascade: true,
|
||||||
|
orphanedRowAction: "delete",
|
||||||
|
})
|
||||||
bans: Ban[];
|
bans: Ban[];
|
||||||
|
|
||||||
@Column({ nullable: true })
|
@Column({ nullable: true })
|
||||||
@ -124,15 +127,26 @@ export class Guild extends BaseClass {
|
|||||||
@Column({ nullable: true })
|
@Column({ nullable: true })
|
||||||
presence_count?: number; // users online
|
presence_count?: number; // users online
|
||||||
|
|
||||||
@OneToMany(() => Member, (member: Member) => member.guild)
|
@OneToMany(() => Member, (member: Member) => member.guild, {
|
||||||
|
cascade: true,
|
||||||
|
orphanedRowAction: "delete",
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
members: Member[];
|
members: Member[];
|
||||||
|
|
||||||
@JoinColumn({ name: "role_ids" })
|
@JoinColumn({ name: "role_ids" })
|
||||||
@OneToMany(() => Role, (role: Role) => role.guild)
|
@OneToMany(() => Role, (role: Role) => role.guild, {
|
||||||
|
cascade: true,
|
||||||
|
orphanedRowAction: "delete",
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
roles: Role[];
|
roles: Role[];
|
||||||
|
|
||||||
@JoinColumn({ name: "channel_ids" })
|
@JoinColumn({ name: "channel_ids" })
|
||||||
@OneToMany(() => Channel, (channel: Channel) => channel.guild)
|
@OneToMany(() => Channel, (channel: Channel) => channel.guild, {
|
||||||
|
cascade: true,
|
||||||
|
orphanedRowAction: "delete",
|
||||||
|
})
|
||||||
channels: Channel[];
|
channels: Channel[];
|
||||||
|
|
||||||
@Column({ nullable: true })
|
@Column({ nullable: true })
|
||||||
@ -144,23 +158,43 @@ export class Guild extends BaseClass {
|
|||||||
template: Template;
|
template: Template;
|
||||||
|
|
||||||
@JoinColumn({ name: "emoji_ids" })
|
@JoinColumn({ name: "emoji_ids" })
|
||||||
@OneToMany(() => Emoji, (emoji: Emoji) => emoji.guild)
|
@OneToMany(() => Emoji, (emoji: Emoji) => emoji.guild, {
|
||||||
|
cascade: true,
|
||||||
|
orphanedRowAction: "delete",
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
emojis: Emoji[];
|
emojis: Emoji[];
|
||||||
|
|
||||||
@JoinColumn({ name: "sticker_ids" })
|
@JoinColumn({ name: "sticker_ids" })
|
||||||
@OneToMany(() => Sticker, (sticker: Sticker) => sticker.guild)
|
@OneToMany(() => Sticker, (sticker: Sticker) => sticker.guild, {
|
||||||
|
cascade: true,
|
||||||
|
orphanedRowAction: "delete",
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
stickers: Sticker[];
|
stickers: Sticker[];
|
||||||
|
|
||||||
@JoinColumn({ name: "invite_ids" })
|
@JoinColumn({ name: "invite_ids" })
|
||||||
@OneToMany(() => Invite, (invite: Invite) => invite.guild)
|
@OneToMany(() => Invite, (invite: Invite) => invite.guild, {
|
||||||
|
cascade: true,
|
||||||
|
orphanedRowAction: "delete",
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
invites: Invite[];
|
invites: Invite[];
|
||||||
|
|
||||||
@JoinColumn({ name: "voice_state_ids" })
|
@JoinColumn({ name: "voice_state_ids" })
|
||||||
@OneToMany(() => VoiceState, (voicestate: VoiceState) => voicestate.guild)
|
@OneToMany(() => VoiceState, (voicestate: VoiceState) => voicestate.guild, {
|
||||||
|
cascade: true,
|
||||||
|
orphanedRowAction: "delete",
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
voice_states: VoiceState[];
|
voice_states: VoiceState[];
|
||||||
|
|
||||||
@JoinColumn({ name: "webhook_ids" })
|
@JoinColumn({ name: "webhook_ids" })
|
||||||
@OneToMany(() => Webhook, (webhook: Webhook) => webhook.guild)
|
@OneToMany(() => Webhook, (webhook: Webhook) => webhook.guild, {
|
||||||
|
cascade: true,
|
||||||
|
orphanedRowAction: "delete",
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
webhooks: Webhook[];
|
webhooks: Webhook[];
|
||||||
|
|
||||||
@Column({ nullable: true })
|
@Column({ nullable: true })
|
||||||
|
@ -35,7 +35,9 @@ export class Invite extends BaseClass {
|
|||||||
guild_id: string;
|
guild_id: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "guild_id" })
|
@JoinColumn({ name: "guild_id" })
|
||||||
@ManyToOne(() => Guild)
|
@ManyToOne(() => Guild, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
guild: Guild;
|
guild: Guild;
|
||||||
|
|
||||||
@Column({ nullable: true })
|
@Column({ nullable: true })
|
||||||
@ -43,7 +45,9 @@ export class Invite extends BaseClass {
|
|||||||
channel_id: string;
|
channel_id: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "channel_id" })
|
@JoinColumn({ name: "channel_id" })
|
||||||
@ManyToOne(() => Channel)
|
@ManyToOne(() => Channel, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
channel: Channel;
|
channel: Channel;
|
||||||
|
|
||||||
@Column({ nullable: true })
|
@Column({ nullable: true })
|
||||||
@ -59,7 +63,9 @@ export class Invite extends BaseClass {
|
|||||||
target_user_id: string;
|
target_user_id: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "target_user_id" })
|
@JoinColumn({ name: "target_user_id" })
|
||||||
@ManyToOne(() => User)
|
@ManyToOne(() => User, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
target_user?: string; // could be used for "User specific invites" https://github.com/fosscord/fosscord/issues/62
|
target_user?: string; // could be used for "User specific invites" https://github.com/fosscord/fosscord/issues/62
|
||||||
|
|
||||||
@Column({ nullable: true })
|
@Column({ nullable: true })
|
||||||
|
@ -39,7 +39,9 @@ export class Member extends BaseClassWithoutId {
|
|||||||
id: string;
|
id: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "id" })
|
@JoinColumn({ name: "id" })
|
||||||
@ManyToOne(() => User)
|
@ManyToOne(() => User, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
user: User;
|
user: User;
|
||||||
|
|
||||||
@Column()
|
@Column()
|
||||||
@ -47,7 +49,9 @@ export class Member extends BaseClassWithoutId {
|
|||||||
guild_id: string;
|
guild_id: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "guild_id" })
|
@JoinColumn({ name: "guild_id" })
|
||||||
@ManyToOne(() => Guild)
|
@ManyToOne(() => Guild, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
guild: Guild;
|
guild: Guild;
|
||||||
|
|
||||||
@Column({ nullable: true })
|
@Column({ nullable: true })
|
||||||
@ -55,7 +59,6 @@ export class Member extends BaseClassWithoutId {
|
|||||||
|
|
||||||
@JoinTable({
|
@JoinTable({
|
||||||
name: "member_roles",
|
name: "member_roles",
|
||||||
|
|
||||||
joinColumn: { name: "index", referencedColumnName: "index" },
|
joinColumn: { name: "index", referencedColumnName: "index" },
|
||||||
inverseJoinColumn: {
|
inverseJoinColumn: {
|
||||||
name: "role_id",
|
name: "role_id",
|
||||||
|
@ -8,12 +8,14 @@ import {
|
|||||||
Column,
|
Column,
|
||||||
CreateDateColumn,
|
CreateDateColumn,
|
||||||
Entity,
|
Entity,
|
||||||
|
FindConditions,
|
||||||
JoinColumn,
|
JoinColumn,
|
||||||
JoinTable,
|
JoinTable,
|
||||||
ManyToMany,
|
ManyToMany,
|
||||||
ManyToOne,
|
ManyToOne,
|
||||||
OneToMany,
|
OneToMany,
|
||||||
RelationId,
|
RelationId,
|
||||||
|
RemoveOptions,
|
||||||
UpdateDateColumn,
|
UpdateDateColumn,
|
||||||
} from "typeorm";
|
} from "typeorm";
|
||||||
import { BaseClass } from "./BaseClass";
|
import { BaseClass } from "./BaseClass";
|
||||||
@ -52,7 +54,9 @@ export class Message extends BaseClass {
|
|||||||
channel_id: string;
|
channel_id: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "channel_id" })
|
@JoinColumn({ name: "channel_id" })
|
||||||
@ManyToOne(() => Channel)
|
@ManyToOne(() => Channel, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
channel: Channel;
|
channel: Channel;
|
||||||
|
|
||||||
@Column({ nullable: true })
|
@Column({ nullable: true })
|
||||||
@ -60,7 +64,9 @@ export class Message extends BaseClass {
|
|||||||
guild_id?: string;
|
guild_id?: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "guild_id" })
|
@JoinColumn({ name: "guild_id" })
|
||||||
@ManyToOne(() => Guild)
|
@ManyToOne(() => Guild, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
guild?: Guild;
|
guild?: Guild;
|
||||||
|
|
||||||
@Column({ nullable: true })
|
@Column({ nullable: true })
|
||||||
@ -68,7 +74,9 @@ export class Message extends BaseClass {
|
|||||||
author_id: string;
|
author_id: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "author_id", referencedColumnName: "id" })
|
@JoinColumn({ name: "author_id", referencedColumnName: "id" })
|
||||||
@ManyToOne(() => User)
|
@ManyToOne(() => User, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
author?: User;
|
author?: User;
|
||||||
|
|
||||||
@Column({ nullable: true })
|
@Column({ nullable: true })
|
||||||
@ -112,7 +120,7 @@ export class Message extends BaseClass {
|
|||||||
mention_everyone?: boolean;
|
mention_everyone?: boolean;
|
||||||
|
|
||||||
@JoinTable({ name: "message_user_mentions" })
|
@JoinTable({ name: "message_user_mentions" })
|
||||||
@ManyToMany(() => User)
|
@ManyToMany(() => User, { orphanedRowAction: "delete", onDelete: "CASCADE", cascade: true })
|
||||||
mentions: User[];
|
mentions: User[];
|
||||||
|
|
||||||
@JoinTable({ name: "message_role_mentions" })
|
@JoinTable({ name: "message_role_mentions" })
|
||||||
@ -127,8 +135,10 @@ export class Message extends BaseClass {
|
|||||||
@ManyToMany(() => Sticker)
|
@ManyToMany(() => Sticker)
|
||||||
sticker_items?: Sticker[];
|
sticker_items?: Sticker[];
|
||||||
|
|
||||||
@JoinColumn({ name: "attachment_ids" })
|
@OneToMany(() => Attachment, (attachment: Attachment) => attachment.message, {
|
||||||
@OneToMany(() => Attachment, (attachment: Attachment) => attachment.message, { cascade: true })
|
cascade: true,
|
||||||
|
orphanedRowAction: "delete",
|
||||||
|
})
|
||||||
attachments?: Attachment[];
|
attachments?: Attachment[];
|
||||||
|
|
||||||
@Column({ type: "simple-json" })
|
@Column({ type: "simple-json" })
|
||||||
|
@ -15,7 +15,9 @@ export class ReadState extends BaseClass {
|
|||||||
channel_id: string;
|
channel_id: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "channel_id" })
|
@JoinColumn({ name: "channel_id" })
|
||||||
@ManyToOne(() => Channel)
|
@ManyToOne(() => Channel, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
channel: Channel;
|
channel: Channel;
|
||||||
|
|
||||||
@Column({ nullable: true })
|
@Column({ nullable: true })
|
||||||
@ -23,7 +25,9 @@ export class ReadState extends BaseClass {
|
|||||||
user_id: string;
|
user_id: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "user_id" })
|
@JoinColumn({ name: "user_id" })
|
||||||
@ManyToOne(() => User)
|
@ManyToOne(() => User, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
user: User;
|
user: User;
|
||||||
|
|
||||||
@Column({ nullable: true })
|
@Column({ nullable: true })
|
||||||
|
@ -8,7 +8,9 @@ export class Recipient extends BaseClass {
|
|||||||
channel_id: string;
|
channel_id: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "channel_id" })
|
@JoinColumn({ name: "channel_id" })
|
||||||
@ManyToOne(() => require("./Channel").Channel)
|
@ManyToOne(() => require("./Channel").Channel, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
channel: import("./Channel").Channel;
|
channel: import("./Channel").Channel;
|
||||||
|
|
||||||
@Column()
|
@Column()
|
||||||
@ -16,7 +18,9 @@ export class Recipient extends BaseClass {
|
|||||||
user_id: string;
|
user_id: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "user_id" })
|
@JoinColumn({ name: "user_id" })
|
||||||
@ManyToOne(() => require("./User").User)
|
@ManyToOne(() => require("./User").User, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
user: import("./User").User;
|
user: import("./User").User;
|
||||||
|
|
||||||
@Column({ default: false })
|
@Column({ default: false })
|
||||||
|
@ -17,7 +17,9 @@ export class Relationship extends BaseClass {
|
|||||||
from_id: string;
|
from_id: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "from_id" })
|
@JoinColumn({ name: "from_id" })
|
||||||
@ManyToOne(() => User)
|
@ManyToOne(() => User, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
from: User;
|
from: User;
|
||||||
|
|
||||||
@Column({})
|
@Column({})
|
||||||
@ -25,7 +27,9 @@ export class Relationship extends BaseClass {
|
|||||||
to_id: string;
|
to_id: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "to_id" })
|
@JoinColumn({ name: "to_id" })
|
||||||
@ManyToOne(() => User)
|
@ManyToOne(() => User, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
to: User;
|
to: User;
|
||||||
|
|
||||||
@Column({ nullable: true })
|
@Column({ nullable: true })
|
||||||
|
@ -10,7 +10,9 @@ export class Role extends BaseClass {
|
|||||||
guild_id: string;
|
guild_id: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "guild_id" })
|
@JoinColumn({ name: "guild_id" })
|
||||||
@ManyToOne(() => Guild)
|
@ManyToOne(() => Guild, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
guild: Guild;
|
guild: Guild;
|
||||||
|
|
||||||
@Column()
|
@Column()
|
||||||
|
@ -11,7 +11,9 @@ export class Session extends BaseClass {
|
|||||||
user_id: string;
|
user_id: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "user_id" })
|
@JoinColumn({ name: "user_id" })
|
||||||
@ManyToOne(() => User)
|
@ManyToOne(() => User, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
user: User;
|
user: User;
|
||||||
|
|
||||||
//TODO check, should be 32 char long hex string
|
//TODO check, should be 32 char long hex string
|
||||||
|
@ -31,7 +31,9 @@ export class Sticker extends BaseClass {
|
|||||||
guild_id?: string;
|
guild_id?: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "guild_id" })
|
@JoinColumn({ name: "guild_id" })
|
||||||
@ManyToOne(() => Guild)
|
@ManyToOne(() => Guild, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
guild?: Guild;
|
guild?: Guild;
|
||||||
|
|
||||||
@Column({ type: "simple-enum", enum: StickerType })
|
@Column({ type: "simple-enum", enum: StickerType })
|
||||||
|
@ -9,7 +9,9 @@ export class Team extends BaseClass {
|
|||||||
icon?: string;
|
icon?: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "member_ids" })
|
@JoinColumn({ name: "member_ids" })
|
||||||
@OneToMany(() => TeamMember, (member: TeamMember) => member.team)
|
@OneToMany(() => TeamMember, (member: TeamMember) => member.team, {
|
||||||
|
orphanedRowAction: "delete",
|
||||||
|
})
|
||||||
members: TeamMember[];
|
members: TeamMember[];
|
||||||
|
|
||||||
@Column()
|
@Column()
|
||||||
|
@ -20,7 +20,9 @@ export class TeamMember extends BaseClass {
|
|||||||
team_id: string;
|
team_id: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "team_id" })
|
@JoinColumn({ name: "team_id" })
|
||||||
@ManyToOne(() => require("./Team").Team, (team: import("./Team").Team) => team.members)
|
@ManyToOne(() => require("./Team").Team, (team: import("./Team").Team) => team.members, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
team: import("./Team").Team;
|
team: import("./Team").Team;
|
||||||
|
|
||||||
@Column({ nullable: true })
|
@Column({ nullable: true })
|
||||||
@ -28,6 +30,8 @@ export class TeamMember extends BaseClass {
|
|||||||
user_id: string;
|
user_id: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "user_id" })
|
@JoinColumn({ name: "user_id" })
|
||||||
@ManyToOne(() => User)
|
@ManyToOne(() => User, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
user: User;
|
user: User;
|
||||||
}
|
}
|
||||||
|
@ -127,11 +127,17 @@ export class User extends BaseClass {
|
|||||||
public_flags: number;
|
public_flags: number;
|
||||||
|
|
||||||
@JoinColumn({ name: "relationship_ids" })
|
@JoinColumn({ name: "relationship_ids" })
|
||||||
@OneToMany(() => Relationship, (relationship: Relationship) => relationship.from)
|
@OneToMany(() => Relationship, (relationship: Relationship) => relationship.from, {
|
||||||
|
cascade: true,
|
||||||
|
orphanedRowAction: "delete",
|
||||||
|
})
|
||||||
relationships: Relationship[];
|
relationships: Relationship[];
|
||||||
|
|
||||||
@JoinColumn({ name: "connected_account_ids" })
|
@JoinColumn({ name: "connected_account_ids" })
|
||||||
@OneToMany(() => ConnectedAccount, (account: ConnectedAccount) => account.user)
|
@OneToMany(() => ConnectedAccount, (account: ConnectedAccount) => account.user, {
|
||||||
|
cascade: true,
|
||||||
|
orphanedRowAction: "delete",
|
||||||
|
})
|
||||||
connected_accounts: ConnectedAccount[];
|
connected_accounts: ConnectedAccount[];
|
||||||
|
|
||||||
@Column({ type: "simple-json", select: false })
|
@Column({ type: "simple-json", select: false })
|
||||||
|
@ -13,7 +13,9 @@ export class VoiceState extends BaseClass {
|
|||||||
guild_id: string;
|
guild_id: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "guild_id" })
|
@JoinColumn({ name: "guild_id" })
|
||||||
@ManyToOne(() => Guild)
|
@ManyToOne(() => Guild, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
guild?: Guild;
|
guild?: Guild;
|
||||||
|
|
||||||
@Column({ nullable: true })
|
@Column({ nullable: true })
|
||||||
@ -21,7 +23,9 @@ export class VoiceState extends BaseClass {
|
|||||||
channel_id: string;
|
channel_id: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "channel_id" })
|
@JoinColumn({ name: "channel_id" })
|
||||||
@ManyToOne(() => Channel)
|
@ManyToOne(() => Channel, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
channel: Channel;
|
channel: Channel;
|
||||||
|
|
||||||
@Column({ nullable: true })
|
@Column({ nullable: true })
|
||||||
@ -29,11 +33,15 @@ export class VoiceState extends BaseClass {
|
|||||||
user_id: string;
|
user_id: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "user_id" })
|
@JoinColumn({ name: "user_id" })
|
||||||
@ManyToOne(() => User)
|
@ManyToOne(() => User, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
user: User;
|
user: User;
|
||||||
|
|
||||||
// @JoinColumn([{ name: "user_id", referencedColumnName: "id" },{ name: "guild_id", referencedColumnName: "guild_id" }])
|
// @JoinColumn([{ name: "user_id", referencedColumnName: "id" },{ name: "guild_id", referencedColumnName: "guild_id" }])
|
||||||
// @ManyToOne(() => Member)
|
// @ManyToOne(() => Member, {
|
||||||
|
// onDelete: "CASCADE",
|
||||||
|
// })
|
||||||
//TODO find a way to make it work without breaking Guild.voice_states
|
//TODO find a way to make it work without breaking Guild.voice_states
|
||||||
member: Member;
|
member: Member;
|
||||||
|
|
||||||
|
@ -32,7 +32,9 @@ export class Webhook extends BaseClass {
|
|||||||
guild_id: string;
|
guild_id: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "guild_id" })
|
@JoinColumn({ name: "guild_id" })
|
||||||
@ManyToOne(() => Guild)
|
@ManyToOne(() => Guild, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
guild: Guild;
|
guild: Guild;
|
||||||
|
|
||||||
@Column({ nullable: true })
|
@Column({ nullable: true })
|
||||||
@ -40,7 +42,9 @@ export class Webhook extends BaseClass {
|
|||||||
channel_id: string;
|
channel_id: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "channel_id" })
|
@JoinColumn({ name: "channel_id" })
|
||||||
@ManyToOne(() => Channel)
|
@ManyToOne(() => Channel, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
channel: Channel;
|
channel: Channel;
|
||||||
|
|
||||||
@Column({ nullable: true })
|
@Column({ nullable: true })
|
||||||
@ -48,7 +52,9 @@ export class Webhook extends BaseClass {
|
|||||||
application_id: string;
|
application_id: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "application_id" })
|
@JoinColumn({ name: "application_id" })
|
||||||
@ManyToOne(() => Application)
|
@ManyToOne(() => Application, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
application: Application;
|
application: Application;
|
||||||
|
|
||||||
@Column({ nullable: true })
|
@Column({ nullable: true })
|
||||||
@ -56,7 +62,9 @@ export class Webhook extends BaseClass {
|
|||||||
user_id: string;
|
user_id: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "user_id" })
|
@JoinColumn({ name: "user_id" })
|
||||||
@ManyToOne(() => User)
|
@ManyToOne(() => User, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
user: User;
|
user: User;
|
||||||
|
|
||||||
@Column({ nullable: true })
|
@Column({ nullable: true })
|
||||||
@ -64,6 +72,8 @@ export class Webhook extends BaseClass {
|
|||||||
source_guild_id: string;
|
source_guild_id: string;
|
||||||
|
|
||||||
@JoinColumn({ name: "source_guild_id" })
|
@JoinColumn({ name: "source_guild_id" })
|
||||||
@ManyToOne(() => Guild)
|
@ManyToOne(() => Guild, {
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
})
|
||||||
source_guild: Guild;
|
source_guild: Guild;
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@ export function initDatabase() {
|
|||||||
//
|
//
|
||||||
entities: Object.values(Models).filter((x) => x.constructor.name !== "Object"),
|
entities: Object.values(Models).filter((x) => x.constructor.name !== "Object"),
|
||||||
synchronize: true,
|
synchronize: true,
|
||||||
logging: false,
|
logging: true,
|
||||||
cache: {
|
cache: {
|
||||||
duration: 1000 * 3, // cache all find queries for 3 seconds
|
duration: 1000 * 3, // cache all find queries for 3 seconds
|
||||||
},
|
},
|
||||||
|
Loading…
x
Reference in New Issue
Block a user