From a74731a49e9d360347c54a3b706f339161f3554c Mon Sep 17 00:00:00 2001 From: Mathis Date: Fri, 26 Apr 2024 14:09:29 +0200 Subject: [PATCH] feat(controllers): add ModelController with CRUD methods This commit adds a new controller, `ModelController`, to the controllers directory. This controller includes create, read, update and delete (CRUD) methods for handling 'model' related operations. Each method incorporates appropriate error handling and logging. Issue: #28 Signed-off-by: Mathis --- src/controllers/model.controller.ts | 115 ++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 src/controllers/model.controller.ts diff --git a/src/controllers/model.controller.ts b/src/controllers/model.controller.ts new file mode 100644 index 0000000..d5067b2 --- /dev/null +++ b/src/controllers/model.controller.ts @@ -0,0 +1,115 @@ +import type {Request, Response} from "express"; +import {Logger} from "tslog"; +import CategoryService from "@services/category.service"; +import type IDbModel from "@interfaces/database/IDbModel"; +import ModelService from "@services/model.service"; +//import {validationResult} from "express-validator"; + + +const logger = new Logger({ name: "ModelController" }); + + +async function createModel(req: Request, res: Response): Promise { + const body: IDbModel = req.body + const doesExist = await CategoryService.getBySlug(`${body.slug_name}`) + if (doesExist) { + logger.error("Category already exists"); + return res.status(400).json({ error: "Category already exists" }); + } + const createResult = await ModelService.create({ + display_name: `${body.display_name}`, + slug_name: `${body.slug_name}`, + category_id: `${body.category_id}`, + base_price: Number.parseFloat(`${body.base_price}`), + brand_id: `${body.brand_id}`, + image_blob: `${body.image_blob}`, + is_trending: !!body.is_trending + }) + if (!createResult) { + logger.error("Failed to create category"); + return res.status(500).json({ error: "Failed to create category" }); + } + logger.info(`Category created successfully ! (${body.slug_name})`) + return res.status(201).json({ message: "Category created successfully" }); +} + +async function updateModel(req: Request, res: Response): Promise { + const body: IDbModel = req.body; + const doesExist = await ModelService.getBySlug(`${body.slug_name}`); + if (!doesExist) { + logger.error("Model does not exist"); + return res.status(404).json({ error: "Model does not exist" }); + } + const updateResult = await ModelService.update({ + id: `${body.id}`, + display_name: `${body.display_name}`, + slug_name: `${body.slug_name}`, + category_id: `${body.category_id}`, + base_price: Number.parseFloat(`${body.base_price}`), + brand_id: `${body.brand_id}`, + image_blob: `${body.image_blob}`, + is_trending: !!body.is_trending + }); + if (!updateResult) { + logger.error("Failed to update model"); + return res.status(500).json({ error: "Failed to update model" }); + } + logger.info(`Model updated successfully! (${body.slug_name})`); + return res.status(200).json({ message: "Model updated successfully" }); +} + +async function getAllModel(res: Response): Promise { + const models = await ModelService.getAll(); + if (!models) { + logger.error("Failed to get all models"); + return res.status(500).json({ error: "Failed to get all models" }); + } + return res.status(200).json({ + uat: Date.now(), + models: models, + total: models.length + }); +} + +async function getModelBySlug(req: Request, res: Response): Promise { + const slug = req.params["modelSlug"]; + if (!slug) { + logger.error("Invalid slug"); + return res.status(400).json({ error: "Invalid slug" }); + } + const model = await ModelService.getBySlug(slug); + if (!model) { + logger.error("Model not found"); + return res.status(404).json({ error: "Model not found" }); + } + return res.status(200).json({ model }); +} + +async function deleteModel(req: Request, res: Response): Promise { + const modelSlug = req.params["modelSlug"]; + if (!modelSlug) { + logger.error("Invalid model slug"); + return res.status(400).json({ error: "Invalid model slug" }); + } + //TODO Check if vehicle related to model + const deleteResult = await ModelService.delete(modelSlug); + if (!deleteResult) { + logger.error("Failed to delete model"); + return res.status(500).json({ error: "Failed to delete model" }); + } + logger.info(`Model deleted successfully! (SLUG: ${modelSlug})`); + return res.status(200).json({ message: "Model deleted successfully" }); +} + +//TODO get all vehicles of an model by slug + + +const ModelController = { + create: createModel, + update: updateModel, + getAll: getAllModel, + getBySlug: getModelBySlug, + delete: deleteModel, +} + +export default ModelController; \ No newline at end of file