From 2cae8f12a7f450ad84c0fdfcf47cbda4d5cd5a7f Mon Sep 17 00:00:00 2001 From: grimhilt Date: Wed, 17 May 2023 18:14:25 +0200 Subject: [PATCH] add route room delete --- back/abl/Message-abl.ts | 2 +- back/abl/Room-abl.ts | 29 ++++++++++++------- back/mails/room/Room.ts | 1 + back/routes/room.ts | 4 +++ back/validator/schemas/deleteRoom-schema.json | 12 ++++++++ back/validator/validator.ts | 5 ++++ front/src/services/imapAPI.ts | 2 +- front/src/views/room/Header.vue | 1 + 8 files changed, 44 insertions(+), 12 deletions(-) create mode 100644 back/validator/schemas/deleteRoom-schema.json diff --git a/back/abl/Message-abl.ts b/back/abl/Message-abl.ts index e137954..46f370d 100644 --- a/back/abl/Message-abl.ts +++ b/back/abl/Message-abl.ts @@ -106,7 +106,7 @@ export default class MessageAbl { const room = await new Room().setRoomIdOnMessageId(messageId); try { await message.delete(); - if (room.roomId && room.shouldDelete()) { + if (room.roomId && await room.shouldDelete()) { await room.delete(); res.status(statusCode.OK).json({ deleteRoom: true }).send(); return; diff --git a/back/abl/Room-abl.ts b/back/abl/Room-abl.ts index 8b2580c..eede63d 100644 --- a/back/abl/Room-abl.ts +++ b/back/abl/Room-abl.ts @@ -8,6 +8,7 @@ import MailBuilder from "../mails/utils/mailBuilder"; import { getAddresses } from "../db/utils/mail"; import { getMembers, getMessages, getRooms } from "../db/api-db"; import logger from "../system/Logger"; +import Room from "../mails/room/Room"; function rmUserFromAddrs(addresses: { email: string }[], user: string) { let index = addresses.findIndex((a) => a.email == user); @@ -27,7 +28,7 @@ export default class RoomAbl { const mailBuilder = new MailBuilder(); mailBuilder.from(user).to(ownerEmail).text(text).html(html); - emailManager.getSmtp(user).sendMail(mailBuilder.message); + emailManager.getSmtp(user)?.sendMail(mailBuilder.message); res.status(statusCode.OK).send(); } else if (roomType === RoomType.GROUP || roomType === RoomType.THREAD) { const lastMsgData = (await getLastMsgData(roomId))[0]; @@ -52,7 +53,7 @@ export default class RoomAbl { .to(to.map((a) => a.email)) .cc(cc.map((a) => a.email)); - emailManager.getSmtp(user).sendMail(mailBuilder.message); + emailManager.getSmtp(user)?.sendMail(mailBuilder.message); res.status(statusCode.OK).send(); } else { res.status(statusCode.FORBIDDEN).send({ error: "Cannot add a new message in a room or a channel." }); @@ -71,14 +72,22 @@ export default class RoomAbl { }); } - static async getMembers(body, res) { + static async getMembers(body, res: Response) { const { roomId } = body; - getMembers(roomId).then((addresses) => { - res.status(statusCode.OK).json(addresses); - }).catch((err) => { - logger.err(err) - res.status(statusCode.INTERNAL_SERVER_ERROR); - }); + getMembers(roomId) + .then((addresses) => { + res.status(statusCode.OK).json(addresses); + }) + .catch((err) => { + logger.err(err); + res.status(statusCode.INTERNAL_SERVER_ERROR); + }); + } + + static async delete(body, res: Response) { + const { roomId } = body; + console.log("delete", roomId); + const room = new Room().setRoomId(roomId); + // todo } - } diff --git a/back/mails/room/Room.ts b/back/mails/room/Room.ts index 065ca3e..75bec29 100644 --- a/back/mails/room/Room.ts +++ b/back/mails/room/Room.ts @@ -23,6 +23,7 @@ export default class Room { return this; } + // check if the room have threads or messages async shouldDelete(): Promise { if (!this._roomId) { throw "shouldDelete needs to have a roomId set."; diff --git a/back/routes/room.ts b/back/routes/room.ts index 46577b8..e23d6c4 100644 --- a/back/routes/room.ts +++ b/back/routes/room.ts @@ -21,4 +21,8 @@ router.post("/response", async (req, res) => { await validator.validate("response", req.body, res, RoomAbl.response); }); +router.post("/delete", async (req, res) => { + await validator.validate("deleteRoom", req.body, res, RoomAbl.delete); +}); + export default router; diff --git a/back/validator/schemas/deleteRoom-schema.json b/back/validator/schemas/deleteRoom-schema.json new file mode 100644 index 0000000..567004d --- /dev/null +++ b/back/validator/schemas/deleteRoom-schema.json @@ -0,0 +1,12 @@ +{ + "type": "object", + "properties": { + "roomId": { + "type": "number" + } + }, + "required": [ + "roomId" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/back/validator/validator.ts b/back/validator/validator.ts index b11d031..35c01eb 100644 --- a/back/validator/validator.ts +++ b/back/validator/validator.ts @@ -11,6 +11,7 @@ import getMembersSchema from "./schemas/getMembers-schema.json"; import setFlagSchema from "./schemas/setFlag-schema.json"; import responseSchema from "./schemas/response-schema.json"; import deleteSchema from "./schemas/delete-schema.json"; +import deleteRoomSchema from "./schemas/deleteRoom-schema.json"; import { Request, Response } from "express"; import statusCodes from "../utils/statusCodes"; import logger from "../system/Logger"; @@ -24,6 +25,7 @@ class Validator { validateSetFlag: any; validateResponse: any; delete: any; + deleteRoom: any; constructor() { this.validateCreateAccount = ajv.compile(createAccountSchema); @@ -34,6 +36,7 @@ class Validator { this.validateSetFlag = ajv.compile(setFlagSchema); this.validateResponse = ajv.compile(responseSchema); this.delete = ajv.compile(deleteSchema); + this.deleteRoom = ajv.compile(deleteRoomSchema); } _getSchema(name: string): any { @@ -55,6 +58,8 @@ class Validator { return this.validateResponse; case "delete": return this.delete; + case "deleteRoom": + return this.deleteRoom; default: logger.err(`Schema ${name} not found`); break; diff --git a/front/src/services/imapAPI.ts b/front/src/services/imapAPI.ts index 9009841..c2e83fa 100644 --- a/front/src/services/imapAPI.ts +++ b/front/src/services/imapAPI.ts @@ -32,6 +32,6 @@ export default { return API().post(`/message/delete`, data); }, deleteRoom(id: number) { - return API().post(`/room/delete`, id); + return API().post(`/room/delete`, { roomId: id }); }, }; diff --git a/front/src/views/room/Header.vue b/front/src/views/room/Header.vue index 82d010c..ddd22b8 100644 --- a/front/src/views/room/Header.vue +++ b/front/src/views/room/Header.vue @@ -17,6 +17,7 @@ const roomTitle = () => { }; const handleDelete = () => { + console.log(props.room); if (props.room?.id) { imapAPI.deleteRoom(props.room.id); }