summary refs log tree commit diff
diff options
context:
space:
mode:
authorFlam3rboy <34555296+Flam3rboy@users.noreply.github.com>2021-08-14 13:56:46 +0200
committerFlam3rboy <34555296+Flam3rboy@users.noreply.github.com>2021-08-14 13:56:46 +0200
commit31a6c416a623c2461f1bdad56a4cbae1743d837f (patch)
treeda50a1997d93e6bd3d98a59eb960e8b1f1906058
parent:bug: fix guild create with channel template (diff)
downloadserver-31a6c416a623c2461f1bdad56a4cbae1743d837f.tar.xz
:bug: fix Guild + Channel create
-rw-r--r--api/src/schema/Channel.ts2
-rw-r--r--api/src/schema/Guild.ts5
-rw-r--r--api/src/util/Channel.ts13
3 files changed, 15 insertions, 5 deletions
diff --git a/api/src/schema/Channel.ts b/api/src/schema/Channel.ts
index 18a8f835..bffbaa69 100644
--- a/api/src/schema/Channel.ts
+++ b/api/src/schema/Channel.ts
@@ -18,6 +18,7 @@ export const ChannelModifySchema = {
 		}
 	],
 	$parent_id: String,
+	$id: String, // kept for backwards compatibility does nothing (need for guild create)
 	$nsfw: Boolean
 };
 
@@ -46,6 +47,7 @@ export interface ChannelModifySchema {
 		deny: bigint;
 	}[];
 	parent_id?: string;
+	id?: string; // is not used (only for guild create)
 	nsfw?: boolean;
 }
 
diff --git a/api/src/schema/Guild.ts b/api/src/schema/Guild.ts
index ce40b49f..e5971baf 100644
--- a/api/src/schema/Guild.ts
+++ b/api/src/schema/Guild.ts
@@ -1,11 +1,12 @@
 import { ChannelSchema, GuildChannel } from "@fosscord/util";
 import { Length } from "../util/instanceOf";
+import { ChannelModifySchema } from "./Channel";
 
 export const GuildCreateSchema = {
 	name: new Length(String, 2, 100),
 	$region: String, // auto complete voice region of the user
 	$icon: String,
-	$channels: [Object],
+	$channels: [ChannelModifySchema],
 	$guild_template_code: String,
 	$system_channel_id: String,
 	$rules_channel_id: String
@@ -15,7 +16,7 @@ export interface GuildCreateSchema {
 	name: string;
 	region?: string;
 	icon?: string;
-	channels?: GuildChannel[];
+	channels?: ChannelModifySchema[];
 	guild_template_code?: string;
 	system_channel_id?: string;
 	rules_channel_id?: string;
diff --git a/api/src/util/Channel.ts b/api/src/util/Channel.ts
index ef04d521..fb6f9c8c 100644
--- a/api/src/util/Channel.ts
+++ b/api/src/util/Channel.ts
@@ -13,7 +13,14 @@ import {
 import { HTTPError } from "lambert-server";
 
 // TODO: DM channel
-export async function createChannel(channel: Partial<TextChannel | VoiceChannel>, user_id: string = "0") {
+export async function createChannel(
+	channel: Partial<TextChannel | VoiceChannel>,
+	user_id: string = "0",
+	opts?: {
+		keepId?: boolean;
+		skipExistsCheck?: boolean;
+	}
+) {
 	// Always check if user has permission first
 	const permissions = await getPermission(user_id, channel.guild_id);
 	permissions.hasThrow("MANAGE_CHANNELS");
@@ -21,7 +28,7 @@ export async function createChannel(channel: Partial<TextChannel | VoiceChannel>
 	switch (channel.type) {
 		case ChannelType.GUILD_TEXT:
 		case ChannelType.GUILD_VOICE:
-			if (channel.parent_id) {
+			if (channel.parent_id && !opts?.skipExistsCheck) {
 				const exists = await ChannelModel.findOne({ id: channel.parent_id }, { guild_id: true }).exec();
 				if (!exists) throw new HTTPError("Parent id channel doesn't exist", 400);
 				if (exists.guild_id !== channel.guild_id) throw new HTTPError("The category channel needs to be in the guild");
@@ -44,7 +51,7 @@ export async function createChannel(channel: Partial<TextChannel | VoiceChannel>
 
 	channel = await new ChannelModel({
 		...channel,
-		id: Snowflake.generate(),
+		...(!opts?.keepId && { id: Snowflake.generate() }),
 		created_at: new Date(),
 		// @ts-ignore
 		recipient_ids: null