Compare commits

...

3 Commits

Author SHA1 Message Date
f87aecaf75
feat(routes): update endpoints in rentRouter
Update `rentRouter.ts` to include `VehicleController` methods in route handlers.
- Add `VehicleController.getAll` to "/veh/all" route.
- Update "/veh/:vehicleId" route to include `VehicleController.getById`, `VehicleController.update`, and `VehicleController.delete`.

Issue: #22
Signed-off-by: Mathis <yidhra@tuta.io>
2024-05-03 11:17:45 +02:00
170b9a5693
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 <yidhra@tuta.io>
2024-05-03 11:17:23 +02:00
c9ca39ddfa
feat(services): update code formatting in vehicle.service.ts
- Modify import statement format and standardize indentation across the entire file.
- Add line breaks and commas where needed for better readability.
- Remove unnecessary comments and white space.
- Ensure consistent usage of semicolons.

Signed-off-by: Mathis <yidhra@tuta.io>
2024-05-03 11:01:54 +02:00
3 changed files with 223 additions and 50 deletions

View File

@ -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<Response>} The response with the result of the operation.
*/
async function createVehicle(req: Request, res: Response): Promise<Response> {
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<Response>} 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<Response> {
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<Response>} 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<Response> {
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<Response<any, Record<string, any>>>} - A promise that resolves to a Response object containing the available vehicles or an error message
*/
async function getAvailableVehicle(res: Response): Promise<Response<any, Record<string, any>>> {
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<Response>} A promise that resolves to the result of the retrieval operation.
*/
async function getVehicleById(req: Request, res: Response): Promise<Response> {
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<Response>} A promise that resolves to the response JSON object.
*/
async function deleteVehicle(req: Request, res: Response): Promise<Response> {
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;

View File

@ -1,27 +1,28 @@
import AdminGuard from "@validators/AdminGuard"; import AdminGuard from "@validators/AdminGuard";
import UserGuard from "@validators/UserGuard"; import UserGuard from "@validators/UserGuard";
import express, { type Router } from "express"; import express, { type Router } from "express";
import VehicleController from "@controllers/vehicle.controller";
const RentRouter: Router = express.Router(); const RentRouter: Router = express.Router();
// Get rent affected to the user // Get rent affected to the user
RentRouter.route("/affected").get(UserGuard); RentRouter.route("/affected").get(UserGuard);
// Get all vehicle in rent (admin only) // Get all vehicle in rent (admin only) //TODO Non implemented yet
RentRouter.route("/affected/all").get(AdminGuard); RentRouter.route("/affected/all").get(AdminGuard);
// Add a new vehicle (admin only) // Add a new vehicle (admin only)
RentRouter.route("/veh/new").post(AdminGuard); RentRouter.route("/veh/new").post(AdminGuard);
// Get all vehicles // Get all vehicles
RentRouter.route("/veh/all").get(); RentRouter.route("/veh/all").get(VehicleController.getAll);
// Rent a specific vehicle // Rent a specific vehicle
RentRouter.route("/veh/rent/:vehicleId").post(UserGuard); RentRouter.route("/veh/rent/:vehicleId").post(UserGuard);
RentRouter.route("/veh/:vehicleId") RentRouter.route("/veh/:vehicleId")
.get(UserGuard) .get(UserGuard, VehicleController.getById)
.patch(AdminGuard) .patch(AdminGuard, VehicleController.update)
.delete(AdminGuard); .delete(AdminGuard, VehicleController.delete);
export default RentRouter; export default RentRouter;

View File

@ -1,9 +1,9 @@
import type { IDbVehicle } from "@interfaces/database/IDbVehicle";
//import { ErrorType, type ISError } from "@interfaces/services/ISError"; //import { ErrorType, type ISError } from "@interfaces/services/ISError";
import MySqlService from "@services/mysql.service"; import MySqlService from "@services/mysql.service";
import { isDebugMode } from "@utils/debugState"; import { isDebugMode } from "@utils/debugState";
import { Logger } from "tslog"; import { Logger } from "tslog";
import { v4 } from "uuid"; import { v4 } from "uuid";
import {IDbVehicle} from "@interfaces/database/IDbVehicle";
const logger = new Logger({ const logger = new Logger({
name: "VehicleService", name: "VehicleService",
@ -19,8 +19,8 @@ async function createVehicleService(data: IDbVehicle) {
plate_number: data.plate_number, plate_number: data.plate_number,
model_id: data.model_id, model_id: data.model_id,
odometer: data.odometer | 0, odometer: data.odometer | 0,
health_state: data.health_state health_state: data.health_state,
}) });
if (result.affectedRows !== 0) { if (result.affectedRows !== 0) {
logger.info("\n\n> Success !"); logger.info("\n\n> Success !");
return true; return true;
@ -36,24 +36,24 @@ async function updateVehicleService(data: IDbVehicle) {
if (isDebugMode()) logger.debug(`\n\n> Updating vehicle...\n`); if (isDebugMode()) logger.debug(`\n\n> Updating vehicle...\n`);
try { try {
if (!data.id) { if (!data.id) {
return false return false;
} }
const result = await MySqlService.Vehicle.update(DbHandler, { const result = await MySqlService.Vehicle.update(DbHandler, {
id: data.id, id: data.id,
plate_number: data.plate_number, plate_number: data.plate_number,
model_id: data.model_id, model_id: data.model_id,
odometer: data.odometer | 0, odometer: data.odometer | 0,
health_state: data.health_state health_state: data.health_state,
}); });
if (result.affectedRows !== 0) { if (result.affectedRows !== 0) {
logger.info("\n\n> Success !"); logger.info("\n\n> Success !");
return true; return true;
} }
return false; return false;
} catch (error) { } catch (error) {
logger.error(`\n\n> Error updating vehicle: \n${error}\n`); logger.error(`\n\n> Error updating vehicle: \n${error}\n`);
return false; return false;
} }
} }
async function getAllVehiclesService() { async function getAllVehiclesService() {
@ -62,7 +62,7 @@ async function getAllVehiclesService() {
return { return {
iat: Date.now(), iat: Date.now(),
vehicles: result, vehicles: result,
total: result.length total: result.length,
}; };
} catch (error) { } catch (error) {
logger.error(`\n\n> Error getting vehicles: \n${error}\n`); logger.error(`\n\n> Error getting vehicles: \n${error}\n`);
@ -72,15 +72,15 @@ async function getAllVehiclesService() {
async function getVehicleByIdService(vehicleId: string) { async function getVehicleByIdService(vehicleId: string) {
try { try {
const result = await MySqlService.Vehicle.getById(DbHandler, vehicleId); const result = await MySqlService.Vehicle.getById(DbHandler, vehicleId);
return { return {
iat: Date.now(), iat: Date.now(),
vehicle: result vehicle: result,
}; };
} catch (error) { } catch (error) {
logger.error(`\n\n> Error getting vehicle by id: \n${error}\n`); logger.error(`\n\n> Error getting vehicle by id: \n${error}\n`);
return false; return false;
} }
} }
async function getAvailableVehicleService() { async function getAvailableVehicleService() {
@ -89,30 +89,28 @@ async function getAvailableVehicleService() {
return { return {
iat: Date.now(), iat: Date.now(),
vehicles: result, vehicles: result,
total: result.length total: result.length,
}; };
} catch (error) { } catch (error) {
logger.error(`\n\n> Error getting available vehicles: \n${error}\n`); logger.error(`\n\n> Error getting available vehicles: \n${error}\n`);
return false; return false;
} }
} }
async function deleteVehicleService(vehicleId: string) { async function deleteVehicleService(vehicleId: string) {
try { try {
//TODO DELETE const result = await MySqlService.Vehicle.delete(DbHandler, vehicleId);
const result = await MySqlService.Vehicle.delete(DbHandler, vehicleId); if (result.affectedRows !== 0) {
if (result.affectedRows !== 0) { logger.info("\n\n> Success !");
logger.info("\n\n> Success !"); return true;
return true; }
} return false;
return false; } catch (error) {
} catch (error) { logger.error(`\n\n> Error deleting vehicle: \n${error}\n`);
logger.error(`\n\n> Error deleting vehicle: \n${error}\n`); return false;
return false; }
}
} }
if (isDebugMode()) logger.debug("\nService loaded."); if (isDebugMode()) logger.debug("\nService loaded.");
const VehicleService = { const VehicleService = {
@ -121,7 +119,7 @@ const VehicleService = {
getAll: getAllVehiclesService, getAll: getAllVehiclesService,
getById: getVehicleByIdService, getById: getVehicleByIdService,
delete: deleteVehicleService, delete: deleteVehicleService,
getAvailable: getAvailableVehicleService getAvailable: getAvailableVehicleService,
} };
export default VehicleService; export default VehicleService;