From c0a5b036dafd08ecaba771b29036d4161d20dd9d Mon Sep 17 00:00:00 2001 From: Alessandre Laguierce Date: Sat, 26 Oct 2024 17:58:23 +0200 Subject: [PATCH] feat: add marque registration --- back-end/src/controllers/marque.controller.ts | 57 +++++++++++++++++++ back-end/src/middlewares/auth.middleware.ts | 48 ++++++++++++++++ back-end/src/routes/index.ts | 5 +- back-end/src/routes/marque.route.ts | 8 +++ back-end/src/types/marque.ts | 6 ++ 5 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 back-end/src/controllers/marque.controller.ts create mode 100644 back-end/src/middlewares/auth.middleware.ts create mode 100644 back-end/src/routes/marque.route.ts create mode 100644 back-end/src/types/marque.ts diff --git a/back-end/src/controllers/marque.controller.ts b/back-end/src/controllers/marque.controller.ts new file mode 100644 index 0000000..1ccabea --- /dev/null +++ b/back-end/src/controllers/marque.controller.ts @@ -0,0 +1,57 @@ +import { Request, Response } from 'express'; +import { new_client } from '../db/db_client'; +import { Marque } from '../types/marque'; +import { Either, eitherLeft, eitherRight } from '../utils/utils'; + +const getMarque = async (idOrName: number | string): Promise> => { + const client = new_client(); + await client.connect(); + let res; + if (typeof idOrName !== 'number') { + res = await client.query("SELECT * FROM marques WHERE nom_marque=$1;", [`${idOrName}`]); + } else { + res = await client.query("SELECT * FROM marques WHERE id_marque=$1;", [idOrName]); + } + if (res.rows.length === 0) { + await client.end(); + return eitherRight("Does not exist."); + } + const marque: Marque = { id_marque: res.rows[0].id_marque, name: res.rows[0].nom_marque }; + await client.end(); + + return eitherLeft(marque); +} + +const createMarque = async (name: string): Promise> => { + const gettingMarque = await getMarque(name); + if (!gettingMarque.hasRight) { + return eitherRight("Already in database."); + } + const client = new_client(); + await client.connect(); + const res = await client.query("INSERT INTO marques (nom_membre) VALUES ($1) RETURNING *;", [`${name}`]); + if (res.rows.length === 0) { + await client.end(); + return eitherRight("Something went wrong"); + } + const marque: Marque = { id_marque: res.rows[0].id_marque, name: res.rows[0].nom_marque }; + await client.end(); + return eitherLeft(marque); +}; + +const register = async (req: Request, res: Response) => { + if (!req || !req.body || !req.body.name) { + res.status(400).send(); + return; + } + const name: string = req.body.name; + const marque: Either = await createMarque(name); + if (marque.hasRight) { + res.status(403).send(marque.right); + return; + } + + res.status(200).send(marque); +} + +export { register }; diff --git a/back-end/src/middlewares/auth.middleware.ts b/back-end/src/middlewares/auth.middleware.ts new file mode 100644 index 0000000..2639a78 --- /dev/null +++ b/back-end/src/middlewares/auth.middleware.ts @@ -0,0 +1,48 @@ +import { Request, Response } from 'express'; +import { jwtVerify } from 'jose'; +import { JWT_SECRET_KEY } from '../config/auth.config'; +import { getMember } from '../controllers/member.controller'; +import { Member } from '../types/member'; +import { Either } from '../utils/utils'; + +const extractBearerToken = (headerValue: string) => { + const matches = headerValue.match(/(bearer)\s+(\S+)/i); + return matches && matches[2]; +} + +const getUsername = async (req: Request, res: Response, next: () => void) => { + const token = req.headers.authorization && extractBearerToken(req.headers.authorization); + + if (!token) { + next(); + return; + } + try { + const { payload } = await jwtVerify(token, JWT_SECRET_KEY); + const name: string = payload.name as string; + const member: Either = await getMember(name); + + if (!member.hasRight) { + res.locals.user = { + id_member: member.left.id_member, + name: member.left.name + } + + next() + } else { + res.status(401).send(member.right) + } + } catch (e) { + res.status(401).send(); + } +} + +function verifyAuthentication(req: Request, res: Response, next: () => void) { + if (!res.locals.user) { + res.status(401).send(); + return; + } + next(); +} + +export { getUsername, verifyAuthentication }; diff --git a/back-end/src/routes/index.ts b/back-end/src/routes/index.ts index 7adfdf7..3183206 100644 --- a/back-end/src/routes/index.ts +++ b/back-end/src/routes/index.ts @@ -1,6 +1,8 @@ import express from 'express'; -import authRoute from './auth.route' import db from '../db'; +import { getUsername, verifyAuthentication } from '../middlewares/auth.middleware' +import authRoute from './auth.route' +import marquesRoute from './marque.route' const routes = express.Router(); @@ -15,5 +17,6 @@ routes.get("/message", async (_req, res) => { }); routes.use("/auth", authRoute); +routes.use("/marques", getUsername, verifyAuthentication, marquesRoute); export default routes; diff --git a/back-end/src/routes/marque.route.ts b/back-end/src/routes/marque.route.ts new file mode 100644 index 0000000..b0619e5 --- /dev/null +++ b/back-end/src/routes/marque.route.ts @@ -0,0 +1,8 @@ +import express from 'express'; +import { register } from '../controllers/marque.controller'; + +const router = express.Router(); + +router.post('/register', register); + +export default router; diff --git a/back-end/src/types/marque.ts b/back-end/src/types/marque.ts new file mode 100644 index 0000000..f234aae --- /dev/null +++ b/back-end/src/types/marque.ts @@ -0,0 +1,6 @@ +type Marque = { + id_marque: number, + name: string +}; + +export { Marque };