diff --git a/back/routes/mail.ts b/back/routes/mail.ts index bab08d7..f0aa3df 100644 --- a/back/routes/mail.ts +++ b/back/routes/mail.ts @@ -1,4 +1,3 @@ -import statusCodes from "../utils/statusCodes"; import express from "express"; const router = express.Router(); @@ -6,27 +5,14 @@ import { rooms } from "../abl/rooms"; import Message from "../abl/Messages-abl"; import { messages } from "../abl/messages"; import { members } from "../abl/members"; -import { - validateCreateAccount, - validateGetAccounts, - validateGetMembers, - validateGetMessages, - validateGetRooms, - validateAddFlag, - validateRemoveFlag, -} from "../validator/validator"; import Account from "../abl/Account-abl"; +import validator from "../validator/validator"; /** * Return all mailboxes and folders for an user */ router.get("/accounts", async (req, res) => { - const valid = validateGetAccounts(req.params); - if (!valid) { - res.status(statusCodes.NOT_ACCEPTABLE).send({ error: validateGetAccounts.errors }); - } else { - await Account.getAll(req.params, res); - } + await validator.validate("getAccounts", req.params, res, Account.getAll); }); /** @@ -34,66 +20,36 @@ router.get("/accounts", async (req, res) => { */ router.get("/:mailboxId/rooms", async (req, res) => { // todo offet limit - const valid = validateGetRooms(req.params); - if (!valid) { - res.status(statusCodes.NOT_ACCEPTABLE).send({ error: validateGetRooms.errors }); - } else { - await rooms(req.params, res); - } + await validator.validate("getRooms", req.params, res, rooms); }); /** * Return all messages from a room */ router.get("/:roomId/messages", async (req, res) => { - const valid = validateGetMessages(req.params); - if (!valid) { - res.status(statusCodes.NOT_ACCEPTABLE).send({ error: validateGetMessages.errors }); - } else { - await messages(req.params, res); - } + await validator.validate("getMessages", req.params, res, messages); }); /** * Return all members from a room */ router.get("/:roomId/members", async (req, res) => { - const valid = validateGetMembers(req.params); - if (!valid) { - res.status(statusCodes.NOT_ACCEPTABLE).send({ error: validateGetMembers.errors }); - } else { - await members(req.params, res); - } + await validator.validate("getMembers", req.params, res, members); }); /** * Register a new mailbox inside the app */ router.post("/account", async (req, res) => { - const valid = validateCreateAccount(req.body); - if (!valid) { - res.status(statusCodes.NOT_ACCEPTABLE).send({ error: validateCreateAccount.errors }); - } else { - await Account.register(req.body, res); - } + await validator.validate("createAccount", req.body, res, Account.register); }); router.post("/addFlag", async (req, res) => { - const valid = validateAddFlag(req.body); - if (!valid) { - res.status(statusCodes.NOT_ACCEPTABLE).send({ error: validateAddFlag.errors }); - } else { - await Message.addFlag(req.body, res); - } + await validator.validate("addFlag", req.body, res, Message.addFlag); }); router.post("/removeFlag", async (req, res) => { - const valid = validateRemoveFlag(req.body); - if (!valid) { - res.status(statusCodes.NOT_ACCEPTABLE).send({ error: validateRemoveFlag.errors }); - } else { - await Message.removeFlag(req.body, res); - } + await validator.validate("removeFlag", req.body, res, Message.removeFlag); }); export default router; diff --git a/back/validator/validator.ts b/back/validator/validator.ts index 9841fb1..4689ba9 100644 --- a/back/validator/validator.ts +++ b/back/validator/validator.ts @@ -9,11 +9,54 @@ import getRoomSchema from "./schemas/getRooms-schema.json"; import getMessagesSchema from "./schemas/getMessages-schema.json"; import getMembersSchema from "./schemas/getMembers-schema.json"; import setFlagSchema from "./schemas/setFlag-schema.json"; +import { Request, Response } from "express"; +import statusCodes from "../utils/statusCodes"; +import logger from "../system/Logger"; export const validateCreateAccount = ajv.compile(createAccountSchema); export const validateGetAccounts = ajv.compile(getAccountSchema); export const validateGetRooms = ajv.compile(getRoomSchema); export const validateGetMessages = ajv.compile(getMessagesSchema); export const validateGetMembers = ajv.compile(getMembersSchema); -export const validateAddFlag = ajv.compile(setFlagSchema); -export const validateRemoveFlag = ajv.compile(setFlagSchema); \ No newline at end of file +export const validateSetFlag = ajv.compile(setFlagSchema); + +class Validator { + _getSchema(name: string): any { + switch (name) { + case "createAccount": + return validateCreateAccount; + case "getAccounts": + return validateGetAccounts; + case "getRooms": + return validateGetRooms; + case "getMessages": + return validateGetMessages; + case "getMembers": + return validateGetMembers; + case "addFlag": + case "removeFlag": + return validateSetFlag; + default: + logger.err(`Schema ${name} not found`); + break; + } + } + + async validate( + schemaName: string, + args: any, + res: Response, + callback: (body: any, res: Response) => Promise, + ): Promise { + const validator = this._getSchema(schemaName); + const valid = validator(args); + if (!valid) { + res.status(statusCodes.NOT_ACCEPTABLE).send({ error: validator.errors }); + } else { + await callback(args, res); + } + } +} + +const validator = new Validator(); +export default validator; \ No newline at end of file diff --git a/front/src/store/store.ts b/front/src/store/store.ts index 79e195f..988f555 100644 --- a/front/src/store/store.ts +++ b/front/src/store/store.ts @@ -112,6 +112,7 @@ const store = createStore({ }); }, addFlag(state, payload) { + // todo if seen notif const msg = roomOnId(state, payload.roomId)?.messages.find((msg) => msg.id == payload.messageId); if (msg) { msg.flags.push(payload.flag);