2021-04-22 23:37:07 +02:00

55 lines
1.7 KiB
TypeScript

import { Router } from "express";
import { ChannelCreateEvent, ChannelModel, ChannelType, GuildModel, Snowflake, toObject } from "@fosscord/server-util";
import { HTTPError } from "lambert-server";
import { ChannelModifySchema } from "../../../schema/Channel";
import { emitEvent } from "../../../util/Event";
import { check } from "../../../util/instanceOf";
const router = Router();
router.get("/", async (req, res) => {
const { guild_id } = req.params;
const channels = await ChannelModel.find({ guild_id }).exec();
res.json(toObject(channels));
});
router.post("/", check(ChannelModifySchema), async (req, res) => {
const { guild_id } = req.params;
const body = req.body as ChannelModifySchema;
if (!body.permission_overwrites) body.permission_overwrites = [];
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 = ChannelModel.findOne({ channel_id: body.parent_id }).exec();
if (!exists) throw new HTTPError("Parent id channel doesn't exist", 400);
}
const guild = await GuildModel.findOne({ id: guild_id }, { id: true }).exec();
if (!guild) throw new HTTPError("Guild not found", 4040);
const channel = {
...body,
id: Snowflake.generate(),
created_at: new Date(),
guild_id,
};
await new ChannelModel(channel).save();
await emitEvent({ event: "CHANNEL_CREATE", data: channel, guild_id } as ChannelCreateEvent);
res.json(channel);
});
export default router;