From 72d04bdab1669882df3296f797f8f400bc2cbc64 Mon Sep 17 00:00:00 2001 From: Nemo D'ACREMONT Date: Sun, 17 Nov 2024 09:19:51 +0100 Subject: [PATCH] feat: add services, controller, routes, types and templates for models --- back-end/src/controllers/model.controller.ts | 42 ++++++++++ back-end/src/routes/model.route.ts | 12 +++ back-end/src/services/model.service.ts | 81 ++++++++++++++++++++ back-end/src/templates/model.ejs | 27 +++++++ back-end/src/templates/models.ejs | 31 ++++++++ back-end/src/types/model.ts | 9 +++ 6 files changed, 202 insertions(+) create mode 100644 back-end/src/controllers/model.controller.ts create mode 100644 back-end/src/routes/model.route.ts create mode 100644 back-end/src/services/model.service.ts create mode 100644 back-end/src/templates/model.ejs create mode 100644 back-end/src/templates/models.ejs create mode 100644 back-end/src/types/model.ts diff --git a/back-end/src/controllers/model.controller.ts b/back-end/src/controllers/model.controller.ts new file mode 100644 index 0000000..8ff2a81 --- /dev/null +++ b/back-end/src/controllers/model.controller.ts @@ -0,0 +1,42 @@ +import { RequestHandler } from "express"; +import modelService from "../services/model.service"; + +const modelByName: RequestHandler<{ name: string; }> = async (req, res) => { + const modelEither = await modelService.getModel(req.params.name); + + if (modelEither.hasRight) { + res.sendStatus(404); + return; + } + + const model = modelEither.left; + + res.render('model.ejs', { model }); +}; + +const allModels: RequestHandler<{ name: string; }> = async (req, res) => { + const models = await modelService.getAllModels(); + res.render('models.ejs', { models }); +}; + +const modelById: RequestHandler<{ id: string; }> = async (req, res) => { + const id = parseInt(req.params.id); + const modelEither = await modelService.getModel(id); + + if (modelEither.hasRight) { + res.sendStatus(404); + return; + } + + const model = modelEither.left; + + res.render('model.ejs', { model }); +}; + +const modelController = { + modelByName, + allModels, + modelById, +}; + +export default modelController; diff --git a/back-end/src/routes/model.route.ts b/back-end/src/routes/model.route.ts new file mode 100644 index 0000000..fa200b0 --- /dev/null +++ b/back-end/src/routes/model.route.ts @@ -0,0 +1,12 @@ +import express from 'express'; +import modelController from '../controllers/model.controller'; + +const modelRouter = express.Router(); + +modelRouter.get("/", modelController.allModels); + +modelRouter.get("/:name", modelController.modelByName); + +modelRouter.get("/byid/:id", modelController.modelById); + +export default modelRouter; diff --git a/back-end/src/services/model.service.ts b/back-end/src/services/model.service.ts new file mode 100644 index 0000000..881ddd0 --- /dev/null +++ b/back-end/src/services/model.service.ts @@ -0,0 +1,81 @@ +import { new_client } from '../db/db_client'; +import { Model } from '../types/model'; +import { Either, eitherLeft, eitherRight } from '../utils/utils'; + +type DBModel = { + id_modele: number; + nom_modele: string; + url_notice_modele: string; + id_membre: number; + id_modele_2: number; +}; + +function db2Model(data: DBModel) { + const model: Model = { + id: data.id_modele, + name: data.nom_modele, + url: data.url_notice_modele, + creator: data.id_membre, + inheritFrom: data.id_modele_2, + }; + + return model; +} + +const getModel = async (idOrName: number | string): Promise> => { + const client = new_client(); + await client.connect(); + let res; + if (typeof idOrName !== 'number') { + res = await client.query("SELECT * FROM modeles WHERE nom_modele=$1;", [`${idOrName}`]); + } else { + res = await client.query("SELECT * FROM modeles WHERE id_modele=$1;", [idOrName]); + } + if (res.rows.length === 0) { + await client.end(); + return eitherRight("Does not exist."); + } + const model = db2Model(res.rows[0]); + await client.end(); + + return eitherLeft(model); +} + +const getAllModels = async () => { + const client = new_client(); + await client.connect(); + const res = await client.query("SELECT * FROM modeles"); + await client.end(); + return res.rows.map(db2Model); +} + +const createModel = async (name: string, url: string, creator: number, inheritFrom: number): Promise> => { + const gettingModel = await getModel(name); + if (!gettingModel.hasRight) { + return eitherRight("Already in database."); + } + const client = new_client(); + await client.connect(); + const res = await client.query( + "INSERT INTO modeles \ + (nom_modele, url_notice_modele, id_membre, id_modele_2) \ + VALUES ($1, $2, $3, $4) \ + RETURNING *;", + [`${name}`, `${url}`, `${creator}`, `${inheritFrom}`]); + + if (res.rows.length === 0) { + await client.end(); + return eitherRight("Something went wrong"); + } + const model: Model = db2Model(res.rows[0]); + await client.end(); + return eitherLeft(model); +} + +const modelService = { + getModel, + getAllModels, + createModel, +}; + +export default modelService; diff --git a/back-end/src/templates/model.ejs b/back-end/src/templates/model.ejs new file mode 100644 index 0000000..81e1d2b --- /dev/null +++ b/back-end/src/templates/model.ejs @@ -0,0 +1,27 @@ + + + + + + + <%= model.name %> + + + <%- include('partials/links.ejs') %> + + + <%- include('partials/header.ejs') %> + +

+ <%= model.name %> +

+ +
+		id          : <%= model.id %>
+		url         : <%= model.url %>
+		creator     : <%= model.creator %>
+		inheritFrom : <%= model.inheritFrom %>
+	
+ + + diff --git a/back-end/src/templates/models.ejs b/back-end/src/templates/models.ejs new file mode 100644 index 0000000..81b3445 --- /dev/null +++ b/back-end/src/templates/models.ejs @@ -0,0 +1,31 @@ + + + + + + + Liste des modeles + + + <%- include('partials/links.ejs') %> + + + <%- include('partials/header.ejs') %> + +

+ Liste des modeles +

+ + + + + + diff --git a/back-end/src/types/model.ts b/back-end/src/types/model.ts new file mode 100644 index 0000000..c7e5d7a --- /dev/null +++ b/back-end/src/types/model.ts @@ -0,0 +1,9 @@ +type Model = { + id: number; + name: string; + url: string; + creator: number; + inheritFrom: number; +}; + +export { Model };