diff --git a/src/controller/admin/configuration/equipmentController.ts b/src/controller/admin/configuration/equipmentController.ts index 82f4b60..91c6f0a 100644 --- a/src/controller/admin/configuration/equipmentController.ts +++ b/src/controller/admin/configuration/equipmentController.ts @@ -7,6 +7,7 @@ import { UpdateEquipmentCommand, } from "../../../command/configuration/equipment/equipmentCommand"; import EquipmentCommandHandler from "../../../command/configuration/equipment/equipmentCommandHandler"; +import MissionService from "../../../service/operation/missionService"; /** * @description get all equipments @@ -63,6 +64,20 @@ export async function getEquipmentById(req: Request, res: Response): Promise} + */ +export async function getAvailabeEquipmentsByMission(req: Request, res: Response): Promise { + const missionId = req.params.missionId; + let mission = await MissionService.getById(missionId); + let equipments = await EquipmentService.getAvailable(mission.mission_start ?? new Date()); + + res.json(EquipmentFactory.mapToBase(equipments)); +} + /** * @description create equipment * @param req {Request} Express req object diff --git a/src/controller/admin/configuration/forceController.ts b/src/controller/admin/configuration/forceController.ts index 398833f..53914b4 100644 --- a/src/controller/admin/configuration/forceController.ts +++ b/src/controller/admin/configuration/forceController.ts @@ -7,6 +7,7 @@ import { UpdateForceCommand, } from "../../../command/configuration/force/forceCommand"; import ForceCommandHandler from "../../../command/configuration/force/forceCommandHandler"; +import MissionService from "../../../service/operation/missionService"; /** * @description get all forces @@ -63,6 +64,20 @@ export async function getForceById(req: Request, res: Response): Promise { res.json(ForceFactory.mapToSingle(force)); } +/** + * @description get available forces by missionId + * @param req {Request} Express req object + * @param res {Response} Express res object + * @returns {Promise<*>} + */ +export async function getAvailabeForcesByMission(req: Request, res: Response): Promise { + const missionId = req.params.missionId; + let mission = await MissionService.getById(missionId); + let forces = await ForceService.getAvailable(mission.mission_start ?? new Date()); + + res.json(ForceFactory.mapToBase(forces)); +} + /** * @description create force * @param req {Request} Express req object diff --git a/src/controller/admin/configuration/vehicleController.ts b/src/controller/admin/configuration/vehicleController.ts index ef04c75..e6a3b0c 100644 --- a/src/controller/admin/configuration/vehicleController.ts +++ b/src/controller/admin/configuration/vehicleController.ts @@ -7,6 +7,7 @@ import { UpdateVehicleCommand, } from "../../../command/configuration/vehicle/vehicleCommand"; import VehicleCommandHandler from "../../../command/configuration/vehicle/vehicleCommandHandler"; +import MissionService from "../../../service/operation/missionService"; /** * @description get all vehicles @@ -63,6 +64,20 @@ export async function getVehicleById(req: Request, res: Response): Promise res.json(VehicleFactory.mapToSingle(vehicle)); } +/** + * @description get available vehicles by missionId + * @param req {Request} Express req object + * @param res {Response} Express res object + * @returns {Promise<*>} + */ +export async function getAvailabeVehiclesByMission(req: Request, res: Response): Promise { + const missionId = req.params.missionId; + let mission = await MissionService.getById(missionId); + let vehicles = await VehicleService.getAvailable(mission.mission_start ?? new Date()); + + res.json(VehicleFactory.mapToBase(vehicles)); +} + /** * @description create vehicle * @param req {Request} Express req object diff --git a/src/routes/admin/configuration/equipment.ts b/src/routes/admin/configuration/equipment.ts index 02da2f9..1d55a54 100644 --- a/src/routes/admin/configuration/equipment.ts +++ b/src/routes/admin/configuration/equipment.ts @@ -4,6 +4,7 @@ import { decommissionEquipmentById, deleteEquipmentById, getAllEquipments, + getAvailabeEquipmentsByMission, getEquipmentById, getEquipmentsByIds, updateEquipmentById, @@ -24,6 +25,10 @@ router.get("/:id", async (req: Request, res: Response) => { await getEquipmentById(req, res); }); +router.get("/available/:missionId", async (req: Request, res: Response) => { + await getAvailabeEquipmentsByMission(req, res); +}); + router.post( "/", PermissionHelper.passCheckMiddleware("create", "operation", "equipment"), diff --git a/src/routes/admin/configuration/force.ts b/src/routes/admin/configuration/force.ts index b1b4540..b556aa8 100644 --- a/src/routes/admin/configuration/force.ts +++ b/src/routes/admin/configuration/force.ts @@ -6,6 +6,7 @@ import { getAllForces, getForceById, getForcesByIds, + getAvailabeForcesByMission, updateForceById, } from "../../../controller/admin/configuration/forceController"; import PermissionHelper from "../../../helpers/permissionHelper"; @@ -24,6 +25,10 @@ router.get("/:id", async (req: Request, res: Response) => { await getForceById(req, res); }); +router.get("/available/:missionId", async (req: Request, res: Response) => { + await getAvailabeForcesByMission(req, res); +}); + router.post( "/", PermissionHelper.passCheckMiddleware("create", "operation", "force"), diff --git a/src/routes/admin/configuration/vehicle.ts b/src/routes/admin/configuration/vehicle.ts index 746e97e..11c5053 100644 --- a/src/routes/admin/configuration/vehicle.ts +++ b/src/routes/admin/configuration/vehicle.ts @@ -4,6 +4,7 @@ import { decommissionVehicleById, deleteVehicleById, getAllVehicles, + getAvailabeVehiclesByMission, getVehicleById, getVehiclesByIds, updateVehicleById, @@ -24,6 +25,10 @@ router.get("/:id", async (req: Request, res: Response) => { await getVehicleById(req, res); }); +router.get("/available/:missionId", async (req: Request, res: Response) => { + await getAvailabeVehiclesByMission(req, res); +}); + router.post( "/", PermissionHelper.passCheckMiddleware("create", "operation", "vehicle"), diff --git a/src/routes/admin/index.ts b/src/routes/admin/index.ts index 4a6bedd..c31ab88 100644 --- a/src/routes/admin/index.ts +++ b/src/routes/admin/index.ts @@ -16,9 +16,30 @@ var router = express.Router({ mergeParams: true }); router.use("/mission", PermissionHelper.passCheckMiddleware("read", "operation", "mission"), mission); -router.use("/equipment", PermissionHelper.passCheckMiddleware("read", "configuration", "equipment"), equipment); -router.use("/force", PermissionHelper.passCheckMiddleware("read", "configuration", "force"), force); -router.use("/vehicle", PermissionHelper.passCheckMiddleware("read", "configuration", "vehicle"), vehicle); +router.use( + "/equipment", + PermissionHelper.passCheckSomeMiddleware([ + { requiredPermissions: "read", section: "configuration", module: "equipment" }, + { requiredPermissions: "read", section: "operation", module: "mission" }, + ]), + equipment +); +router.use( + "/force", + PermissionHelper.passCheckSomeMiddleware([ + { requiredPermissions: "read", section: "configuration", module: "force" }, + { requiredPermissions: "read", section: "operation", module: "mission" }, + ]), + force +); +router.use( + "/vehicle", + PermissionHelper.passCheckSomeMiddleware([ + { requiredPermissions: "read", section: "configuration", module: "vehicle" }, + { requiredPermissions: "read", section: "operation", module: "mission" }, + ]), + vehicle +); router.use("/role", PermissionHelper.passCheckMiddleware("read", "management", "role"), role); router.use( diff --git a/src/service/configuration/equipmentService.ts b/src/service/configuration/equipmentService.ts index 03321ff..130be57 100644 --- a/src/service/configuration/equipmentService.ts +++ b/src/service/configuration/equipmentService.ts @@ -1,3 +1,4 @@ +import { Brackets } from "typeorm"; import { dataSource } from "../../data-source"; import { equipment } from "../../entity/configuration/equipment"; import DatabaseActionException from "../../exceptions/databaseActionException"; @@ -75,4 +76,30 @@ export default abstract class EquipmentService { throw new DatabaseActionException("SELECT", "equipment", err); }); } + + /** + * @description get available equipments + * @returns {Promise>} + */ + static async getAvailable(keyDate: Date): Promise> { + return await dataSource + .getRepository(equipment) + .createQueryBuilder("equipment") + .where("equipment.commissioned <= :keyDate_start", { keyDate_start: keyDate }) + .andWhere( + new Brackets((qb) => + qb + .where("equipment.decommissioned IS NULL") + .orWhere("equipment.decommissioned >= :keyDate_end", { keyDate_end: keyDate }) + ) + ) + .orderBy("equipment.name") + .getMany() + .then((res) => { + return res; + }) + .catch((err) => { + throw new DatabaseActionException("SELECT", "equipment", err); + }); + } } diff --git a/src/service/configuration/forceService.ts b/src/service/configuration/forceService.ts index ae514ba..97e5ff5 100644 --- a/src/service/configuration/forceService.ts +++ b/src/service/configuration/forceService.ts @@ -1,3 +1,4 @@ +import { Brackets } from "typeorm"; import { dataSource } from "../../data-source"; import { force } from "../../entity/configuration/force"; import DatabaseActionException from "../../exceptions/databaseActionException"; @@ -77,4 +78,32 @@ export default abstract class ForceService { throw new DatabaseActionException("SELECT", "force", err); }); } + + /** + * @description get available forces + * @returns {Promise>} + */ + static async getAvailable(keyDate: Date): Promise> { + return await dataSource + .getRepository(force) + .createQueryBuilder("force") + .where("force.commissioned <= :keyDate_start", { keyDate_start: keyDate }) + .andWhere( + new Brackets((qb) => + qb + .where("force.decommissioned IS NULL") + .orWhere("force.decommissioned >= :keyDate_end", { keyDate_end: keyDate }) + ) + ) + .orderBy("force.lastname") + .addOrderBy("force.firstname") + .addOrderBy("force.nameaffix") + .getMany() + .then((res) => { + return res; + }) + .catch((err) => { + throw new DatabaseActionException("SELECT", "force", err); + }); + } } diff --git a/src/service/configuration/vehicleService.ts b/src/service/configuration/vehicleService.ts index 1d7a5e2..7a412a2 100644 --- a/src/service/configuration/vehicleService.ts +++ b/src/service/configuration/vehicleService.ts @@ -1,3 +1,4 @@ +import { Brackets } from "typeorm"; import { dataSource } from "../../data-source"; import { vehicle } from "../../entity/configuration/vehicle"; import DatabaseActionException from "../../exceptions/databaseActionException"; @@ -75,4 +76,30 @@ export default abstract class VehicleService { throw new DatabaseActionException("SELECT", "vehicle", err); }); } + + /** + * @description get available vehicles + * @returns {Promise>} + */ + static async getAvailable(keyDate: Date): Promise> { + return await dataSource + .getRepository(vehicle) + .createQueryBuilder("vehicle") + .where("vehicle.commissioned <= :keyDate_start", { keyDate_start: keyDate }) + .andWhere( + new Brackets((qb) => + qb + .where("vehicle.decommissioned IS NULL") + .orWhere("vehicle.decommissioned >= :keyDate_end", { keyDate_end: keyDate }) + ) + ) + .orderBy("vehicle.name") + .getMany() + .then((res) => { + return res; + }) + .catch((err) => { + throw new DatabaseActionException("SELECT", "vehicle", err); + }); + } }