From d48b286e4bfc27d872c42a05cc0d3fb7fd71772b Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Fri, 21 May 2021 22:12:21 +0200 Subject: [PATCH] :art: refactor/format --- package-lock.json | Bin 775279 -> 767322 bytes package.json | 7 ++- .../#channel_id/messages/#message_id/index.ts | 10 ++-- .../#channel_id/messages/bulk-delete.ts | 4 +- src/routes/guilds/#guild_id/channels.ts | 14 +++++- src/routes/guilds/#guild_id/delete.ts | 45 +++++++++++++++++ src/routes/guilds/#guild_id/index.ts | 32 +----------- src/routes/guilds/#guild_id/roles.ts | 47 ++++++++---------- src/routes/guilds/#guild_id/vanity-url.ts | 18 +++++++ src/routes/invites/index.ts | 24 ++++++--- src/routes/users/@me/affinities/user.ts | 10 ++++ tsconfig.json | 4 +- 12 files changed, 139 insertions(+), 76 deletions(-) create mode 100644 src/routes/guilds/#guild_id/delete.ts create mode 100644 src/routes/guilds/#guild_id/vanity-url.ts create mode 100644 src/routes/users/@me/affinities/user.ts diff --git a/package-lock.json b/package-lock.json index 2f18498bd6663051d90200515185f0b329ff9719..7f26fdf79e2d17c406f9939dc752c7c584cf625b 100644 GIT binary patch delta 4676 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 delta 8415 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 o1EcEm<*Ox { const { message_id, channel_id } = req.params; const channel = await ChannelModel.findOne({ id: channel_id }, { guild_id: true }); - if (!channel) throw new HTTPError("Channel doesn't exist", 404); + if (!channel) throw new HTTPError("Channel not found", 404); + const message = await MessageModel.findOne({ id: message_id }, { author_id: true }).exec(); + if (!message) throw new HTTPError("Message not found", 404); const permission = await getPermission(req.user_id, channel.guild_id, channel_id); - permission.hasThrow("MANAGE_MESSAGES"); + if (message.author_id !== req.user_id) permission.hasThrow("MANAGE_MESSAGES"); await MessageModel.deleteOne({ id: message_id }).exec(); @@ -25,8 +27,8 @@ router.delete("/", async (req, res) => { data: { id: message_id, channel_id, - guild_id: channel.guild_id, - }, + guild_id: channel.guild_id + } } as MessageDeleteEvent); res.sendStatus(204); diff --git a/src/routes/channels/#channel_id/messages/bulk-delete.ts b/src/routes/channels/#channel_id/messages/bulk-delete.ts index 6ac4d8de..ac032c0e 100644 --- a/src/routes/channels/#channel_id/messages/bulk-delete.ts +++ b/src/routes/channels/#channel_id/messages/bulk-delete.ts @@ -13,7 +13,7 @@ export default router; // TODO: should this request fail, if you provide messages older than 14 days/invalid ids? // https://discord.com/developers/docs/resources/channel#bulk-delete-messages router.post("/", check({ messages: [String] }), async (req, res) => { - const channel_id = req.params.channel_id; + const { channel_id } = req.params; const channel = await ChannelModel.findOne({ id: channel_id }, { permission_overwrites: true, guild_id: true }).exec(); if (!channel?.guild_id) throw new HTTPError("Can't bulk delete dm channel messages", 400); @@ -31,7 +31,7 @@ router.post("/", check({ messages: [String] }), async (req, res) => { await emitEvent({ event: "MESSAGE_DELETE_BULK", channel_id, - data: { ids: messages, channel_id, guild_id: channel.guild_id }, + data: { ids: messages, channel_id, guild_id: channel.guild_id } } as MessageDeleteBulkEvent); res.sendStatus(204); diff --git a/src/routes/guilds/#guild_id/channels.ts b/src/routes/guilds/#guild_id/channels.ts index 9e8d3506..5c90b5b9 100644 --- a/src/routes/guilds/#guild_id/channels.ts +++ b/src/routes/guilds/#guild_id/channels.ts @@ -1,5 +1,14 @@ import { Router } from "express"; -import { ChannelCreateEvent, ChannelModel, ChannelType, GuildModel, Snowflake, toObject, ChannelUpdateEvent } from "@fosscord/server-util"; +import { + ChannelCreateEvent, + ChannelModel, + ChannelType, + GuildModel, + Snowflake, + toObject, + ChannelUpdateEvent, + AnyChannel +} from "@fosscord/server-util"; import { HTTPError } from "lambert-server"; import { ChannelModifySchema } from "../../../schema/Channel"; import { emitEvent } from "../../../util/Event"; @@ -45,7 +54,8 @@ router.post("/", check(ChannelModifySchema), async (req, res) => { ...body, id: Snowflake.generate(), created_at: new Date(), - guild_id + guild_id, + recipients: null }; await new ChannelModel(channel).save(); diff --git a/src/routes/guilds/#guild_id/delete.ts b/src/routes/guilds/#guild_id/delete.ts new file mode 100644 index 00000000..5d4db816 --- /dev/null +++ b/src/routes/guilds/#guild_id/delete.ts @@ -0,0 +1,45 @@ +import { + ChannelModel, + EmojiModel, + GuildDeleteEvent, + GuildModel, + InviteModel, + MessageModel, + RoleModel, + UserModel +} from "@fosscord/server-util"; +import { Router, Request, Response } from "express"; +import { HTTPError } from "lambert-server"; +import { emitEvent } from "../../../util/Event"; + +const router = Router(); + +// discord prefixes this route with /delete instead of using the delete method +// docs are wrong https://discord.com/developers/docs/resources/guild#delete-guild +router.post("/", async (req: Request, res: Response) => { + var { guild_id } = req.params; + + 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.user_id) throw new HTTPError("You are not the owner of this guild", 401); + + await emitEvent({ + event: "GUILD_DELETE", + data: { + id: guild_id + }, + guild_id: guild_id + } 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.sendStatus(204); +}); + +export default router; diff --git a/src/routes/guilds/#guild_id/index.ts b/src/routes/guilds/#guild_id/index.ts index 18e6372e..47675609 100644 --- a/src/routes/guilds/#guild_id/index.ts +++ b/src/routes/guilds/#guild_id/index.ts @@ -11,7 +11,7 @@ import { MessageModel, RoleModel, toObject, - UserModel, + UserModel } from "@fosscord/server-util"; import { HTTPError } from "lambert-server"; import { GuildUpdateSchema } from "../../../schema/Guild"; @@ -54,41 +54,13 @@ router.patch("/", check(GuildUpdateSchema), async (req: Request, res: Response) return res.send(data); }); -// discord prefixes this route with /delete instead of using the delete method -// docs are wrong https://discord.com/developers/docs/resources/guild#delete-guild -router.post("/delete", async (req: Request, res: Response) => { - var { guild_id } = req.params; - - 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.user_id) throw new HTTPError("You are not the owner of this guild", 401); - - await emitEvent({ - event: "GUILD_DELETE", - data: { - id: guild_id, - }, - guild_id: guild_id, - } 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.sendStatus(204); -}); - router.get("/vanity-url", async (req: Request, res: Response) => { const { guild_id } = req.params; const guild = await GuildModel.findOne({ id: guild_id }).exec(); if (!guild) throw new HTTPError("Guild does not exist", 404); - if(!guild.vanity_url) throw new HTTPError("This guild has no vanity url", 204) + if (!guild.vanity_url) throw new HTTPError("This guild has no vanity url", 204); return res.json(guild.vanity_url); }); diff --git a/src/routes/guilds/#guild_id/roles.ts b/src/routes/guilds/#guild_id/roles.ts index 9e42f8d9..c663fea1 100644 --- a/src/routes/guilds/#guild_id/roles.ts +++ b/src/routes/guilds/#guild_id/roles.ts @@ -15,14 +15,13 @@ router.get("/", async (req: Request, res: Response) => { if (!guild) throw new HTTPError("Guild not found", 404); var roles = await RoleModel.find({ guild_id: guild_id }).exec(); - if(!roles) res.send("No roles"); + if (!roles) res.send("No roles"); return res.json(toObject(roles)); }); router.post("/", check(RoleCreateSchema), async (req: Request, res: Response) => { - - const guild_id = req.params.guild_id; - const body = req.body as RoleCreateSchema; + const guild_id = req.params.guild_id; + const body = req.body as RoleCreateSchema; const guild = await GuildModel.findOne({ id: guild_id }, { id: true }).exec(); if (!guild) throw new HTTPError("Guild not found", 404); @@ -32,8 +31,7 @@ router.post("/", check(RoleCreateSchema), async (req: Request, res: Response) => const perms = await getPermission(req.user_id, guild_id); - if (!perms.has("MANAGE_ROLES")) - throw new HTTPError("You missing the MANAGE_ROLES permission", 401); + if (!perms.has("MANAGE_ROLES")) throw new HTTPError("You missing the MANAGE_ROLES permission", 401); const role_id = Snowflake.generate(); @@ -43,17 +41,16 @@ router.post("/", check(RoleCreateSchema), async (req: Request, res: Response) => guild_id: guild_id, managed: false, position: 0, - tags: null, - } + tags: null + }; const roleNew = await new RoleModel(role).save(); res.json(toObject(roleNew)).send(); }); router.delete("/:role_id", async (req: Request, res: Response) => { - - const guild_id = req.params.guild_id; - const { role_id } = req.params; + const guild_id = req.params.guild_id; + const { role_id } = req.params; const guild = await GuildModel.findOne({ id: guild_id }, { id: true }).exec(); if (!guild) throw new HTTPError("Guild not found", 404); @@ -64,8 +61,7 @@ router.delete("/:role_id", async (req: Request, res: Response) => { const perms = await getPermission(req.user_id, guild_id); - if (!perms.has("MANAGE_ROLES")) - throw new HTTPError("You missing the MANAGE_ROLES permission", 401); + if (!perms.has("MANAGE_ROLES")) throw new HTTPError("You missing the MANAGE_ROLES permission", 401); await RoleModel.findOneAndDelete({ id: role_id, @@ -75,10 +71,11 @@ router.delete("/:role_id", async (req: Request, res: Response) => { res.send("Deleted"); }); +// TODO: check role hierarchy router.patch("/:role_id", check(RoleModifySchema), async (req: Request, res: Response) => { - const guild_id = req.params.guild_id; - const { role_id } = req.params; + const guild_id = req.params.guild_id; + const { role_id } = req.params; const guild = await GuildModel.findOne({ id: guild_id }, { id: true }).exec(); if (!guild) throw new HTTPError("Guild not found", 404); @@ -87,20 +84,18 @@ router.patch("/:role_id", check(RoleModifySchema), async (req: Request, res: Res const user = await UserModel.findOne({ id: req.user_id }).exec(); if (!user) throw new HTTPError("User not found", 404); - const role = await RoleModel.findOne({ id: role_id, guild_id: guild_id }).exec(); - if (!role) throw new HTTPError("role not found", 404); - const perms = await getPermission(req.user_id, guild_id); + perms.hasThrow("MANAGE_ROLES"); - if (!perms.has("MANAGE_ROLES")) - throw new HTTPError("You missing the MANAGE_ROLES permission", 401); + const role = await RoleModel.findOneAndUpdate( + { + id: role_id, + guild_id: guild_id + }, + ...req.body + ).exec(); - var roleObj = await RoleModel.findOneAndUpdate({ - id: role_id, guild_id: guild_id - }, ...req.body).exec(); - - res.json(toObject(roleObj)).send(); + res.json(toObject(role)); }); - export default router; diff --git a/src/routes/guilds/#guild_id/vanity-url.ts b/src/routes/guilds/#guild_id/vanity-url.ts new file mode 100644 index 00000000..052a638f --- /dev/null +++ b/src/routes/guilds/#guild_id/vanity-url.ts @@ -0,0 +1,18 @@ +import { GuildModel } from "@fosscord/server-util"; +import { Router, Request, Response } from "express"; +import { HTTPError } from "lambert-server"; + +const router = Router(); + +router.get("/", async (req: Request, res: Response) => { + const { guild_id } = req.params; + + const guild = await GuildModel.findOne({ id: guild_id }).exec(); + if (!guild) throw new HTTPError("Guild does not exist", 404); + + if (!guild.vanity_url) throw new HTTPError("This guild has no vanity url", 204); + + return res.json({ vanity_ur: guild.vanity_url }); +}); + +export default router; diff --git a/src/routes/invites/index.ts b/src/routes/invites/index.ts index 7f4ff59b..8c04713c 100644 --- a/src/routes/invites/index.ts +++ b/src/routes/invites/index.ts @@ -1,19 +1,31 @@ import { Router, Request, Response } from "express"; import { getPermission, InviteModel, toObject } from "@fosscord/server-util"; import { HTTPError } from "lambert-server"; +import { addMember } from "../../util/Member"; const router: Router = Router(); -router.get("/:invite_code", async (req: Request, res: Response) => { - const { invite_code: code } = req.params; +router.get("/:code", async (req: Request, res: Response) => { + const { code } = req.params; const invite = await InviteModel.findOne({ code }).exec(); - if (!invite) throw new HTTPError("Unknown Invite", 404); - res.status(200).send({ invite: toObject(invite) }); + + res.status(200).send(toObject(invite)); }); -router.delete("/:invite_code", async (req: Request, res: Response) => { - const { invite_code: code } = req.params; +router.post("/:code", async (req: Request, res: Response) => { + const { code } = req.params; + + const invite = await InviteModel.findOneAndUpdate({ code }, { $inc: { uses: 1 } }).exec(); + if (!invite) throw new HTTPError("Unknown Invite", 404); + + await addMember(req.user_id, invite.guild_id); + + res.status(200).send(toObject(invite)); +}); + +router.delete("/:code", async (req: Request, res: Response) => { + const { code } = req.params; const invite = await InviteModel.findOne({ code }).exec(); if (!invite) throw new HTTPError("Unknown Invite", 404); diff --git a/src/routes/users/@me/affinities/user.ts b/src/routes/users/@me/affinities/user.ts new file mode 100644 index 00000000..2e435995 --- /dev/null +++ b/src/routes/users/@me/affinities/user.ts @@ -0,0 +1,10 @@ +import { Router } from "express"; + +const router = Router(); + +router.get("/", (req, res) => { + // TODO: + res.status(200).send({ user_affinities: [], inverse_user_affinities: [] }); +}); + +export default router; diff --git a/tsconfig.json b/tsconfig.json index 1d4f4886..6bf2e6b7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,11 +1,11 @@ { - "include": ["src/**/*.ts", "src/test/rethink_test.ts.disabled"], + "include": ["src/**/*.ts"], "compilerOptions": { /* Visit https://aka.ms/tsconfig.json to read more about this file */ /* Basic Options */ // "incremental": true, /* Enable incremental compilation */ - "target": "ES2020" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, + "target": "ESNext" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, "lib": ["ES2020"] /* Specify library files to be included in the compilation. */, "allowJs": true /* Allow javascript files to be compiled. */,