From 5b6995d6a6897c3afd7c66faf40b19f7811bae0e Mon Sep 17 00:00:00 2001 From: grimhilt Date: Sat, 8 Apr 2023 00:00:24 +0200 Subject: [PATCH] change archi and use schema routes --- back/abl/Account-abl.ts | 26 +++++++ back/{controllers => abl}/members.ts | 0 back/{controllers => abl}/messages.ts | 0 back/{controllers => abl}/rooms.ts | 3 +- back/controllers/addAccount.ts | 18 ----- back/db/message/saveMessage-db.ts | 1 - back/mails/message/saveMessage.ts | 1 + back/routes/mail.ts | 76 ++++++++++++------- .../schemas/createAccount-schema.json} | 0 .../validator/schemas/getAccounts-schema.json | 6 ++ back/validator/schemas/getMembers-schema.json | 12 +++ .../validator/schemas/getMessages-schema.json | 12 +++ back/validator/schemas/getRooms-schema.json | 12 +++ back/validator/validator.ts | 16 ++++ 14 files changed, 137 insertions(+), 46 deletions(-) create mode 100644 back/abl/Account-abl.ts rename back/{controllers => abl}/members.ts (100%) rename back/{controllers => abl}/messages.ts (100%) rename back/{controllers => abl}/rooms.ts (81%) delete mode 100644 back/controllers/addAccount.ts rename back/{schemas/account_schema.json => validator/schemas/createAccount-schema.json} (100%) create mode 100644 back/validator/schemas/getAccounts-schema.json create mode 100644 back/validator/schemas/getMembers-schema.json create mode 100644 back/validator/schemas/getMessages-schema.json create mode 100644 back/validator/schemas/getRooms-schema.json create mode 100644 back/validator/validator.ts diff --git a/back/abl/Account-abl.ts b/back/abl/Account-abl.ts new file mode 100644 index 0000000..89af75d --- /dev/null +++ b/back/abl/Account-abl.ts @@ -0,0 +1,26 @@ +import { Response } from "express"; +import { getAccounts, registerAccount } from "../db/api"; +import { getAddresseId } from "../db/utils/mail"; +import statusCodes from "../utils/statusCodes"; + +export default class Account { + static async getAll(body, res: Response) { + getAccounts().then((data) => { + res.status(statusCodes.OK).json(data); + }); + } + + static async register(body, res: Response) { + const { email, pwd, xoauth, xoauth2, host, port, tls } = body; + getAddresseId(email).then((addressId) => { + registerAccount(addressId, pwd, xoauth, xoauth2, host, port, tls) + .then((mailboxId) => { + res.status(statusCodes.OK).json({ id: mailboxId }); + }) + .catch(() => { + res.status(statusCodes.INTERNAL_SERVER_ERROR); + }); + }); + // todo change mailbox to account + } +} diff --git a/back/controllers/members.ts b/back/abl/members.ts similarity index 100% rename from back/controllers/members.ts rename to back/abl/members.ts diff --git a/back/controllers/messages.ts b/back/abl/messages.ts similarity index 100% rename from back/controllers/messages.ts rename to back/abl/messages.ts diff --git a/back/controllers/rooms.ts b/back/abl/rooms.ts similarity index 81% rename from back/controllers/rooms.ts rename to back/abl/rooms.ts index 5966322..f8708d8 100644 --- a/back/controllers/rooms.ts +++ b/back/abl/rooms.ts @@ -1,8 +1,9 @@ import statusCode from "../utils/statusCodes"; import { getRooms } from "../db/api"; import logger from "../system/Logger"; +import { Response } from "express"; -export async function rooms(body, res) { +export async function rooms(body, res: Response) { const { mailboxId, offset, limit } = body; getRooms(mailboxId).then((rooms) => { res.status(statusCode.OK).json(rooms); diff --git a/back/controllers/addAccount.ts b/back/controllers/addAccount.ts deleted file mode 100644 index 3fbebf2..0000000 --- a/back/controllers/addAccount.ts +++ /dev/null @@ -1,18 +0,0 @@ -import statusCode from "../utils/statusCodes"; -import { registerAccount } from "../db/api"; -import { getAddresseId } from "../db/utils/mail"; - -export async function addAccount(body, res) { - const { email, pwd, xoauth, xoauth2, host, port, tls } = body; - getAddresseId(email).then((addressId) => { - registerAccount(addressId, pwd, xoauth, xoauth2, host, port, tls) - .then((mailboxId) => { - res.status(statusCode.OK).json({ id: mailboxId }); - }) - .catch(() => { - res.status(statusCode.INTERNAL_SERVER_ERROR); - }); - }); -} - -// todo change mailbox to account diff --git a/back/db/message/saveMessage-db.ts b/back/db/message/saveMessage-db.ts index 1da7120..c889e52 100644 --- a/back/db/message/saveMessage-db.ts +++ b/back/db/message/saveMessage-db.ts @@ -36,7 +36,6 @@ export async function createRoom( return await execQueryAsyncWithId(query, values); } -// todo date not good export async function registerMessageInRoom(messageId: number, roomId: number, idate: string | undefined | null) { if (!idate) idate = new Date().toString(); const query = `INSERT IGNORE INTO app_room_message (message_id, room_id) VALUES (?, ?)`; diff --git a/back/mails/message/saveMessage.ts b/back/mails/message/saveMessage.ts index 9c3e066..55f0e0e 100644 --- a/back/mails/message/saveMessage.ts +++ b/back/mails/message/saveMessage.ts @@ -77,6 +77,7 @@ export default class RegisterMessageInApp { async incrementNotSeen(roomId: number) { // todo it appears there is an error with notifications + console.log("incrementRead", roomId) if (!this.isSeen) { await incrementNotSeenRoom(roomId); } diff --git a/back/routes/mail.ts b/back/routes/mail.ts index ffdce7f..6e5c1e8 100644 --- a/back/routes/mail.ts +++ b/back/routes/mail.ts @@ -2,53 +2,77 @@ import statusCodes from "../utils/statusCodes"; import express from "express"; const router = express.Router(); -import Ajv from "ajv"; -import addFormats from "ajv-formats"; -const ajv = new Ajv({ allErrors: true }); -addFormats(ajv); -import schema_account from "../schemas/account_schema.json"; -import { addAccount } from "../controllers/addAccount"; -import { getAccounts } from "../db/api"; -import { rooms } from "../controllers/rooms"; -import { messages } from "../controllers/messages"; -import { members } from "../controllers/members"; - -const validate_account = ajv.compile(schema_account); +import { rooms } from "../abl/rooms"; +import { messages } from "../abl/messages"; +import { members } from "../abl/members"; +import { + validateCreateAccount, + validateGetAccounts, + validateGetMembers, + validateGetMessages, + validateGetRooms, +} from "../validator/validator"; +import Account from "../abl/Account-abl"; /** * Return all mailboxes and folders for an user */ -router.get("/accounts", (req, res) => { - getAccounts().then((data) => { - res.status(statusCodes.OK).json(data); - }); +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); + } }); +/** + * Return all rooms from a mailbox + */ router.get("/:mailboxId/rooms", async (req, res) => { - // todo use offset limit - await rooms(req.params, 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); + } }); +/** + * Return all messages from a room + */ router.get("/:roomId/messages", async (req, res) => { - const { roomId } = req.params; - await messages(req.params, res); + const valid = validateGetMessages(req.params); + if (!valid) { + res.status(statusCodes.NOT_ACCEPTABLE).send({ error: validateGetMessages.errors }); + } else { + await messages(req.params, res); + } }); +/** + * Return all members from a room + */ router.get("/:roomId/members", async (req, res) => { - const { roomId } = req.params; - await members(req.params, res); + const valid = validateGetMembers(req.params); + if (!valid) { + res.status(statusCodes.NOT_ACCEPTABLE).send({ error: validateGetMembers.errors }); + } else { + await members(req.params, res); + } }); /** * Register a new mailbox inside the app */ router.post("/account", async (req, res) => { - const valid = validate_account(req.body); + const valid = validateCreateAccount(req.body); if (!valid) { - res.status(statusCodes.NOT_ACCEPTABLE).send({ error: validate_account.errors }); + res.status(statusCodes.NOT_ACCEPTABLE).send({ error: validateCreateAccount.errors }); } else { - await addAccount(req.body, res); + await Account.register(req.body, res); } }); -export default router; \ No newline at end of file +export default router; diff --git a/back/schemas/account_schema.json b/back/validator/schemas/createAccount-schema.json similarity index 100% rename from back/schemas/account_schema.json rename to back/validator/schemas/createAccount-schema.json diff --git a/back/validator/schemas/getAccounts-schema.json b/back/validator/schemas/getAccounts-schema.json new file mode 100644 index 0000000..656eb8f --- /dev/null +++ b/back/validator/schemas/getAccounts-schema.json @@ -0,0 +1,6 @@ +{ + "type": "object", + "properties": {}, + "required": [], + "additionalProperties": false +} \ No newline at end of file diff --git a/back/validator/schemas/getMembers-schema.json b/back/validator/schemas/getMembers-schema.json new file mode 100644 index 0000000..bd52c64 --- /dev/null +++ b/back/validator/schemas/getMembers-schema.json @@ -0,0 +1,12 @@ +{ + "type": "object", + "properties": { + "roomId": { + "type": "string" + } + }, + "required": [ + "roomId" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/back/validator/schemas/getMessages-schema.json b/back/validator/schemas/getMessages-schema.json new file mode 100644 index 0000000..bd52c64 --- /dev/null +++ b/back/validator/schemas/getMessages-schema.json @@ -0,0 +1,12 @@ +{ + "type": "object", + "properties": { + "roomId": { + "type": "string" + } + }, + "required": [ + "roomId" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/back/validator/schemas/getRooms-schema.json b/back/validator/schemas/getRooms-schema.json new file mode 100644 index 0000000..30b96ff --- /dev/null +++ b/back/validator/schemas/getRooms-schema.json @@ -0,0 +1,12 @@ +{ + "type": "object", + "properties": { + "mailboxId": { + "type": "string" + } + }, + "required": [ + "mailboxId" + ], + "additionalProperties": false +} \ No newline at end of file diff --git a/back/validator/validator.ts b/back/validator/validator.ts new file mode 100644 index 0000000..08883ec --- /dev/null +++ b/back/validator/validator.ts @@ -0,0 +1,16 @@ +import Ajv from "ajv"; +import addFormats from "ajv-formats"; +const ajv = new Ajv({ allErrors: true }); +addFormats(ajv); + +import createAccountSchema from "./schemas/createAccount-schema.json"; +import getAccountSchema from "./schemas/getAccounts-schema.json"; +import getRoomSchema from "./schemas/getRooms-schema.json"; +import getMessagesSchema from "./schemas/getMessages-schema.json"; +import getMembersSchema from "./schemas/getMembers-schema.json"; + +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);