diff --git "a/src/routes/api/v8/guilds/\043id/bans.ts" "b/src/routes/api/v8/guilds/\043id/bans.ts" index 8e6e35d..aaae39c 100644 --- "a/src/routes/api/v8/guilds/\043id/bans.ts" +++ "b/src/routes/api/v8/guilds/\043id/bans.ts" @@ -65,7 +65,7 @@ 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/\043id/index.ts" "b/src/routes/api/v8/guilds/\043id/index.ts" index 38fbd5f..09f2a5c 100644 --- "a/src/routes/api/v8/guilds/\043id/index.ts" +++ "b/src/routes/api/v8/guilds/\043id/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 @@ 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.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 @@ } 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/\043id/members.ts" "b/src/routes/api/v8/guilds/\043id/members.ts" new file mode 100644 index 0000000..0aed61a --- /dev/null +++ "b/src/routes/api/v8/guilds/\043id/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/\043id/members/index.ts" "b/src/routes/api/v8/guilds/\043id/members/index.ts" deleted file mode 100644 index 3b422dd..0000000 --- "a/src/routes/api/v8/guilds/\043id/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 54b2d2a..7179ea9 100644 --- a/src/routes/api/v8/guilds/index.ts +++ b/src/routes/api/v8/guilds/index.ts @@ -59,8 +59,8 @@ }; 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,