From 0328ca11c465611e6c86ae5ce8a49dc9ce12ee28 Mon Sep 17 00:00:00 2001 From: shawon-majid Date: Sun, 31 Mar 2024 01:27:59 +0600 Subject: [PATCH 1/5] scheduling algorithm added --- server/src/controllers/optimization.ts | 71 ++++++++++++++++++-------- server/src/services/optmization.ts | 2 +- server/src/types/schdule.ts | 6 +++ server/src/types/vehicle.ts | 2 + 4 files changed, 59 insertions(+), 22 deletions(-) create mode 100644 server/src/types/schdule.ts diff --git a/server/src/controllers/optimization.ts b/server/src/controllers/optimization.ts index f55a646..4f4c5dd 100644 --- a/server/src/controllers/optimization.ts +++ b/server/src/controllers/optimization.ts @@ -10,35 +10,64 @@ import { getSortedSTSFromLandfill, getSortedVehiclesBySTS, } from "../services/optmization"; +import CustomError from "../services/CustomError"; +import { Schedule } from "../types/schdule"; const prisma = new PrismaClient(); -const getSchedule = async () => { - const stsList = await prisma.sTS.findMany({}); +const getSchedule = async (stsId: string) => { + const sts = await prisma.sTS.findUnique({ + where: { + id: stsId, + }, + }); - const vehicles: Vehicle[] = await getSortedVehiclesBySTS(stsList[0].id); + if (!sts) { + throw new CustomError("STS not found", 404); + } - console.log(vehicles); + let ctw = Number(sts.currentTotalWaste); - // const queue = new pq({ - // comparator: (a: Vehicle, b: Vehicle) => { - // if (a.busyTime && b.busyTime) { - // return a.busyTime - b.busyTime; - // } - // return 0; // Return a default value of 0 when a.busyTime or b.busyTime is undefined - // }, - // }); - // // enter all vehicles in the queue, with the priority being the emergency factor + const vehicles: Vehicle[] = await getSortedVehiclesBySTS(stsId); - // vehicles.forEach((vehicle: Vehicle) => { - // queue.queue(vehicle); - // }); + const vehicleNumbers = vehicles.map((vehicle) => vehicle.vehicleNumber); - // for (let i = 0; i < queue.length; i++) { - // console.log(queue.dequeue()); - // } + console.log(vehicleNumbers); - // console.log(stsList); + const schdules: Schedule[] = []; + + while (ctw > 0 && vehicles.length > 0) { + let vehicle = vehicles.shift(); + let capacity = Number(vehicle?.capacity); + + const needed = Math.ceil(ctw / capacity); + + const times = Math.min(needed, 3); + + ctw = ctw - times * capacity; + console.log("ctw:", ctw); + console.log("duration:", vehicle?.duration); + + console.log("vehicle:", vehicle?.vehicleNumber); + + let time = new Date(); + time.setHours(9, 0); + + for (let i = 0; i < times; i++) { + const timeString = time.toLocaleTimeString().toString(); + schdules.push({ + vehicleId: vehicle?.id || "", + vehicleNumber: vehicle?.vehicleNumber || "", + time: timeString, + }); + + time.setMinutes(time.getMinutes() + 2 * (vehicle?.duration || 0)); + } + } + + schdules.forEach((schedule) => { + console.log(`${schedule.vehicleNumber}: ${schedule.time} `); + }); }; -getSchedule(); +getSchedule("sts1"); diff --git a/server/src/services/optmization.ts b/server/src/services/optmization.ts index 10c5c31..88b947a 100644 --- a/server/src/services/optmization.ts +++ b/server/src/services/optmization.ts @@ -17,7 +17,7 @@ const getSortedVehiclesBySTS = async (stsId: string) => { const vehicles: Vehicle[] = await prisma.$queryRaw` SELECT * FROM "Vehicle" WHERE "stsId" = ${stsId} - ORDER BY ("loadedFuelCostPerKm" / "capacity") DESC + ORDER BY ("loadedFuelCostPerKm" / "capacity") ASC `; vehicles.forEach((vehicle) => { diff --git a/server/src/types/schdule.ts b/server/src/types/schdule.ts new file mode 100644 index 0000000..63cbb2c --- /dev/null +++ b/server/src/types/schdule.ts @@ -0,0 +1,6 @@ +export interface Schedule { + day?: string; + vehicleId?: string; + vehicleNumber?: string; + time?: string; +} diff --git a/server/src/types/vehicle.ts b/server/src/types/vehicle.ts index 3ef1c5c..15e5081 100644 --- a/server/src/types/vehicle.ts +++ b/server/src/types/vehicle.ts @@ -8,6 +8,8 @@ export interface Vehicle { currentLatitude?: number; currentLongitude?: number; landFillId?: string; + duration?: number; + distance?: number; createdAt?: Date; updatedAt?: Date; busyTime?: number; From 65e6474c5613d54673b42576c75af36633d5c5b4 Mon Sep 17 00:00:00 2001 From: shawon-majid Date: Sun, 31 Mar 2024 03:24:05 +0600 Subject: [PATCH 2/5] schedule api endpoints added --- server/src/controllers/schedule.ts | 99 +++++++++++++++++++ server/src/index.ts | 2 + server/src/prisma/schema.prisma | 23 ++++- server/src/routes/schedule.ts | 14 +++ .../optimization.ts => services/schedule.ts} | 42 ++++---- server/src/types/schdule.ts | 5 + 6 files changed, 158 insertions(+), 27 deletions(-) create mode 100644 server/src/controllers/schedule.ts create mode 100644 server/src/routes/schedule.ts rename server/src/{controllers/optimization.ts => services/schedule.ts} (55%) diff --git a/server/src/controllers/schedule.ts b/server/src/controllers/schedule.ts new file mode 100644 index 0000000..3788f65 --- /dev/null +++ b/server/src/controllers/schedule.ts @@ -0,0 +1,99 @@ +import { Prisma, PrismaClient } from "@prisma/client"; +import { Request, Response } from "express"; +import { getSchedule } from "../services/schedule"; + +import errorWrapper from "../middlewares/errorWrapper"; + +const prisma = new PrismaClient(); + +const createSchedule = errorWrapper( + async (req: Request, res: Response) => { + const { date } = req.params; + + // check if schedule of this date already exists + const schedule = await prisma.schedule.findFirst({ + where: { + scheduleDate: new Date(date), + }, + }); + + if (schedule) { + return res.json({ message: "Schedule Already Exists" }); + } + + const stsList = await prisma.sTS.findMany(); + + // const rawSchedule = await getSchedule(stsId); + + stsList.forEach(async (sts) => { + const { ctw } = await getSchedule(sts.id, new Date(date)); + + await prisma.sTS.update({ + where: { + id: sts.id, + }, + data: { + currentTotalWaste: ctw, + }, + }); + }); + + res.json({ message: "Schedule Created" }); + }, + { message: "Schedule Creation Failed", statusCode: 500 } +); + +const getScheduleBySTS = errorWrapper(async (req: Request, res: Response) => { + const stsId = req.params.stsId; + const schedules = await prisma.schedule.findMany({ + where: { + stsId: stsId, + }, + }); + + res.json(schedules); +}); + +const searchSchedule = errorWrapper(async (req: Request, res: Response) => { + const { stsId, date } = req.query; + + let where: Prisma.ScheduleWhereInput | undefined = undefined; + + if (stsId || date) { + where = {}; + if (stsId) { + where.stsId = stsId as string; + } + + if (date) { + const dateObject = { + gte: new Date(date as string), + lt: new Date( + new Date(date as string).setDate( + new Date(date as string).getDate() + 1 + ) + ), + }; + where.scheduleDate = dateObject; + } + } + + const schedules = await prisma.schedule.findMany({ + where, + include: { + sts: true, + vehicle: { + include: { + landFill: true, + }, + }, + }, + orderBy: { + scheduleTime: "asc", + }, + }); + + res.json(schedules); +}); + +export { createSchedule, getScheduleBySTS, searchSchedule }; diff --git a/server/src/index.ts b/server/src/index.ts index 5419336..bd196d3 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -14,6 +14,7 @@ import landfillEntryRoute from "./routes/landfillVehicle"; import stsEntryRoute from "./routes/stsVehicle"; import billRoute from "./routes/bills"; import tripRoute from "./routes/trip"; +import scheduleRoute from "./routes/schedule"; import cors from "cors"; const prisma = new PrismaClient(); @@ -42,6 +43,7 @@ app.use("/landfill-entry", landfillEntryRoute); app.use("/sts-entry", stsEntryRoute); app.use("/bills", billRoute); app.use("/trips", tripRoute); +app.use("/schedules", scheduleRoute); app.get("/", (req, res) => { res.send("EcoSync Server is Up..."); diff --git a/server/src/prisma/schema.prisma b/server/src/prisma/schema.prisma index 4e726a0..426b587 100644 --- a/server/src/prisma/schema.prisma +++ b/server/src/prisma/schema.prisma @@ -73,9 +73,10 @@ model Vehicle { LandfillVehicleEntry LandfillVehicleEntry[] Bill Bill[] - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt Trip Trip[] + Schedule Schedule[] } model STS { @@ -92,9 +93,10 @@ model STS { manager User[] Trip Trip[] - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt Bill Bill[] + Schedule Schedule[] } model Landfill { @@ -190,3 +192,16 @@ model Trip { updatedAt DateTime @updatedAt Bill Bill[] } + +model Schedule { + id String @id @default(uuid()) + sts STS @relation(fields: [stsId], references: [id], onDelete: Cascade) + stsId String + vehicle Vehicle @relation(fields: [vehicleId], references: [id], onDelete: Cascade) + vehicleId String + scheduleDate DateTime + scheduleTime String + wasteAmount Decimal? @db.Decimal(10, 2) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} diff --git a/server/src/routes/schedule.ts b/server/src/routes/schedule.ts new file mode 100644 index 0000000..77aab53 --- /dev/null +++ b/server/src/routes/schedule.ts @@ -0,0 +1,14 @@ +import express from "express"; +const router = express.Router(); + +import { + createSchedule, + getScheduleBySTS, + searchSchedule, +} from "../controllers/schedule"; + +router.route("/create/:date").post(createSchedule); +router.route("/search").get(searchSchedule); +router.route("/:stsId").get(getScheduleBySTS); + +export default router; diff --git a/server/src/controllers/optimization.ts b/server/src/services/schedule.ts similarity index 55% rename from server/src/controllers/optimization.ts rename to server/src/services/schedule.ts index 4f4c5dd..30213e5 100644 --- a/server/src/controllers/optimization.ts +++ b/server/src/services/schedule.ts @@ -1,7 +1,7 @@ import dotenv from "dotenv"; dotenv.config(); -import { PrismaClient } from "@prisma/client"; +import { PrismaClient, Schedule } from "@prisma/client"; import pq from "js-priority-queue"; @@ -9,13 +9,12 @@ import { Vehicle } from "../types/vehicle"; import { getSortedSTSFromLandfill, getSortedVehiclesBySTS, -} from "../services/optmization"; -import CustomError from "../services/CustomError"; -import { Schedule } from "../types/schdule"; +} from "./optmization"; +import CustomError from "./CustomError"; const prisma = new PrismaClient(); -const getSchedule = async (stsId: string) => { +const getSchedule = async (stsId: string, today: Date) => { const sts = await prisma.sTS.findUnique({ where: { id: stsId, @@ -30,11 +29,7 @@ const getSchedule = async (stsId: string) => { const vehicles: Vehicle[] = await getSortedVehiclesBySTS(stsId); - const vehicleNumbers = vehicles.map((vehicle) => vehicle.vehicleNumber); - - console.log(vehicleNumbers); - - const schdules: Schedule[] = []; + const schedules: Schedule[] = []; while (ctw > 0 && vehicles.length > 0) { let vehicle = vehicles.shift(); @@ -45,29 +40,30 @@ const getSchedule = async (stsId: string) => { const times = Math.min(needed, 3); ctw = ctw - times * capacity; - console.log("ctw:", ctw); - console.log("duration:", vehicle?.duration); - - console.log("vehicle:", vehicle?.vehicleNumber); let time = new Date(); - time.setHours(9, 0); + time.setHours(9, 0, 0); for (let i = 0; i < times; i++) { const timeString = time.toLocaleTimeString().toString(); - schdules.push({ - vehicleId: vehicle?.id || "", - vehicleNumber: vehicle?.vehicleNumber || "", - time: timeString, + + const newSchedule = await prisma.schedule.create({ + data: { + scheduleDate: new Date(today), + vehicleId: vehicle?.id || "", + stsId: stsId, + wasteAmount: capacity, + scheduleTime: timeString, + }, }); + schedules.push(newSchedule); + time.setMinutes(time.getMinutes() + 2 * (vehicle?.duration || 0)); } } - schdules.forEach((schedule) => { - console.log(`${schedule.vehicleNumber}: ${schedule.time} `); - }); + return { schedules, ctw }; }; -getSchedule("sts1"); +export { getSchedule }; diff --git a/server/src/types/schdule.ts b/server/src/types/schdule.ts index 63cbb2c..d7c3c16 100644 --- a/server/src/types/schdule.ts +++ b/server/src/types/schdule.ts @@ -2,5 +2,10 @@ export interface Schedule { day?: string; vehicleId?: string; vehicleNumber?: string; + stsId?: string; + landFillId?: string; + wasteAmount?: number; + time?: string; + date?: Date; } From 3e5e482cc7d682221517574a3d973bcd425d7828 Mon Sep 17 00:00:00 2001 From: shawon-majid Date: Sun, 31 Mar 2024 03:50:41 +0600 Subject: [PATCH 3/5] bug fixed --- server/src/controllers/schedule.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/server/src/controllers/schedule.ts b/server/src/controllers/schedule.ts index 3788f65..4e66de3 100644 --- a/server/src/controllers/schedule.ts +++ b/server/src/controllers/schedule.ts @@ -23,9 +23,7 @@ const createSchedule = errorWrapper( const stsList = await prisma.sTS.findMany(); - // const rawSchedule = await getSchedule(stsId); - - stsList.forEach(async (sts) => { + for (let sts of stsList) { const { ctw } = await getSchedule(sts.id, new Date(date)); await prisma.sTS.update({ @@ -33,10 +31,10 @@ const createSchedule = errorWrapper( id: sts.id, }, data: { - currentTotalWaste: ctw, + currentTotalWaste: ctw >= 0 ? ctw : 0, }, }); - }); + } res.json({ message: "Schedule Created" }); }, From dad5194e279697511c2687d8d569c18a58763169 Mon Sep 17 00:00:00 2001 From: shawon-majid Date: Sun, 31 Mar 2024 04:40:06 +0600 Subject: [PATCH 4/5] authentication and authorization on the basis of role added --- server/src/controllers/auth.ts | 12 +++++++++++- server/src/index.ts | 15 ++++++++------- server/src/routes/auth.ts | 6 ++++-- server/src/routes/bills.ts | 13 ++++++++++--- server/src/routes/landfillVehicle.ts | 20 +++++++++++++++++--- server/src/routes/landfills.ts | 14 +++++++++++--- server/src/routes/sts.ts | 9 ++++++--- server/src/routes/stsVehicle.ts | 25 ++++++++++++++++++++----- server/src/routes/trip.ts | 8 ++++++-- server/src/routes/users.ts | 14 ++++++++++++-- server/src/routes/vehicles.ts | 14 +++++++++++--- 11 files changed, 116 insertions(+), 34 deletions(-) diff --git a/server/src/controllers/auth.ts b/server/src/controllers/auth.ts index e17f06b..86bcbfe 100644 --- a/server/src/controllers/auth.ts +++ b/server/src/controllers/auth.ts @@ -11,6 +11,7 @@ import { import CustomError from "../services/CustomError"; import { randomOTPGenerator, randomPasswordGenerator } from "../services/utils"; import { sendMail, sendOTPMail } from "../services/mailService"; +import { PERMISSIONS, getPermittedRoleNames } from "../permissions/permissions"; const prisma = new PrismaClient(); @@ -54,7 +55,7 @@ const login = errorWrapper( const user = await prisma.user.findUnique({ where: { - email, + email, }, include: { landfill: true, @@ -72,6 +73,15 @@ const login = errorWrapper( throw new Error("Invalid email or password"); } + const roles = await getPermittedRoleNames(PERMISSIONS.LOGIN); + + console.log(roles); + console.log(user.roleName); + + if (!roles.includes(user.roleName)) { + throw new CustomError("You are not allowed to login", 403); + } + const token = generateToken( { id: user.id, diff --git a/server/src/index.ts b/server/src/index.ts index bd196d3..dd0d8f4 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -16,6 +16,7 @@ import billRoute from "./routes/bills"; import tripRoute from "./routes/trip"; import scheduleRoute from "./routes/schedule"; import cors from "cors"; +import authChecker from "./middlewares/auth"; const prisma = new PrismaClient(); @@ -35,13 +36,13 @@ app.use(urlencoded({ extended: true })); app.use("/auth", authRoute); app.use("/users", userRoute); app.use("/profile", profileRoute); -app.use("/rbac", rbacRoute); -app.use("/vehicles", vehicleRoute); -app.use("/sts", stsRoute); -app.use("/landfills", landfillRoute); -app.use("/landfill-entry", landfillEntryRoute); -app.use("/sts-entry", stsEntryRoute); -app.use("/bills", billRoute); +app.use("/rbac", rbacRoute); // authentication and authorization both will be added here +app.use("/vehicles", authChecker, vehicleRoute); +app.use("/sts", authChecker, stsRoute); +app.use("/landfills", authChecker, landfillRoute); +app.use("/landfill-entry", authChecker, landfillEntryRoute); +app.use("/sts-entry", authChecker, stsEntryRoute); +app.use("/bills", authChecker, billRoute); app.use("/trips", tripRoute); app.use("/schedules", scheduleRoute); diff --git a/server/src/routes/auth.ts b/server/src/routes/auth.ts index 067ec8a..986e080 100644 --- a/server/src/routes/auth.ts +++ b/server/src/routes/auth.ts @@ -17,10 +17,12 @@ const router = express.Router(); router .route("/create") .post(authChecker, authorizer(PERMISSIONS.CREATE_USER), createUser); -router.route("/login").post(login); // add permission +router.route("/login").post(login); // add permission, have to do it manually, done router.route("/logout").get(authChecker, logout); router.route("/reset-password/initiate").post(resetPasswordInit); router.route("/reset-password/confirm").post(resetPasswordConfirm); -router.route("/change-password").post(authChecker, updatePassword); // add permission +router + .route("/change-password") + .post(authChecker, authorizer(PERMISSIONS.CHANGE_PASSWORD), updatePassword); // add permission export default router; diff --git a/server/src/routes/bills.ts b/server/src/routes/bills.ts index 8eb2bb0..8eb8368 100644 --- a/server/src/routes/bills.ts +++ b/server/src/routes/bills.ts @@ -10,13 +10,20 @@ import { getListOfBills, removeBill, } from "../controllers/bills"; +import { authorizer } from "../middlewares/authorizer"; +import { PERMISSIONS } from "../permissions/permissions"; +import authChecker from "../middlewares/auth"; router.route("/").get(fetchBills); -router.route("/search").get(getListOfBills); // add permission +router.route("/search").get(authorizer(PERMISSIONS.GET_BILLS), getListOfBills); // add permission router.route("/create").post(createBill); router.route("/:billId").get(fetchBill); router.route("/:billId").put(editBill); -router.route("/:billId").delete(removeBill); // add permission -router.route("/create-from-trip/").post(createBillFromTrip); // add permission +router + .route("/:billId") + .delete(authorizer(PERMISSIONS.DELETE_BILL), removeBill); // add permission +router + .route("/create-from-trip/") + .post(authorizer(PERMISSIONS.CREATE_BILL), createBillFromTrip); // add permission export default router; diff --git a/server/src/routes/landfillVehicle.ts b/server/src/routes/landfillVehicle.ts index bfd8c20..46c5ea1 100644 --- a/server/src/routes/landfillVehicle.ts +++ b/server/src/routes/landfillVehicle.ts @@ -6,12 +6,26 @@ import { getVehicleEntryById, updateVehicleEntry, } from "../controllers/landfillVehicle"; +import { authorizer } from "../middlewares/authorizer"; +import { PERMISSIONS } from "../permissions/permissions"; const router = express.Router(); -router.route("/create").post(addVehicleEntry); // add permission +router + .route("/create") + .post(authorizer(PERMISSIONS.CREATE_LANDFILL_VEHICLE_ENTRY), addVehicleEntry); // add permission router.route("/").get(getAllVehicleEntries); router.route("/:vehicleEntryId").get(getVehicleEntryById); -router.route("/:vehicleEntryId").put(updateVehicleEntry); // add permission -router.route("/:vehicleEntryId").delete(deleteVehicleEntry); // add permission +router + .route("/:vehicleEntryId") + .put( + authorizer(PERMISSIONS.UPDATE_LANDFILL_VEHICLE_ENTRY), + updateVehicleEntry + ); // add permission +router + .route("/:vehicleEntryId") + .delete( + authorizer(PERMISSIONS.DELETE_LANDFILL_VEHICLE_ENTRY), + deleteVehicleEntry + ); // add permission export default router; diff --git a/server/src/routes/landfills.ts b/server/src/routes/landfills.ts index 8cd451f..111d883 100644 --- a/server/src/routes/landfills.ts +++ b/server/src/routes/landfills.ts @@ -6,13 +6,21 @@ import { getLandfillById, updateLandfill, } from "../controllers/landfills"; +import { authorizer } from "../middlewares/authorizer"; +import { PERMISSIONS } from "../permissions/permissions"; const router = express.Router(); -router.route("/create").post(addlandfill); // add permission +router + .route("/create") + .post(authorizer(PERMISSIONS.CREATE_LANDFILL), addlandfill); // add permission router.route("/").get(getAllLandfills); router.route("/:landfillId").get(getLandfillById); -router.route("/:landfillId").put(updateLandfill); // add permission -router.route("/:landfillId").delete(deleteLandfill); // add permision +router + .route("/:landfillId") + .put(authorizer(PERMISSIONS.UPDATE_LANDFILL), updateLandfill); // add permission +router + .route("/:landfillId") + .delete(authorizer(PERMISSIONS.DELETE_LANDFILL), deleteLandfill); // add permision export default router; diff --git a/server/src/routes/sts.ts b/server/src/routes/sts.ts index f4f2f5e..f1dd19c 100644 --- a/server/src/routes/sts.ts +++ b/server/src/routes/sts.ts @@ -6,13 +6,16 @@ import { getSTSById, updateSTS, } from "../controllers/sts"; +import authChecker from "../middlewares/auth"; +import { authorizer } from "../middlewares/authorizer"; +import { PERMISSIONS } from "../permissions/permissions"; const router = express.Router(); -router.route("/create").post(addSTS); // add permission +router.route("/create").post(authorizer(PERMISSIONS.CREATE_STS), addSTS); // add permission router.route("/").get(getAllSTS); router.route("/:stsId").get(getSTSById); -router.route("/:stsId").put(updateSTS); // add permission -router.route("/:stsId").delete(deleteSTS); // add permision +router.route("/:stsId").put(authorizer(PERMISSIONS.UPDATE_STS), updateSTS); // add permission +router.route("/:stsId").delete(authorizer(PERMISSIONS.DELETE_STS), deleteSTS); // add permision export default router; diff --git a/server/src/routes/stsVehicle.ts b/server/src/routes/stsVehicle.ts index ef5f5ba..9978789 100644 --- a/server/src/routes/stsVehicle.ts +++ b/server/src/routes/stsVehicle.ts @@ -9,15 +9,30 @@ import { getLeftVehiclesInSTS, getAvailableVehiclesForSTS, } from "../controllers/stsVehicle"; +import { authorizer } from "../middlewares/authorizer"; +import { PERMISSIONS } from "../permissions/permissions"; const router = express.Router(); -router.route("/create").post(addVehicleEntry); // add permission +router + .route("/create") + .post(authorizer(PERMISSIONS.CREATE_STS_VEHICLE_ENTRY), addVehicleEntry); // add permission router.route("/").get(getAllVehicleEntries); router.route("/:vehicleEntryId").get(getVehicleEntryById); -router.route("/:vehicleEntryId").put(updateVehicleEntry); // add permission -router.route("/:vehicleEntryId").delete(deleteVehicleEntry); // add permission -router.route("/:stsId/get-current-vehicles").get(getCurrentVehiclesInSTS); // add permission -router.route("/:stsId/get-left-vehicles").get(getLeftVehiclesInSTS); // add permission +router + .route("/:vehicleEntryId") + .put(authorizer(PERMISSIONS.UPDATE_STS_VEHICLE_ENTRY), updateVehicleEntry); // add permission +router + .route("/:vehicleEntryId") + .delete(authorizer(PERMISSIONS.DELETE_STS_VEHICLE_ENTRY), deleteVehicleEntry); // add permission +router + .route("/:stsId/get-current-vehicles") + .get( + authorizer(PERMISSIONS.GET_CURRENT_STS_VEHICLE), + getCurrentVehiclesInSTS + ); // add permission +router + .route("/:stsId/get-left-vehicles") + .get(authorizer(PERMISSIONS.GET_LEFT_STS_VEHICLE), getLeftVehiclesInSTS); // add permission router.route("/:stsId/get-available-vehicles").get(getAvailableVehiclesForSTS); export default router; diff --git a/server/src/routes/trip.ts b/server/src/routes/trip.ts index 6a08c33..9bbaac0 100644 --- a/server/src/routes/trip.ts +++ b/server/src/routes/trip.ts @@ -1,9 +1,13 @@ import express from "express"; import { completeTrip, createTrip, getListOfTrips } from "../controllers/trip"; +import { authorizer } from "../middlewares/authorizer"; +import { PERMISSIONS } from "../permissions/permissions"; const router = express.Router(); -router.route("/create").post(createTrip); // add permission +router.route("/create").post(authorizer(PERMISSIONS.CREATE_TRIP), createTrip); // add permission router.route("/search").get(getListOfTrips); -router.route("/complete").post(completeTrip); // add permission +router + .route("/complete") + .post(authorizer(PERMISSIONS.COMPLETE_TRIP), completeTrip); // add permission export default router; diff --git a/server/src/routes/users.ts b/server/src/routes/users.ts index 7b45ea6..9497106 100644 --- a/server/src/routes/users.ts +++ b/server/src/routes/users.ts @@ -8,6 +8,8 @@ import { updateUsersRole, } from "../controllers/users"; import { getAllRoles } from "../controllers/rbac"; +import { authorizer } from "../middlewares/authorizer"; +import { PERMISSIONS } from "../permissions/permissions"; const router = express.Router(); @@ -16,8 +18,16 @@ router.route("/").get(getAllUsers); router.route("/roles").get(getAllRoles); router.route("/:userId").get(getUserById); router.route("/:userId").put(updateUser); -router.route("/:userId").delete(deleteUser); // add permission -router.route("/:userId/roles").put(updateUsersRole); // add permission +router + .route("/:userId") + .delete(authChecker, authorizer(PERMISSIONS.DELETE_USER), deleteUser); // add permission +router + .route("/:userId/roles") + .put( + authChecker, + authorizer(PERMISSIONS.UPDATING_USER_ROLE), + updateUsersRole + ); // add permission export default router; diff --git a/server/src/routes/vehicles.ts b/server/src/routes/vehicles.ts index 16a2390..1b63590 100644 --- a/server/src/routes/vehicles.ts +++ b/server/src/routes/vehicles.ts @@ -7,14 +7,22 @@ import { getVehiclesOnQuery, removeVehicle, } from "../controllers/vehicle"; +import { authorizer } from "../middlewares/authorizer"; +import { PERMISSIONS } from "../permissions/permissions"; const router = express.Router(); -router.route("/create").post(createVehicle); // add permission +router + .route("/create") + .post(authorizer(PERMISSIONS.CREATE_VEHICLE), createVehicle); // add permission router.route("/search").get(getVehiclesOnQuery); router.route("/").get(fetchAllVehicles); router.route("/:vehicleId").get(fetchVehicleById); -router.route("/:vehicleId").put(editVehicle); // add permission -router.route("/:vehicleId").delete(removeVehicle); // add permission +router + .route("/:vehicleId") + .put(authorizer(PERMISSIONS.EDIT_VEHICLE), editVehicle); // add permission +router + .route("/:vehicleId") + .delete(authorizer(PERMISSIONS.DELETE_VEHICLE), removeVehicle); // add permission export default router; From 8a12f2db01880704dd134c52f92c46184a8a1a73 Mon Sep 17 00:00:00 2001 From: shawon-majid Date: Sun, 31 Mar 2024 05:13:07 +0600 Subject: [PATCH 5/5] current total waste of landfill and sts updated on runtime --- server/src/controllers/trip.ts | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/server/src/controllers/trip.ts b/server/src/controllers/trip.ts index 6093a4d..056066c 100644 --- a/server/src/controllers/trip.ts +++ b/server/src/controllers/trip.ts @@ -37,6 +37,15 @@ const createTrip = errorWrapper(async (req: Request, res: Response) => { const vehicle = stsVehicleInfo.vehicle; const sts = stsVehicleInfo.sts; + await prisma.sTS.update({ + where: { + id: sts.id, + }, + data: { + currentTotalWaste: Number(sts.currentTotalWaste) - weightOfWaste, + }, + }); + const unloadedFuelCostPerKm = Number(vehicle.unloadedFuelCostPerKm); const loadedFuelCostPerKm = Number(vehicle.loadedFuelCostPerKm); const capacity = Number(vehicle.capacity); @@ -61,12 +70,10 @@ const createTrip = errorWrapper(async (req: Request, res: Response) => { }); const getListOfTrips = errorWrapper(async (req: Request, res: Response) => { - const { tripStatus, landfillId } = req.query; let where: Prisma.TripWhereInput | undefined = undefined; - if (tripStatus || landfillId) { where = {}; if (tripStatus) { @@ -98,9 +105,10 @@ const completeTrip = errorWrapper(async (req: Request, res: Response) => { } const landfillId = trip.landfillId; + const vehicleId = trip.vehicleId; - prisma.landfillVehicleEntry.create({ + await prisma.landfillVehicleEntry.create({ data: { landfillId, vehicleId, @@ -109,6 +117,21 @@ const completeTrip = errorWrapper(async (req: Request, res: Response) => { }, }); + const landfill = await prisma.landfill.findUnique({ + where: { + id: landfillId, + }, + }); + + await prisma.landfill.update({ + where: { + id: landfillId, + }, + data: { + currentTotalWaste: landfill?.currentTotalWaste + weightOfWaste, + }, + }); + const shortage = Number(trip.weightOfWaste) - weightOfWaste; const tripStartTime = new Date(trip.tripStartTime as Date);