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] 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;