From 170b9a56931887675b4fd306e775b13fddcd6212 Mon Sep 17 00:00:00 2001 From: Mathis Date: Fri, 3 May 2024 11:17:23 +0200 Subject: [PATCH] feat(controllers): implement vehicle controller Added a new `vehicle.controller.ts` file under controllers. It includes multiple functions related to vehicle management such as `createVehicle`, `updateVehicle`, `getAllVehicle`, `getVehicleById`, `getAvailableVehicle`, and `deleteVehicle`. These functions handle the creation, updates, retrieval, and deletion of a vehicle respectively. With these additions, the application now has the ability to manage vehicles through the `VehicleController` module. Issue: #22 Signed-off-by: Mathis --- src/controllers/vehicle.controller.ts | 174 ++++++++++++++++++++++++++ 1 file changed, 174 insertions(+) create mode 100644 src/controllers/vehicle.controller.ts diff --git a/src/controllers/vehicle.controller.ts b/src/controllers/vehicle.controller.ts new file mode 100644 index 0000000..93633ad --- /dev/null +++ b/src/controllers/vehicle.controller.ts @@ -0,0 +1,174 @@ +import type { IDbVehicle } from "@interfaces/database/IDbVehicle"; +import VehicleService from "@services/vehicle.service"; +import { isDebugMode } from "@utils/debugState"; +import type { Request, Response } from "express"; +import { Logger } from "tslog"; +//import {validationResult} from "express-validator"; + +const logger = new Logger({ + name: "VehicleController", +}); + +/** + * Creates a new vehicle in the database. + * + * @param {Request} req - The request object containing the vehicle details in the body. + * @param {Response} res - The response object used to send the result of the operation. + * @returns {Promise} The response with the result of the operation. + */ +async function createVehicle(req: Request, res: Response): Promise { + const body: IDbVehicle = req.body; + const createResult = await VehicleService.create({ + plate_number: `${body.plate_number}`, + model_id: `${body.plate_number}`, + odometer: Number.parseInt(`${body.odometer}`), + health_state: Number.parseInt(`${body.health_state}`), + }); + if (!createResult) { + logger.error("Failed to create vehicle"); + return res.status(500).json({ + error: "Failed to create vehicle", + }); + } + logger.info(`Vehicle created successfully ! (${body.plate_number})`); + return res.status(201).json({ + message: "Vehicle created successfully", + }); +} + +/** + * Updates a vehicle in the database. + * + * @param {Request} req - The request object containing the vehicle data in the request body and the vehicle ID in the request parameters. + * @param {Response} res - The response object used to send the result of the update operation. + * + * @return {Promise} A promise that resolves to the response object with a status and a JSON body indicating the result of the update operation. + */ +async function updateVehicle(req: Request, res: Response): Promise { + const body: IDbVehicle = req.body; + const vehicleId = req.params["vehicleId"]; + if (!vehicleId || vehicleId.length !== 36) { + if (isDebugMode()) logger.error("Vehicle ID is missing"); + return res.status(400).json({ + error: "Vehicle ID is missing or not valid", + }); + } + const updateResult = await VehicleService.update({ + plate_number: `${body.plate_number}`, + model_id: `${body.plate_number}`, + odometer: Number.parseInt(`${body.odometer}`), + health_state: Number.parseInt(`${body.health_state}`), + }); + if (!updateResult) { + logger.error("Failed to update vehicle"); + return res.status(500).json({ + error: "Failed to update vehicle", + }); + } + logger.info(`Vehicle updated successfully ! (${body.plate_number})`); + return res.status(200).json({ + message: "Vehicle updated successfully", + }); +} + +/** + * Retrieves all vehicles from the vehicle service. + * + * @param {Response} res - The response object from the client. + * @returns {Promise} A promise that resolves to a response object containing the result of the operation. The result is a JSON object containing all vehicles. + */ +async function getAllVehicle(res: Response): Promise { + const getAllVehicleResult = await VehicleService.getAll(); + if (!getAllVehicleResult) { + logger.error("Failed to get all vehicles"); + return res.status(500).json({ + error: "Failed to get all vehicles", + }); + } + return res.status(200).json(getAllVehicleResult); +} + +/** + * Retrieves the available vehicles from the VehicleService + * + * @param {Response} res - The Response object to send the result to + * @returns {Promise>>} - A promise that resolves to a Response object containing the available vehicles or an error message + */ +async function getAvailableVehicle(res: Response): Promise>> { + const getAvailableVehicleResult = await VehicleService.getAvailable(); + if (!getAvailableVehicleResult) { + logger.error("Failed to get available vehicles"); + return res.status(500).json({ + error: "Failed to get available vehicles", + }); + } + return res.status(200).json(getAvailableVehicleResult); +} + +/** + * Retrieves a vehicle by its ID. + * + * @param {Request} req - The request object containing the vehicle ID. + * @param {Response} res - The response object used to send the result. + * + * @return {Promise} A promise that resolves to the result of the retrieval operation. + */ +async function getVehicleById(req: Request, res: Response): Promise { + const vehicleId = req.params["vehicleId"]; + if (!vehicleId || vehicleId.length !== 36) { + if (isDebugMode()) logger.error("Vehicle ID is missing or not valid"); + return res.status(400).json({ + error: "Vehicle ID is missing or not valid", + }); + } + const getVehicleResult = await VehicleService.getById(vehicleId); + if (!getVehicleResult) { + logger.error(`Failed to get vehicle by ID: ${vehicleId}`); + return res.status(500).json({ + error: `Failed to get vehicle by ID: ${vehicleId}`, + }); + } + return res.status(200).json(getVehicleResult); +} + +/** + * Deletes a vehicle. + * + * @param {Object} req - The request object. + * @param {Object} res - The response object. + * + * @return {Promise} A promise that resolves to the response JSON object. + */ +async function deleteVehicle(req: Request, res: Response): Promise { + const vehicleId = req.params["vehicleId"]; + if (!vehicleId || vehicleId.length !== 36) { + if (isDebugMode()) logger.error("Vehicle ID is missing or not valid"); + return res.status(400).json({ + error: "Vehicle ID is missing or not valid", + }); + } + const deleteResult = await VehicleService.delete(vehicleId); + if (!deleteResult) { + logger.error(`Failed to delete vehicle with ID: ${vehicleId}`); + return res.status(500).json({ + error: `Failed to delete vehicle with ID: ${vehicleId}`, + }); + } + logger.info(`Vehicle deleted successfully ! (ID: ${vehicleId})`); + return res.status(200).json({ + message: "Vehicle deleted successfully", + }); +} + +if (isDebugMode()) logger.debug("\nController loaded."); + +const VehicleController = { + create: createVehicle, + update: updateVehicle, + getAll: getAllVehicle, + delete: deleteVehicle, + getById: getVehicleById, + getAvailable: getAvailableVehicle, +}; + +export default VehicleController;