From aa16a317dc0ad87ef01600def4330804021fae26 Mon Sep 17 00:00:00 2001 From: Mehedi Hasan <{ID}+{username}@users.noreply.github.com> Date: Thu, 10 Oct 2024 09:35:18 +0600 Subject: [PATCH] refactor few things --- dist/app/modules/Auth/auth.services.js | 3 +++ dist/app/modules/booking/booking.model.js | 27 ++++++++++++++++++++++- dist/app/modules/car/car.controller.js | 11 +++++++++ dist/app/modules/car/car.model.js | 5 +++++ dist/app/modules/car/car.route.js | 3 ++- dist/app/modules/car/car.service.js | 13 ++++++++--- dist/app/modules/car/car.validation.js | 1 + src/app/modules/Auth/auth.services.ts | 7 +++++- src/app/modules/booking/booking.model.ts | 17 +++++++++++++- src/app/modules/car/car.controller.ts | 13 ++++++++++- src/app/modules/car/car.interface.ts | 1 + src/app/modules/car/car.model.ts | 7 +++++- src/app/modules/car/car.route.ts | 3 ++- src/app/modules/car/car.service.ts | 16 +++++++++++--- src/app/modules/car/car.validation.ts | 2 ++ 15 files changed, 116 insertions(+), 13 deletions(-) diff --git a/dist/app/modules/Auth/auth.services.js b/dist/app/modules/Auth/auth.services.js index fb7ab79..e03f448 100644 --- a/dist/app/modules/Auth/auth.services.js +++ b/dist/app/modules/Auth/auth.services.js @@ -32,6 +32,9 @@ const signin = (payload) => __awaiter(void 0, void 0, void 0, function* () { if (!user) { throw new Error("User not found"); } + if ((user === null || user === void 0 ? void 0 : user.status) === "blocked") { + throw new Error("Your account has been blocked. Please contact support for assistance."); + } const passwordMatch = yield (0, auth_util_1.isPasswordMatched)(payload.password, user.password); if (!passwordMatch) { throw new Error("Password not matched"); diff --git a/dist/app/modules/booking/booking.model.js b/dist/app/modules/booking/booking.model.js index 62d4d5b..7622d9f 100644 --- a/dist/app/modules/booking/booking.model.js +++ b/dist/app/modules/booking/booking.model.js @@ -1,4 +1,13 @@ "use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; Object.defineProperty(exports, "__esModule", { value: true }); exports.Booking = void 0; const mongoose_1 = require("mongoose"); @@ -74,7 +83,7 @@ const bookingSchema = new mongoose_1.Schema({ }, drivingLicense: { type: String, - required: [true, "Driving license is required"], + // required: [true, "Driving license is required"], } }, additionalFeatures: { @@ -94,4 +103,20 @@ const bookingSchema = new mongoose_1.Schema({ }, { timestamps: true, }); +// Pre-hook to prevent overlapping bookings +bookingSchema.pre("save", function (next) { + return __awaiter(this, void 0, void 0, function* () { + const conflictingBooking = yield exports.Booking.findOne({ + car: this.car, + $or: [ + { date: { $lt: this.returnDate, $gt: this.date } }, + { returnDate: { $gt: this.date, $lt: this.returnDate } }, + ], + }); + if (conflictingBooking) { + throw new Error("The car is already booked during this time."); + } + next(); + }); +}); exports.Booking = (0, mongoose_1.model)("Booking", bookingSchema); diff --git a/dist/app/modules/car/car.controller.js b/dist/app/modules/car/car.controller.js index 05b8b5e..3e08ea8 100644 --- a/dist/app/modules/car/car.controller.js +++ b/dist/app/modules/car/car.controller.js @@ -72,6 +72,16 @@ const deleteACar = (0, catchAsync_1.default)((req, res) => __awaiter(void 0, voi data: result, }); })); +const checkCarAvailability = (0, catchAsync_1.default)((req, res) => __awaiter(void 0, void 0, void 0, function* () { + const queries = req.query; + const result = yield car_service_1.CarServices.checkCarAvailability(queries); + (0, sendResponse_1.default)(res, { + statusCode: http_status_1.default.OK, + success: true, + message: "Cars availability checked successfully", + data: result + }); +})); // ------------------------========================----------------------------- exports.CarControllers = { createCar, @@ -79,4 +89,5 @@ exports.CarControllers = { updateACar, deleteACar, getAllCars, + checkCarAvailability }; diff --git a/dist/app/modules/car/car.model.js b/dist/app/modules/car/car.model.js index 1dfafce..6093c95 100644 --- a/dist/app/modules/car/car.model.js +++ b/dist/app/modules/car/car.model.js @@ -83,6 +83,11 @@ const carSchema = new mongoose_1.Schema({ type: Number, required: true, }, + currentLocation: { + type: String, + required: true, + default: "Chapainawabganj", + }, }, { timestamps: true, }); diff --git a/dist/app/modules/car/car.route.js b/dist/app/modules/car/car.route.js index cbceea0..39e649e 100644 --- a/dist/app/modules/car/car.route.js +++ b/dist/app/modules/car/car.route.js @@ -15,8 +15,9 @@ const booking_controller_1 = require("../booking/booking.controller"); const router = express_1.default.Router(); router.post("/", (0, auth_1.default)(user_constant_1.USER_ROLE.admin), (0, validateRequest_1.default)(car_validation_1.CarValidation.carValidationSchema), car_controller_1.CarControllers.createCar); router.get("/", car_controller_1.CarControllers.getAllCars); -router.get("/:id", car_controller_1.CarControllers.getACar); +router.get("/check-availability", car_controller_1.CarControllers.checkCarAvailability); router.put("/return", (0, validateRequest_1.default)(booking_validation_1.bookingValidations.carReturnValidationSchema), (0, auth_1.default)(user_constant_1.USER_ROLE.admin), booking_controller_1.BookingControllers.returnTheCar); +router.get("/:id", car_controller_1.CarControllers.getACar); router.put("/:id", (0, validateRequest_1.default)(car_validation_1.CarValidation.updateCarValidationSchema), (0, auth_1.default)(user_constant_1.USER_ROLE.admin), car_controller_1.CarControllers.updateACar); router.delete("/:id", (0, auth_1.default)(user_constant_1.USER_ROLE.admin), car_controller_1.CarControllers.deleteACar); exports.CarRoutes = router; diff --git a/dist/app/modules/car/car.service.js b/dist/app/modules/car/car.service.js index adfbd2e..2f49db5 100644 --- a/dist/app/modules/car/car.service.js +++ b/dist/app/modules/car/car.service.js @@ -37,11 +37,9 @@ const deleteACar = (id) => __awaiter(void 0, void 0, void 0, function* () { }); // get all car from the database const getAllCars = (payload) => __awaiter(void 0, void 0, void 0, function* () { - // const result = await Car.find(); - // return result; // Create a new QueryBuilder instance for the car query const carQuery = new QueryBuilder_1.default(car_model_1.Car.find({}), payload) - .search(["features",]) + .search(["features"]) .filter() .sort() .paginate(); @@ -59,10 +57,19 @@ const getAllCars = (payload) => __awaiter(void 0, void 0, void 0, function* () { cars: result, }; }); +// search available cars a car with a new value +const checkCarAvailability = (payload) => __awaiter(void 0, void 0, void 0, function* () { + const result = yield car_model_1.Car.find({ + status: "available", + currentLocation: { $regex: payload.searchTerm, $options: "i" }, + }); + return result; +}); exports.CarServices = { createCar, getACar, updateACar, deleteACar, getAllCars, + checkCarAvailability, }; diff --git a/dist/app/modules/car/car.validation.js b/dist/app/modules/car/car.validation.js index 1d4bd9e..d62c4b9 100644 --- a/dist/app/modules/car/car.validation.js +++ b/dist/app/modules/car/car.validation.js @@ -79,6 +79,7 @@ const updateCarValidationSchema = zod_1.z.object({ message: "Number of doors must be a positive number", }) .optional(), + currentLocation: zod_1.z.string().optional(), }), }); exports.CarValidation = { diff --git a/src/app/modules/Auth/auth.services.ts b/src/app/modules/Auth/auth.services.ts index 078c076..3285ce5 100644 --- a/src/app/modules/Auth/auth.services.ts +++ b/src/app/modules/Auth/auth.services.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import { TUser } from "../user/user.interface"; import { User } from "../user/user.model"; import { TsigninUser } from "./auth.interface"; @@ -24,7 +25,11 @@ const signin = async (payload: TsigninUser) => { if (!user) { throw new Error("User not found"); } - + if (user?.status === "blocked") { + throw new Error("Your account has been blocked. Please contact support for assistance."); + } + + const passwordMatch = await isPasswordMatched( payload.password, user.password diff --git a/src/app/modules/booking/booking.model.ts b/src/app/modules/booking/booking.model.ts index 8319851..d4f7ba5 100644 --- a/src/app/modules/booking/booking.model.ts +++ b/src/app/modules/booking/booking.model.ts @@ -75,7 +75,7 @@ const bookingSchema = new Schema({ }, drivingLicense:{ type: String, - required: [true, "Driving license is required"], + // required: [true, "Driving license is required"], } }, additionalFeatures:{ @@ -96,4 +96,19 @@ const bookingSchema = new Schema({ timestamps: true, }); +// Pre-hook to prevent overlapping bookings +bookingSchema.pre("save", async function (next) { + const conflictingBooking = await Booking.findOne({ + car: this.car, + $or: [ + { date: { $lt: this.returnDate, $gt: this.date } }, + { returnDate: { $gt: this.date, $lt: this.returnDate } }, + ], + }); + + if (conflictingBooking) { + throw new Error("The car is already booked during this time."); + } + next(); +}); export const Booking = model("Booking",bookingSchema) diff --git a/src/app/modules/car/car.controller.ts b/src/app/modules/car/car.controller.ts index e00888c..4ce6d5e 100644 --- a/src/app/modules/car/car.controller.ts +++ b/src/app/modules/car/car.controller.ts @@ -68,7 +68,18 @@ const deleteACar: RequestHandler =catchAsync(async (req, res) => { }) ; +const checkCarAvailability=catchAsync(async (req,res) => { + const queries = req.query + const result = await CarServices.checkCarAvailability(queries); + + sendResponse(res, { + statusCode: httpStatus.OK, + success: true, + message: "Cars availability checked successfully", + data: result + }); +}) // ------------------------========================----------------------------- @@ -78,5 +89,5 @@ export const CarControllers = { updateACar, deleteACar, getAllCars, - + checkCarAvailability }; diff --git a/src/app/modules/car/car.interface.ts b/src/app/modules/car/car.interface.ts index b328d74..e1d4165 100644 --- a/src/app/modules/car/car.interface.ts +++ b/src/app/modules/car/car.interface.ts @@ -18,5 +18,6 @@ export interface TCar { images: string[]; year: number; noOfDoors: number; + currentLocation?: string; } export interface CarModel extends Model {} diff --git a/src/app/modules/car/car.model.ts b/src/app/modules/car/car.model.ts index badfafd..f8f57d2 100644 --- a/src/app/modules/car/car.model.ts +++ b/src/app/modules/car/car.model.ts @@ -22,7 +22,7 @@ const carSchema = new Schema( }, status: { type: String, - enum: ["available","booked","maintenance"], + enum: ["available", "booked", "maintenance"], default: "available", }, features: { @@ -74,6 +74,11 @@ const carSchema = new Schema( type: Number, required: true, }, + currentLocation: { + type: String, + required: true, + default: "Chapainawabganj", + }, }, { timestamps: true, diff --git a/src/app/modules/car/car.route.ts b/src/app/modules/car/car.route.ts index 755884f..0b53ddd 100644 --- a/src/app/modules/car/car.route.ts +++ b/src/app/modules/car/car.route.ts @@ -16,13 +16,14 @@ router.post( CarControllers.createCar ); router.get("/", CarControllers.getAllCars); -router.get("/:id", CarControllers.getACar); +router.get("/check-availability",CarControllers.checkCarAvailability) router.put( "/return", validateRequest(bookingValidations.carReturnValidationSchema), auth(USER_ROLE.admin), BookingControllers.returnTheCar ); +router.get("/:id", CarControllers.getACar); router.put( "/:id", validateRequest(CarValidation.updateCarValidationSchema), diff --git a/src/app/modules/car/car.service.ts b/src/app/modules/car/car.service.ts index b1d308d..98ab8cc 100644 --- a/src/app/modules/car/car.service.ts +++ b/src/app/modules/car/car.service.ts @@ -29,11 +29,10 @@ const deleteACar = async (id: string) => { }; // get all car from the database const getAllCars = async (payload: Record) => { - // const result = await Car.find(); - // return result; + // Create a new QueryBuilder instance for the car query const carQuery = new QueryBuilder(Car.find({}), payload) - .search(["features",]) + .search(["features"]) .filter() .sort() .paginate(); @@ -56,10 +55,21 @@ const getAllCars = async (payload: Record) => { }; }; +// search available cars a car with a new value +const checkCarAvailability = async (payload: Record) => { + const result = await Car.find({ + status: "available", + currentLocation: { $regex: payload.searchTerm, $options: "i" }, + }); + + return result; +}; + export const CarServices = { createCar, getACar, updateACar, deleteACar, getAllCars, + checkCarAvailability, }; diff --git a/src/app/modules/car/car.validation.ts b/src/app/modules/car/car.validation.ts index dc7324d..a658f05 100644 --- a/src/app/modules/car/car.validation.ts +++ b/src/app/modules/car/car.validation.ts @@ -85,6 +85,8 @@ const updateCarValidationSchema = z.object({ message: "Number of doors must be a positive number", }) .optional(), + currentLocation: z.string().optional(), + }), });