diff --git a/src/api/routes/channels/#channel_id/index.ts b/src/api/routes/channels/#channel_id/index.ts index 291b64727..883bb2661 100644 --- a/src/api/routes/channels/#channel_id/index.ts +++ b/src/api/routes/channels/#channel_id/index.ts @@ -115,7 +115,7 @@ router.delete( } await Promise.all([ - Channel.delete({ id: channel_id }), + Channel.deleteChannel(channel), emitEvent({ event: "CHANNEL_DELETE", data: channel, diff --git a/src/api/routes/guilds/#guild_id/widget.json.ts b/src/api/routes/guilds/#guild_id/widget.json.ts index eb2dd1023..0ee3640d5 100644 --- a/src/api/routes/guilds/#guild_id/widget.json.ts +++ b/src/api/routes/guilds/#guild_id/widget.json.ts @@ -52,8 +52,13 @@ router.get( }), async (req: Request, res: Response) => { const { guild_id } = req.params; - - const guild = await Guild.findOneOrFail({ where: { id: guild_id } }); + + const guild = await Guild.findOneOrFail({ + where: { id: guild_id }, + select: { + channel_ordering: true, + }, + }); if (!guild.widget_enabled) throw DiscordApiErrors.EMBED_DISABLED; // Fetch existing widget invite for widget channel diff --git a/src/util/entities/Channel.ts b/src/util/entities/Channel.ts index 71ccf49e1..4cd6c539c 100644 --- a/src/util/entities/Channel.ts +++ b/src/util/entities/Channel.ts @@ -459,9 +459,21 @@ export class Channel extends BaseClass { } 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 - //TODO before deleting the channel we should check and delete other relations + // TODO Delete attachments from the CDN for messages in the channel await Channel.delete({ id: channel.id }); + + const guild = await Guild.findOneOrFail({ + where: { id: channel.guild_id }, + select: { channel_ordering: true }, + }); + + const updatedOrdering = guild.channel_ordering.filter( + (id) => id != channel.id, + ); + await Guild.update( + { id: channel.guild_id }, + { channel_ordering: updatedOrdering }, + ); } static async calculatePosition( @@ -487,15 +499,19 @@ export class Channel extends BaseClass { const channels = await Promise.all( guild.channel_ordering.map((id) => - Channel.findOneOrFail({ where: { id } }), + Channel.findOne({ where: { id } }), ), ); - return channels.reduce((r, v) => { - v.position = (guild as Guild).channel_ordering.indexOf(v.id); - r[v.position] = v; - return r; - }, [] as Array); + return channels + .filter((channel) => channel !== null) + .reduce((r, v) => { + v = v as Channel; + + v.position = (guild as Guild).channel_ordering.indexOf(v.id); + r[v.position] = v; + return r; + }, [] as Array); } isDm() {