1
0
mirror of https://github.com/spacebarchat/server.git synced 2024-11-11 13:14:06 +01:00

createChannel()

This commit is contained in:
Flam3rboy 2021-05-22 17:40:10 +02:00
parent 8a13a1f2ea
commit 4715ef1eab
8 changed files with 78 additions and 87 deletions

View File

@ -13,6 +13,7 @@ import { HTTPError } from "lambert-server";
import { ChannelModifySchema } from "../../../schema/Channel"; import { ChannelModifySchema } from "../../../schema/Channel";
import { emitEvent } from "../../../util/Event"; import { emitEvent } from "../../../util/Event";
import { check } from "../../../util/instanceOf"; import { check } from "../../../util/instanceOf";
import { createChannel } from "../../../util/Channel";
const router = Router(); const router = Router();
router.get("/", async (req, res) => { router.get("/", async (req, res) => {
@ -26,41 +27,7 @@ router.post("/", check(ChannelModifySchema), async (req, res) => {
const { guild_id } = req.params; const { guild_id } = req.params;
const body = req.body as ChannelModifySchema; const body = req.body as ChannelModifySchema;
if (!body.permission_overwrites) body.permission_overwrites = []; const channel = await createChannel({ ...body, guild_id }, req.user_id);
if (!body.topic) body.topic = "";
if (!body.rate_limit_per_user) body.rate_limit_per_user = 0;
switch (body.type) {
case ChannelType.DM:
case ChannelType.GROUP_DM:
throw new HTTPError("You can't create a dm channel in a guild");
// TODO:
case ChannelType.GUILD_STORE:
throw new HTTPError("Not yet supported");
case ChannelType.GUILD_NEWS:
// TODO: check if guild is community server
}
if (body.parent_id) {
const exists = await ChannelModel.findOne({ id: body.parent_id }, { guild_id: true }).exec();
if (!exists) throw new HTTPError("Parent id channel doesn't exist", 400);
if (exists.guild_id !== guild_id) throw new HTTPError("The category channel needs to be in the guild");
}
const guild = await GuildModel.findOne({ id: guild_id }, { id: true }).exec();
if (!guild) throw new HTTPError("Guild not found", 404);
const channel = {
...body,
id: Snowflake.generate(),
created_at: new Date(),
guild_id,
recipients: null
};
await new ChannelModel(channel).save();
await emitEvent({ event: "CHANNEL_CREATE", data: channel, guild_id } as ChannelCreateEvent);
res.json(channel); res.json(channel);
}); });

View File

@ -54,15 +54,4 @@ router.patch("/", check(GuildUpdateSchema), async (req: Request, res: Response)
return res.send(data); return res.send(data);
}); });
router.get("/vanity-url", async (req: Request, res: Response) => {
const { guild_id } = req.params;
const guild = await GuildModel.findOne({ id: guild_id }).exec();
if (!guild) throw new HTTPError("Guild does not exist", 404);
if (!guild.vanity_url) throw new HTTPError("This guild has no vanity url", 204);
return res.json(guild.vanity_url);
});
export default router; export default router;

View File

@ -6,6 +6,7 @@ import { GuildCreateSchema } from "../../schema/Guild";
import Config from "../../util/Config"; import Config from "../../util/Config";
import { getPublicUser } from "../../util/User"; import { getPublicUser } from "../../util/User";
import { addMember } from "../../util/Member"; import { addMember } from "../../util/Member";
import { createChannel } from "../../util/Channel";
const router: Router = Router(); const router: Router = Router();
@ -80,7 +81,8 @@ router.post("/", check(GuildCreateSchema), async (req: Request, res: Response) =
}).save() }).save()
]); ]);
await addMember(req.user_id, guild_id, { guild: guild_doc }); await createChannel({ name: "general", type: 0, guild_id, position: 0, permission_overwrites: [] }, req.user_id);
await addMember(req.user_id, guild_id);
res.status(201).json({ id: guild.id }); res.status(201).json({ id: guild.id });
}); });

View File

@ -7,7 +7,7 @@ export const InviteCreateSchema = {
$temporary: Boolean, $temporary: Boolean,
$unique: Boolean, $unique: Boolean,
$target_user: String, $target_user: String,
$target_user_type: Number, $target_user_type: Number
}; };
export interface InviteCreateSchema { export interface InviteCreateSchema {
target_user_id?: String; target_user_id?: String;

View File

@ -1,34 +1,17 @@
export const RoleCreateSchema = {
name: String,
permissions: BigInt,
color: Number,
hoist: Boolean, // whether the role should be displayed separately in the sidebar
mentionable: Boolean // whether the role should be mentionable
};
export interface RoleCreateSchema {
name: string,
permissions: BigInt,
color: number,
hoist: boolean, // whether the role should be displayed separately in the sidebar
mentionable: boolean // whether the role should be mentionable
}
export const RoleModifySchema = { export const RoleModifySchema = {
$name: String, $name: String,
$permissions: BigInt, $permissions: BigInt,
$color: Number, $color: Number,
$hoist: Boolean, // whether the role should be displayed separately in the sidebar $hoist: Boolean, // whether the role should be displayed separately in the sidebar
$mentionable: Boolean, // whether the role should be mentionable $mentionable: Boolean, // whether the role should be mentionable
$position: Number, $position: Number
}; };
export interface RoleModifySchema { export interface RoleModifySchema {
name?: string, name?: string;
permissions?: BigInt, permissions?: BigInt;
color?: number, color?: number;
hoist?: boolean, // whether the role should be displayed separately in the sidebar hoist?: boolean; // whether the role should be displayed separately in the sidebar
mentionable?: boolean, // whether the role should be mentionable mentionable?: boolean; // whether the role should be mentionable
position?: number, position?: number;
} }

View File

@ -1,8 +1,3 @@
import { getPermission } from "@fosscord/server-util"; import { Snowflake } from "@fosscord/server-util";
async function main() { console.log(Snowflake.deconstruct("0"));
const t = await getPermission("811642917432066048", "812327318532915201");
console.log(t);
}
main();

54
src/util/Channel.ts Normal file
View File

@ -0,0 +1,54 @@
import {
ChannelCreateEvent,
ChannelModel,
ChannelType,
getPermission,
GuildModel,
Snowflake,
TextChannel,
VoiceChannel
} from "@fosscord/server-util";
import { HTTPError } from "lambert-server";
import { emitEvent } from "./Event";
// TODO: DM channel
export async function createChannel(channel: Partial<TextChannel | VoiceChannel>, user_id: string = "0") {
if (!channel.permission_overwrites) channel.permission_overwrites = [];
switch (channel.type) {
case ChannelType.GUILD_TEXT:
case ChannelType.GUILD_VOICE:
break;
case ChannelType.DM:
case ChannelType.GROUP_DM:
throw new HTTPError("You can't create a dm channel in a guild");
// TODO: check if guild is community server
case ChannelType.GUILD_STORE:
case ChannelType.GUILD_NEWS:
default:
throw new HTTPError("Not yet supported");
}
const permissions = await getPermission(user_id, channel.guild_id);
permissions.hasThrow("MANAGE_CHANNELS");
if (channel.parent_id) {
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");
}
// TODO: auto generate position
channel = await new ChannelModel({
...channel,
id: Snowflake.generate(),
created_at: new Date(),
// @ts-ignore
recipients: null
}).save();
await emitEvent({ event: "CHANNEL_CREATE", data: channel, guild_id: channel.guild_id } as ChannelCreateEvent);
return channel;
}

View File

@ -5,7 +5,8 @@ import { Tuple } from "lambert-server";
import "missing-native-js-functions"; import "missing-native-js-functions";
export const OPTIONAL_PREFIX = "$"; export const OPTIONAL_PREFIX = "$";
export const EMAIL_REGEX = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; export const EMAIL_REGEX =
/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
export function check(schema: any) { export function check(schema: any) {
return (req: Request, res: Response, next: NextFunction) => { return (req: Request, res: Response, next: NextFunction) => {
@ -27,9 +28,9 @@ export function FieldErrors(fields: Record<string, { code?: string; message: str
_errors: [ _errors: [
{ {
message, message,
code: code || "BASE_TYPE_INVALID", code: code || "BASE_TYPE_INVALID"
}, }
], ]
})) }))
); );
} }
@ -68,7 +69,7 @@ export function instanceOf(
optional = false, optional = false,
errors = {}, errors = {},
req, req,
ref, ref
}: { path?: string; optional?: boolean; errors?: any; req: Request; ref?: { key: string | number; obj: any } } }: { path?: string; optional?: boolean; errors?: any; req: Request; ref?: { key: string | number; obj: any } }
): Boolean { ): Boolean {
if (!ref) ref = { obj: null, key: "" }; if (!ref) ref = { obj: null, key: "" };
@ -131,7 +132,7 @@ export function instanceOf(
optional, optional,
errors: errors[i], errors: errors[i],
req, req,
ref: { key: i, obj: value }, ref: { key: i, obj: value }
}) === true }) === true
) { ) {
delete errors[i]; delete errors[i];
@ -153,7 +154,7 @@ export function instanceOf(
throw new FieldError( throw new FieldError(
"BASE_TYPE_BAD_LENGTH", "BASE_TYPE_BAD_LENGTH",
req.t("common:field.BASE_TYPE_BAD_LENGTH", { req.t("common:field.BASE_TYPE_BAD_LENGTH", {
length: `${type.min} - ${type.max}`, length: `${type.min} - ${type.max}`
}) })
); );
} }
@ -185,7 +186,7 @@ export function instanceOf(
optional: OPTIONAL, optional: OPTIONAL,
errors: errors[newKey], errors: errors[newKey],
req, req,
ref: { key: newKey, obj: value }, ref: { key: newKey, obj: value }
}) === true }) === true
) { ) {
delete errors[newKey]; delete errors[newKey];