From 371dbf25c9d11a776b26e285d4d28a51ab07b4ac Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Sun, 25 Apr 2021 19:41:55 +0200 Subject: [PATCH 1/4] :sparkles: Message delete route --- .../#channel_id/messages/#message_id/index.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/routes/channels/#channel_id/messages/#message_id/index.ts b/src/routes/channels/#channel_id/messages/#message_id/index.ts index 014daee7..b01a5af2 100644 --- a/src/routes/channels/#channel_id/messages/#message_id/index.ts +++ b/src/routes/channels/#channel_id/messages/#message_id/index.ts @@ -1,6 +1,23 @@ +import { ChannelModel, getPermission, MessageModel } from "@fosscord/server-util"; import { Router } from "express"; +import { HTTPError } from "lambert-server"; +import { check } from "../../../../../util/instanceOf"; const router = Router(); // TODO: +router.delete("/", async (req, res) => { + 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); + + const permission = await getPermission(req.user_id, channel.guild_id, channel_id); + permission.hasThrow("MANAGE_MESSAGES"); + + await MessageModel.deleteOne({ id: message_id }).exec(); + + res.sendStatus(204); +}); + export default router; From 6722c1556c690718039096aa1810bf534f793728 Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Sun, 25 Apr 2021 19:46:33 +0200 Subject: [PATCH 2/4] :bug: add event for Message Delete route --- .../#channel_id/messages/#message_id/index.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/routes/channels/#channel_id/messages/#message_id/index.ts b/src/routes/channels/#channel_id/messages/#message_id/index.ts index b01a5af2..19efc823 100644 --- a/src/routes/channels/#channel_id/messages/#message_id/index.ts +++ b/src/routes/channels/#channel_id/messages/#message_id/index.ts @@ -1,6 +1,7 @@ -import { ChannelModel, getPermission, MessageModel } from "@fosscord/server-util"; +import { ChannelModel, getPermission, MessageDeleteEvent, MessageModel } from "@fosscord/server-util"; import { Router } from "express"; import { HTTPError } from "lambert-server"; +import { emitEvent } from "../../../../../util/Event"; import { check } from "../../../../../util/instanceOf"; const router = Router(); @@ -17,6 +18,17 @@ router.delete("/", async (req, res) => { await MessageModel.deleteOne({ id: message_id }).exec(); + await emitEvent({ + event: "MESSAGE_DELETE", + channel_id, + guild_id: channel.guild_id, + data: { + id: message_id, + channel_id, + guild_id: channel.guild_id, + }, + } as MessageDeleteEvent); + res.sendStatus(204); }); From 5dd97905ab03bb50878191bee403b0cb23329636 Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Sun, 25 Apr 2021 19:46:57 +0200 Subject: [PATCH 3/4] :art: formatting files --- package-lock.json | Bin 756156 -> 756135 bytes package.json | 2 +- src/routes/auth/login.ts | 15 +---- .../#channel_id/messages/bulk-delete.ts | 1 + src/routes/users/@me/channels.ts | 54 ++++++------------ src/schema/Channel.ts | 18 ++---- 6 files changed, 28 insertions(+), 62 deletions(-) diff --git a/package-lock.json b/package-lock.json index ea95261705533bcfd88796bdf8190dad66fdb20b..107b4ac00a3d1c3a6dab0f4a9b1fbebe6a7aa124 100644 GIT binary patch delta 290 zcmdlpS#SAdy$$?~jOLpK7!^aNvnO-wPfiHcnEveoqe7^0nNxssiFQu8Z?JiJwsvMv zS($d2MWIu0o@m7 zTSpHFU7Zc%AQnR!*_JTbO5>M_5u?L`9-@skv)dacZDfS%kTh zkD+&EiixRbxQnYnV5MP}qphvd!~;gt7ffSj+b-M47Rxx@dL|d=Xe&NfX0)or0PaocpmnVd4y1zxeSw*y@U#2}gjh&h3n3+P(zE)D?q C_GZNZ diff --git a/package.json b/package.json index f8509916..187aa29e 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ }, "homepage": "https://github.com/fosscord/fosscord-api#readme", "dependencies": { - "@fosscord/server-util": "^1.0.4", + "@fosscord/server-util": "^1.0.7", "@types/jest": "^26.0.22", "bcrypt": "^5.0.0", "body-parser": "^1.19.0", diff --git a/src/routes/auth/login.ts b/src/routes/auth/login.ts index 247ee018..5c43db1b 100644 --- a/src/routes/auth/login.ts +++ b/src/routes/auth/login.ts @@ -25,25 +25,16 @@ router.post( const query: any[] = [{ phone: login }]; if (email) query.push({ email }); - const user = await UserModel.findOne( - { - $or: query, - }, - `user_data.hash id user_settings.locale user_settings.theme` - ).exec(); + const user = await UserModel.findOne({ $or: query }, `user_data.hash id user_settings.locale user_settings.theme`).exec(); if (!user) { - throw FieldErrors({ - login: { message: req.t("auth:login.INVALID_LOGIN"), code: "INVALID_LOGIN" }, - }); + throw FieldErrors({ login: { message: req.t("auth:login.INVALID_LOGIN"), code: "INVALID_LOGIN" } }); } // the salt is saved in the password refer to bcrypt docs const same_password = await bcrypt.compare(password, user.user_data.hash); if (!same_password) { - throw FieldErrors({ - password: { message: req.t("auth:login.INVALID_PASSWORD"), code: "INVALID_PASSWORD" }, - }); + throw FieldErrors({ password: { message: req.t("auth:login.INVALID_PASSWORD"), code: "INVALID_PASSWORD" } }); } const token = await generateToken(user.id); diff --git a/src/routes/channels/#channel_id/messages/bulk-delete.ts b/src/routes/channels/#channel_id/messages/bulk-delete.ts index ff1324d7..bf71404a 100644 --- a/src/routes/channels/#channel_id/messages/bulk-delete.ts +++ b/src/routes/channels/#channel_id/messages/bulk-delete.ts @@ -27,6 +27,7 @@ router.post("/", check({ messages: [String] }), async (req, res) => { if (messages.length > maxBulkDelete) throw new HTTPError(`You cannot delete more than ${maxBulkDelete} messages`); await MessageModel.deleteMany({ id: { $in: messages } }).exec(); + await emitEvent({ event: "MESSAGE_DELETE_BULK", channel_id, diff --git a/src/routes/users/@me/channels.ts b/src/routes/users/@me/channels.ts index 45371b34..3b2b6781 100644 --- a/src/routes/users/@me/channels.ts +++ b/src/routes/users/@me/channels.ts @@ -1,8 +1,4 @@ -import { - Router, - Request, - Response -} from "express"; +import { Router, Request, Response } from "express"; import { ChannelModel, ChannelCreateEvent, @@ -10,39 +6,23 @@ import { UserModel, toObject, ChannelType, - Snowflake + Snowflake, + trimSpecial, } from "@fosscord/server-util"; -import { - HTTPError -} from "lambert-server"; -import { - emitEvent -} from "../../../util/Event"; -import { - getPublicUser -} from "../../../util/User"; -import { - DmChannelCreateSchema -} from "../../../schema/Channel"; -import { - check -} from "../../../util/instanceOf"; +import { HTTPError } from "lambert-server"; +import { emitEvent } from "../../../util/Event"; +import { getPublicUser } from "../../../util/User"; +import { DmChannelCreateSchema } from "../../../schema/Channel"; +import { check } from "../../../util/instanceOf"; const router: Router = Router(); router.get("/", async (req: Request, res: Response) => { - const user = await UserModel.findOne({ - id: req.user_id - }, { - guilds: true - }).exec(); - if (!user) throw new HTTPError("User not found", 404); - - var testID = "829044530203328513"; //FOR TEST - var channels = await ChannelModel.find({ - recipients: req.user_id, - type: 1 + $or: [ + { recipients: req.user_id, type: ChannelType.DM }, + { recipients: req.user_id, type: ChannelType.GROUP_DM }, + ], }).exec(); res.json(toObject(channels)); @@ -50,20 +30,22 @@ router.get("/", async (req: Request, res: Response) => { router.post("/", check(DmChannelCreateSchema), async (req, res) => { const body = req.body as DmChannelCreateSchema; + if (body.recipients.length === 0) throw new HTTPError("You need to specify at least one recipient"); + const type = body.recipients.length === 1 ? ChannelType.DM : ChannelType.GROUP_DM; + const name = trimSpecial(body.name); const channel = { - ...body, + name, + type, owner_id: req.user_id, id: Snowflake.generate(), - type: ChannelType.DM, created_at: new Date(), }; await new ChannelModel(channel).save(); /*Event({ event: "CHANNEL_CREATE", data: channel } as ChannelCreateEvent);*/ - res.json(channel); }); -export default router; \ No newline at end of file +export default router; diff --git a/src/schema/Channel.ts b/src/schema/Channel.ts index 3a22872a..70e305e4 100644 --- a/src/schema/Channel.ts +++ b/src/schema/Channel.ts @@ -22,21 +22,13 @@ export const ChannelModifySchema = { }; export const DmChannelCreateSchema = { - owner_id: String, - $id: String, - $created_at: Date, - name: String, - type: Number, - recipients: [String] -} + $name: String, + recipients: [String], +}; export interface DmChannelCreateSchema { - owner_id: String; - id?: String; - created_at?: Date; - name: String; - type: Number; - recipients: String[]; + name?: string; + recipients: string[]; } export interface ChannelModifySchema { From c2d696d66ede48ee06e90bf8896d60e4dc6894de Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Sun, 25 Apr 2021 23:35:19 +0200 Subject: [PATCH 4/4] :sparkles: added dev server --- package-lock.json | Bin 756135 -> 785670 bytes package.json | 6 ++++-- .../#channel_id/messages/bulk-delete.ts | 2 +- src/routes/users/@me/guilds.ts | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 107b4ac00a3d1c3a6dab0f4a9b1fbebe6a7aa124..4b1b665cf5dd2f86cd520a2979691fccb1754535 100644 GIT binary patch delta 11804 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 { data: { ids: messages, channel_id, guild_id: channel.guild_id }, } as MessageDeleteBulkEvent); - res.status(204).send(); + res.sendStatus(204); }); diff --git a/src/routes/users/@me/guilds.ts b/src/routes/users/@me/guilds.ts index 5042c17c..6528552b 100644 --- a/src/routes/users/@me/guilds.ts +++ b/src/routes/users/@me/guilds.ts @@ -49,7 +49,7 @@ router.delete("/:id", async (req: Request, res: Response) => { guild_id: guild_id, } as GuildMemberRemoveEvent); - return res.status(204).send(); + return res.sendStatus(204); }); export default router;