From cae9d7ebed47d39a3143771241bb32148d473eee Mon Sep 17 00:00:00 2001 From: TomatoCake <60300461+DEVTomatoCake@users.noreply.github.com> Date: Sun, 18 Aug 2024 10:41:45 +0200 Subject: [PATCH 1/3] widget.json channel_ordering, fix channel deletion --- src/api/routes/channels/#channel_id/index.ts | 2 +- src/api/routes/guilds/#guild_id/widget.json.ts | 13 +++++++++---- src/util/entities/Channel.ts | 16 ++++++++++++++-- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/api/routes/channels/#channel_id/index.ts b/src/api/routes/channels/#channel_id/index.ts index 291b6472..883bb266 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 39f49804..362a4a1c 100644 --- a/src/api/routes/guilds/#guild_id/widget.json.ts +++ b/src/api/routes/guilds/#guild_id/widget.json.ts @@ -1,17 +1,17 @@ /* Spacebar: A FOSS re-implementation and extension of the Discord.com backend. Copyright (C) 2023 Spacebar and Spacebar Contributors - + This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. - + You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ @@ -47,7 +47,12 @@ 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 new HTTPError("Widget Disabled", 404); // Fetch existing widget invite for widget channel diff --git a/src/util/entities/Channel.ts b/src/util/entities/Channel.ts index 71ccf49e..9f19cb0d 100644 --- a/src/util/entities/Channel.ts +++ b/src/util/entities/Channel.ts @@ -462,6 +462,16 @@ export class Channel extends BaseClass { 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 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,11 +497,13 @@ 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) => { + 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; From b7f966c8c2f88c02845417c0d54a681fcfda77d0 Mon Sep 17 00:00:00 2001 From: TomatoCake <60300461+DEVTomatoCake@users.noreply.github.com> Date: Sun, 18 Aug 2024 10:46:17 +0200 Subject: [PATCH 2/3] Prettier, remove manual deletion of msgs --- .../routes/guilds/#guild_id/widget.json.ts | 2 +- src/util/entities/Channel.ts | 21 +++++++++++-------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/api/routes/guilds/#guild_id/widget.json.ts b/src/api/routes/guilds/#guild_id/widget.json.ts index 362a4a1c..12b31b88 100644 --- a/src/api/routes/guilds/#guild_id/widget.json.ts +++ b/src/api/routes/guilds/#guild_id/widget.json.ts @@ -51,7 +51,7 @@ router.get( where: { id: guild_id }, select: { channel_ordering: true, - } + }, }); if (!guild.widget_enabled) throw new HTTPError("Widget Disabled", 404); diff --git a/src/util/entities/Channel.ts b/src/util/entities/Channel.ts index 9f19cb0d..6538b523 100644 --- a/src/util/entities/Channel.ts +++ b/src/util/entities/Channel.ts @@ -459,8 +459,6 @@ 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 await Channel.delete({ id: channel.id }); const guild = await Guild.findOneOrFail({ @@ -471,7 +469,10 @@ export class Channel extends BaseClass { const updatedOrdering = guild.channel_ordering.filter( (id) => id != channel.id, ); - await Guild.update({id: channel.guild_id}, { channel_ordering: updatedOrdering }); + await Guild.update( + { id: channel.guild_id }, + { channel_ordering: updatedOrdering }, + ); } static async calculatePosition( @@ -501,13 +502,15 @@ export class Channel extends BaseClass { ), ); - return channels.filter(channel => channel !== null).reduce((r, v) => { - v = v as Channel; + 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); + v.position = (guild as Guild).channel_ordering.indexOf(v.id); + r[v.position] = v; + return r; + }, [] as Array); } isDm() { From 63bd6d97c60e464a0d6ce2cea70cb4217f2c749c Mon Sep 17 00:00:00 2001 From: TomatoCake <60300461+DEVTomatoCake@users.noreply.github.com> Date: Sun, 18 Aug 2024 10:50:45 +0200 Subject: [PATCH 3/3] re-add CDN TODO comment --- src/util/entities/Channel.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/util/entities/Channel.ts b/src/util/entities/Channel.ts index 6538b523..4cd6c539 100644 --- a/src/util/entities/Channel.ts +++ b/src/util/entities/Channel.ts @@ -459,6 +459,7 @@ export class Channel extends BaseClass { } static async deleteChannel(channel: Channel) { + // TODO Delete attachments from the CDN for messages in the channel await Channel.delete({ id: channel.id }); const guild = await Guild.findOneOrFail({