import Router, {Response} from 'express'; import {AuthenticatedRequest, hasRank} from "../middlewares/authenticate"; import {Rank} from "../../models/User"; import {canEditGuild, getGuilds} from "../../controller/discord"; import {validateSchema} from "../../util/validate"; import {getGuildById} from "../../controller/guild"; import {patchGuild} from "../validations/guildValidation"; const app = Router(); app.get("/", hasRank(Rank.USER), async (req: AuthenticatedRequest, res: Response) => { getGuilds(req.user.refreshDate!, req.user.refreshToken, req.user.accessToken).then(guilds => { res.json(guilds .filter((guild) => guild.owner || (guild.permissions && (guild.permissions & 0x8))) .map((guild) => ({id: guild.id, name: guild.name, icon: guild.icon}))); }).catch(() => { res.status(500).json({message: "An internal error occurred"}); }); }); /** * Handles the guild id error * @param req The request * @param res The response */ const guildIdErrorHandler = async (req: AuthenticatedRequest, res: Response) => { if (!await canEditGuild(req.user.refreshDate!, req.user.refreshToken, req.user.accessToken, req.params.guildId.toString())) { res.status(403).json({message: "You are not allowed to edit this guild"}); return; } const guild = await getGuildById(req.params.guildId); if (!guild) { res.status(404).json({message: "The provided guild is not registered"}) return; } return guild; } app.get("/:guildId", hasRank(Rank.USER), async (req: AuthenticatedRequest, res: Response) => { const guild = await guildIdErrorHandler(req, res); if (!guild) return; res.json(guild); }); app.patch("/:guildId", hasRank(Rank.USER), async (req: AuthenticatedRequest, res: Response) => { const validationError = validateSchema(patchGuild, req.body); if (validationError) return res.status(400).json({message: validationError}); const guild = await guildIdErrorHandler(req, res); if (!guild) return; if (Object.keys(req.body).length === 0) return res.status(400).json({message: "You need to provide at least one field to update"}); await guild.update(req.body); res.json({message: "The guild has been updated successfully"}); }); module.exports = app;