From bed535d041b1bf868a4edab83ded25e9a25cf5b7 Mon Sep 17 00:00:00 2001 From: LachlanCourt Date: Tue, 5 Jul 2022 00:14:26 +1000 Subject: Create role subdirectory and add GET api route --- api/src/routes/guilds/#guild_id/roles.ts | 164 --------------------- .../guilds/#guild_id/roles/#role_id/index.ts | 145 ++++++++++++++++++ api/src/routes/guilds/#guild_id/roles/index.ts | 164 +++++++++++++++++++++ 3 files changed, 309 insertions(+), 164 deletions(-) delete mode 100644 api/src/routes/guilds/#guild_id/roles.ts create mode 100644 api/src/routes/guilds/#guild_id/roles/#role_id/index.ts create mode 100644 api/src/routes/guilds/#guild_id/roles/index.ts (limited to 'api/src') diff --git a/api/src/routes/guilds/#guild_id/roles.ts b/api/src/routes/guilds/#guild_id/roles.ts deleted file mode 100644 index b6894e3f..00000000 --- a/api/src/routes/guilds/#guild_id/roles.ts +++ /dev/null @@ -1,164 +0,0 @@ -import { Request, Response, Router } from "express"; -import { - Role, - getPermission, - Member, - GuildRoleCreateEvent, - GuildRoleUpdateEvent, - GuildRoleDeleteEvent, - emitEvent, - Config, - DiscordApiErrors, - handleFile -} from "@fosscord/util"; -import { HTTPError } from "lambert-server"; -import { route } from "@fosscord/api"; - -const router: Router = Router(); - -export interface RoleModifySchema { - name?: string; - permissions?: string; - color?: number; - hoist?: boolean; // whether the role should be displayed separately in the sidebar - mentionable?: boolean; // whether the role should be mentionable - position?: number; - icon?: string; - unicode_emoji?: string; -} - -export type RolePositionUpdateSchema = { - id: string; - position: number; -}[]; - -router.get("/", route({}), async (req: Request, res: Response) => { - const guild_id = req.params.guild_id; - - await Member.IsInGuildOrFail(req.user_id, guild_id); - - const roles = await Role.find({ guild_id: guild_id }); - - return res.json(roles); -}); - -router.post("/", route({ body: "RoleModifySchema", permission: "MANAGE_ROLES" }), async (req: Request, res: Response) => { - const guild_id = req.params.guild_id; - const body = req.body as RoleModifySchema; - - const role_count = await Role.count({ guild_id }); - const { maxRoles } = Config.get().limits.guild; - - if (role_count > maxRoles) throw DiscordApiErrors.MAXIMUM_ROLES.withParams(maxRoles); - - const role = new Role({ - // values before ...body are default and can be overriden - position: 0, - hoist: false, - color: 0, - mentionable: false, - ...body, - guild_id: guild_id, - managed: false, - permissions: String(req.permission!.bitfield & BigInt(body.permissions || "0")), - tags: undefined, - icon: null, - unicode_emoji: null - }); - - await Promise.all([ - role.save(), - emitEvent({ - event: "GUILD_ROLE_CREATE", - guild_id, - data: { - guild_id, - role: role - } - } as GuildRoleCreateEvent) - ]); - - res.json(role); -}); - -router.delete("/:role_id", route({ permission: "MANAGE_ROLES" }), async (req: Request, res: Response) => { - const guild_id = req.params.guild_id; - const { role_id } = req.params; - if (role_id === guild_id) throw new HTTPError("You can't delete the @everyone role"); - - await Promise.all([ - Role.delete({ - id: role_id, - guild_id: guild_id - }), - emitEvent({ - event: "GUILD_ROLE_DELETE", - guild_id, - data: { - guild_id, - role_id - } - } as GuildRoleDeleteEvent) - ]); - - res.sendStatus(204); -}); - -// TODO: check role hierarchy - -router.patch("/:role_id", route({ body: "RoleModifySchema", permission: "MANAGE_ROLES" }), async (req: Request, res: Response) => { - const { role_id, guild_id } = req.params; - const body = req.body as RoleModifySchema; - - if (body.icon) body.icon = await handleFile(`/role-icons/${role_id}`, body.icon as string); - - const role = new Role({ - ...body, - id: role_id, - guild_id, - permissions: String(req.permission!.bitfield & BigInt(body.permissions || "0")) - }); - - await Promise.all([ - role.save(), - emitEvent({ - event: "GUILD_ROLE_UPDATE", - guild_id, - data: { - guild_id, - role - } - } as GuildRoleUpdateEvent) - ]); - - res.json(role); -}); - -router.patch("/", route({ body: "RolePositionUpdateSchema" }), async (req: Request, res: Response) => { - const { guild_id } = req.params; - const body = req.body as RolePositionUpdateSchema; - - const perms = await getPermission(req.user_id, guild_id); - perms.hasThrow("MANAGE_ROLES"); - - await Promise.all(body.map(async (x) => Role.update({ guild_id, id: x.id }, { position: x.position }))); - - const roles = await Role.find({ where: body.map((x) => ({ id: x.id, guild_id })) }); - - await Promise.all( - roles.map((x) => - emitEvent({ - event: "GUILD_ROLE_UPDATE", - guild_id, - data: { - guild_id, - role: x - } - } as GuildRoleUpdateEvent) - ) - ); - - res.json(roles); -}); - -export default router; diff --git a/api/src/routes/guilds/#guild_id/roles/#role_id/index.ts b/api/src/routes/guilds/#guild_id/roles/#role_id/index.ts new file mode 100644 index 00000000..69c2143d --- /dev/null +++ b/api/src/routes/guilds/#guild_id/roles/#role_id/index.ts @@ -0,0 +1,145 @@ +import { Router, Request, Response } from "express"; +import { + Role, + getPermission, + Member, + GuildRoleCreateEvent, + GuildRoleUpdateEvent, + GuildRoleDeleteEvent, + emitEvent, + Config, + DiscordApiErrors, + handleFile +} from "@fosscord/util"; +import { route } from "@fosscord/api"; +import {RoleModifySchema, RolePositionUpdateSchema} from '../' + +const router = Router(); + +router.get("/",route({}), async (req: Request, res: Response) => { + const { guild_id, role_id } = req.params + await Member.IsInGuildOrFail(req.user_id, guild_id); + const role = await Role.find({ guild_id: guild_id }).find((r: {id: string}) => r.id === role_id); + return res.json(role); +}); + +// router.post("/", route({ body: "RoleModifySchema", permission: "MANAGE_ROLES" }), async (req: Request, res: Response) => { +// const guild_id = req.params.guild_id; +// const body = req.body as RoleModifySchema; + +// const role_count = await Role.count({ guild_id }); +// const { maxRoles } = Config.get().limits.guild; + +// if (role_count > maxRoles) throw DiscordApiErrors.MAXIMUM_ROLES.withParams(maxRoles); + +// const role = new Role({ +// // values before ...body are default and can be overriden +// position: 0, +// hoist: false, +// color: 0, +// mentionable: false, +// ...body, +// guild_id: guild_id, +// managed: false, +// permissions: String(req.permission!.bitfield & BigInt(body.permissions || "0")), +// tags: undefined, +// icon: null, +// unicode_emoji: null +// }); + +// await Promise.all([ +// role.save(), +// emitEvent({ +// event: "GUILD_ROLE_CREATE", +// guild_id, +// data: { +// guild_id, +// role: role +// } +// } as GuildRoleCreateEvent) +// ]); + +// res.json(role); +// }); + +// router.delete("/:role_id", route({ permission: "MANAGE_ROLES" }), async (req: Request, res: Response) => { +// const guild_id = req.params.guild_id; +// const { role_id } = req.params; +// if (role_id === guild_id) throw new HTTPError("You can't delete the @everyone role"); + +// await Promise.all([ +// Role.delete({ +// id: role_id, +// guild_id: guild_id +// }), +// emitEvent({ +// event: "GUILD_ROLE_DELETE", +// guild_id, +// data: { +// guild_id, +// role_id +// } +// } as GuildRoleDeleteEvent) +// ]); + +// res.sendStatus(204); +// }); + +// // TODO: check role hierarchy + +// router.patch("/:role_id", route({ body: "RoleModifySchema", permission: "MANAGE_ROLES" }), async (req: Request, res: Response) => { +// const { role_id, guild_id } = req.params; +// const body = req.body as RoleModifySchema; + +// if (body.icon) body.icon = await handleFile(`/role-icons/${role_id}`, body.icon as string); + +// const role = new Role({ +// ...body, +// id: role_id, +// guild_id, +// permissions: String(req.permission!.bitfield & BigInt(body.permissions || "0")) +// }); + +// await Promise.all([ +// role.save(), +// emitEvent({ +// event: "GUILD_ROLE_UPDATE", +// guild_id, +// data: { +// guild_id, +// role +// } +// } as GuildRoleUpdateEvent) +// ]); + +// res.json(role); +// }); + +// router.patch("/", route({ body: "RolePositionUpdateSchema" }), async (req: Request, res: Response) => { +// const { guild_id } = req.params; +// const body = req.body as RolePositionUpdateSchema; + +// const perms = await getPermission(req.user_id, guild_id); +// perms.hasThrow("MANAGE_ROLES"); + +// await Promise.all(body.map(async (x) => Role.update({ guild_id, id: x.id }, { position: x.position }))); + +// const roles = await Role.find({ where: body.map((x) => ({ id: x.id, guild_id })) }); + +// await Promise.all( +// roles.map((x) => +// emitEvent({ +// event: "GUILD_ROLE_UPDATE", +// guild_id, +// data: { +// guild_id, +// role: x +// } +// } as GuildRoleUpdateEvent) +// ) +// ); + +// res.json(roles); +// }); + +export default router; diff --git a/api/src/routes/guilds/#guild_id/roles/index.ts b/api/src/routes/guilds/#guild_id/roles/index.ts new file mode 100644 index 00000000..b6894e3f --- /dev/null +++ b/api/src/routes/guilds/#guild_id/roles/index.ts @@ -0,0 +1,164 @@ +import { Request, Response, Router } from "express"; +import { + Role, + getPermission, + Member, + GuildRoleCreateEvent, + GuildRoleUpdateEvent, + GuildRoleDeleteEvent, + emitEvent, + Config, + DiscordApiErrors, + handleFile +} from "@fosscord/util"; +import { HTTPError } from "lambert-server"; +import { route } from "@fosscord/api"; + +const router: Router = Router(); + +export interface RoleModifySchema { + name?: string; + permissions?: string; + color?: number; + hoist?: boolean; // whether the role should be displayed separately in the sidebar + mentionable?: boolean; // whether the role should be mentionable + position?: number; + icon?: string; + unicode_emoji?: string; +} + +export type RolePositionUpdateSchema = { + id: string; + position: number; +}[]; + +router.get("/", route({}), async (req: Request, res: Response) => { + const guild_id = req.params.guild_id; + + await Member.IsInGuildOrFail(req.user_id, guild_id); + + const roles = await Role.find({ guild_id: guild_id }); + + return res.json(roles); +}); + +router.post("/", route({ body: "RoleModifySchema", permission: "MANAGE_ROLES" }), async (req: Request, res: Response) => { + const guild_id = req.params.guild_id; + const body = req.body as RoleModifySchema; + + const role_count = await Role.count({ guild_id }); + const { maxRoles } = Config.get().limits.guild; + + if (role_count > maxRoles) throw DiscordApiErrors.MAXIMUM_ROLES.withParams(maxRoles); + + const role = new Role({ + // values before ...body are default and can be overriden + position: 0, + hoist: false, + color: 0, + mentionable: false, + ...body, + guild_id: guild_id, + managed: false, + permissions: String(req.permission!.bitfield & BigInt(body.permissions || "0")), + tags: undefined, + icon: null, + unicode_emoji: null + }); + + await Promise.all([ + role.save(), + emitEvent({ + event: "GUILD_ROLE_CREATE", + guild_id, + data: { + guild_id, + role: role + } + } as GuildRoleCreateEvent) + ]); + + res.json(role); +}); + +router.delete("/:role_id", route({ permission: "MANAGE_ROLES" }), async (req: Request, res: Response) => { + const guild_id = req.params.guild_id; + const { role_id } = req.params; + if (role_id === guild_id) throw new HTTPError("You can't delete the @everyone role"); + + await Promise.all([ + Role.delete({ + id: role_id, + guild_id: guild_id + }), + emitEvent({ + event: "GUILD_ROLE_DELETE", + guild_id, + data: { + guild_id, + role_id + } + } as GuildRoleDeleteEvent) + ]); + + res.sendStatus(204); +}); + +// TODO: check role hierarchy + +router.patch("/:role_id", route({ body: "RoleModifySchema", permission: "MANAGE_ROLES" }), async (req: Request, res: Response) => { + const { role_id, guild_id } = req.params; + const body = req.body as RoleModifySchema; + + if (body.icon) body.icon = await handleFile(`/role-icons/${role_id}`, body.icon as string); + + const role = new Role({ + ...body, + id: role_id, + guild_id, + permissions: String(req.permission!.bitfield & BigInt(body.permissions || "0")) + }); + + await Promise.all([ + role.save(), + emitEvent({ + event: "GUILD_ROLE_UPDATE", + guild_id, + data: { + guild_id, + role + } + } as GuildRoleUpdateEvent) + ]); + + res.json(role); +}); + +router.patch("/", route({ body: "RolePositionUpdateSchema" }), async (req: Request, res: Response) => { + const { guild_id } = req.params; + const body = req.body as RolePositionUpdateSchema; + + const perms = await getPermission(req.user_id, guild_id); + perms.hasThrow("MANAGE_ROLES"); + + await Promise.all(body.map(async (x) => Role.update({ guild_id, id: x.id }, { position: x.position }))); + + const roles = await Role.find({ where: body.map((x) => ({ id: x.id, guild_id })) }); + + await Promise.all( + roles.map((x) => + emitEvent({ + event: "GUILD_ROLE_UPDATE", + guild_id, + data: { + guild_id, + role: x + } + } as GuildRoleUpdateEvent) + ) + ); + + res.json(roles); +}); + +export default router; -- cgit 1.5.1