From 1dd1e5724f8d654f3e7e4f3ed3eccf017391e7f7 Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Thu, 4 Mar 2021 22:01:25 +0100 Subject: :art: improve guilds --- src/routes/api/v8/guilds/#id/bans.ts | 2 +- src/routes/api/v8/guilds/#id/index.ts | 23 +++++++++-- src/routes/api/v8/guilds/#id/members.ts | 54 ++++++++++++++++++++++++++ src/routes/api/v8/guilds/#id/members/index.ts | 56 --------------------------- src/routes/api/v8/guilds/index.ts | 4 +- 5 files changed, 77 insertions(+), 62 deletions(-) create mode 100644 src/routes/api/v8/guilds/#id/members.ts delete mode 100644 src/routes/api/v8/guilds/#id/members/index.ts (limited to 'src') diff --git a/src/routes/api/v8/guilds/#id/bans.ts b/src/routes/api/v8/guilds/#id/bans.ts index 8e6e35de..aaae39cb 100644 --- a/src/routes/api/v8/guilds/#id/bans.ts +++ b/src/routes/api/v8/guilds/#id/bans.ts @@ -65,7 +65,7 @@ router.delete("/:userid", async (req: Request, res: Response) => { var banned_user_id = BigInt(req.params.userid); const banned_user = await getPublicUser(banned_user_id); - const guild = await GuildModel.findOne({ id: guild_id }).exec(); + const guild = await GuildModel.findOne({ id: guild_id }, { id: true }).exec(); if (!guild) throw new HTTPError("Guild not found", 404); const perms = await getPermission(req.userid, guild.id); diff --git a/src/routes/api/v8/guilds/#id/index.ts b/src/routes/api/v8/guilds/#id/index.ts index 38fbd5f2..09f2a5c2 100644 --- a/src/routes/api/v8/guilds/#id/index.ts +++ b/src/routes/api/v8/guilds/#id/index.ts @@ -1,5 +1,16 @@ import { Request, Response, Router } from "express"; -import { getPermission, GuildDeleteEvent, GuildModel, MemberModel } from "fosscord-server-util"; +import { + ChannelModel, + EmojiModel, + getPermission, + GuildDeleteEvent, + GuildModel, + InviteModel, + MemberModel, + MessageModel, + RoleModel, + UserModel, +} from "fosscord-server-util"; import { HTTPError } from "lambert-server"; import { GuildUpdateSchema } from "../../../../../schema/Guild"; import { emitEvent } from "../../../../../util/Event"; @@ -11,7 +22,7 @@ router.get("/", async (req: Request, res: Response) => { const guild_id = BigInt(req.params.id); const guild = await GuildModel.findOne({ id: guild_id }).exec(); - if (!guild) throw new HTTPError("Guild does not exist"); + if (!guild) throw new HTTPError("Guild does not exist", 404); const member = await MemberModel.findOne({ guild_id: guild_id, id: req.userid }, "id").exec(); if (!member) throw new HTTPError("You are not a member of the guild you are trying to access", 401); @@ -36,7 +47,7 @@ router.patch("/", check(GuildUpdateSchema), async (req: Request, res: Response) router.delete("/", async (req: Request, res: Response) => { var guild_id = BigInt(req.params.id); - const guild = await GuildModel.findOne({ id: BigInt(req.params.id) }, "owner_id").exec(); + const guild = await GuildModel.findOne({ id: guild_id }, "owner_id").exec(); if (!guild) throw new HTTPError("This guild does not exist", 404); if (guild.owner_id !== req.userid) throw new HTTPError("You are not the owner of this guild", 401); @@ -49,6 +60,12 @@ router.delete("/", async (req: Request, res: Response) => { } as GuildDeleteEvent); await GuildModel.deleteOne({ id: guild_id }).exec(); + await UserModel.updateMany({ guilds: guild_id }, { $pull: { guilds: guild_id } }).exec(); + await RoleModel.deleteMany({ guild_id }).exec(); + await ChannelModel.deleteMany({ guild_id }).exec(); + await EmojiModel.deleteMany({ guild_id }).exec(); + await InviteModel.deleteMany({ guild_id }).exec(); + await MessageModel.deleteMany({ guild_id }).exec(); return res.status(204).send(); }); diff --git a/src/routes/api/v8/guilds/#id/members.ts b/src/routes/api/v8/guilds/#id/members.ts new file mode 100644 index 00000000..0aed61ae --- /dev/null +++ b/src/routes/api/v8/guilds/#id/members.ts @@ -0,0 +1,54 @@ +import { Request, Response, Router } from "express"; +import { GuildModel, MemberModel } from "fosscord-server-util"; +import { HTTPError } from "lambert-server"; +import { instanceOf, Length } from "../../../../../util/instanceOf"; +import { PublicMemberProjection } from "../../../../../util/Member"; +import { PublicUserProjection } from "../../../../../util/User"; + +const router = Router(); + +// TODO: not allowed for user -> only allowed for bots with privileged intents +// TODO: send over websocket +router.get("/", async (req: Request, res: Response) => { + const guild_id = BigInt(req.params.id); + const guild = await GuildModel.findOne({ id: guild_id }).exec(); + if (!guild) throw new HTTPError("Guild not found", 404); + + try { + instanceOf({ $limit: new Length(Number, 1, 1000), $after: BigInt }, req.query, { + path: "query", + req, + ref: { obj: null, key: "" }, + }); + } catch (error) { + return res.status(400).json({ code: 50035, message: "Invalid Query", success: false, errors: error }); + } + + // @ts-ignore + if (!req.query.limit) req.query.limit = 1; + const { limit, after } = (req.query) as { limit: number; after: bigint }; + const query = after ? { id: { $gt: after } } : {}; + + var members = await MemberModel.find({ guild_id, ...query }, PublicMemberProjection) + .limit(limit) + .populate({ path: "user", select: PublicUserProjection }) + .exec(); + + return res.json(members); +}); + +router.get("/:member", async (req: Request, res: Response) => { + const guild_id = BigInt(req.params.id); + const user_id = BigInt(req.params.member); + + const member = await MemberModel.findOne({ id: user_id, guild_id }).populate({ path: "user", select: PublicUserProjection }).exec(); + if (!member) throw new HTTPError("Member not found", 404); + + return res.json(member); +}); + +router.put("/:member", async (req: Request, res: Response) => { + // https://discord.com/developers/docs/resources/guild#add-guild-member +}); + +export default router; diff --git a/src/routes/api/v8/guilds/#id/members/index.ts b/src/routes/api/v8/guilds/#id/members/index.ts deleted file mode 100644 index 3b422dd0..00000000 --- a/src/routes/api/v8/guilds/#id/members/index.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { Request, Response, Router } from "express"; -import { GuildModel, MemberModel } from "fosscord-server-util"; -import { HTTPError } from "lambert-server"; -import { instanceOf, Length } from "../../../../../../util/instanceOf"; -import { PublicMemberProjection } from "../../../../../../util/Member"; -import { PublicUserProjection } from "../../../../../../util/User"; - -const router = Router(); - -// TODO: not allowed for user -> only allowed for bots with privileged intents -// TODO: send over websocket -router.get("/", async (req: Request, res: Response) => { - const guild_id = BigInt(req.params.id); - const guild = await GuildModel.findOne({ id: guild_id }).exec(); - if (!guild) throw new HTTPError("Guild not found", 404); - - try { - instanceOf({ $limit: new Length(Number, 1, 1000), $after: BigInt }, req.query, { - path: "query", - req, - ref: { obj: null, key: "" }, - }); - } catch (error) { - return res.status(400).json({ code: 50035, message: "Invalid Form Body", success: false, errors: error }); - } - - // @ts-ignore - if (!req.query.limit) req.query.limit = 1; - const { limit, after } = (req.query) as { limit: number; after: bigint }; - const query = after ? { id: { $gt: after } } : {}; - - var members = await MemberModel.find({ guild_id, ...query }, PublicMemberProjection) - .limit(limit) - .populate({ path: "user", select: PublicUserProjection }) - .exec(); - - return res.json(members); -}); - -router.get("/:member", async (req: Request, res: Response) => { - const guild_id = BigInt(req.params.id); - const user_id = BigInt(req.params.member); - - const member = await MemberModel.findOne({ id: user_id, guild_id }) - .populate({ path: "user", select: PublicUserProjection }) - .exec(); - if (!member) throw new HTTPError("Member not found", 404); - - return res.json(member); -}); - -router.put("/:member", async (req: Request, res: Response) => { - // https://discord.com/developers/docs/resources/guild#add-guild-member -}); - -export default router; diff --git a/src/routes/api/v8/guilds/index.ts b/src/routes/api/v8/guilds/index.ts index 54b2d2a4..7179ea9e 100644 --- a/src/routes/api/v8/guilds/index.ts +++ b/src/routes/api/v8/guilds/index.ts @@ -59,8 +59,8 @@ router.post("/", check(GuildCreateSchema), async (req: Request, res: Response) = }; await Promise.all([ - await new GuildModel(guild).save(), - await new RoleModel({ + new GuildModel(guild).save(), + new RoleModel({ id: guild_id, guild_id: guild_id, color: 0, -- cgit 1.5.1