From 2efdbb6de82c6f72039089a217dfb670454c138c Mon Sep 17 00:00:00 2001 From: Mhd Zayd Skaff Date: Sun, 13 Jul 2025 14:05:29 +0300 Subject: [PATCH] add Find APIs for bookings --- package-lock.json | 34 ++++++++++------ package.json | 1 + src/booking/dtos/booking-response.dto.ts | 8 ++-- src/booking/services/booking.service.ts | 49 +++++++++++++++++------- 4 files changed, 62 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index 04c97a0..50725af 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,6 +32,7 @@ "class-validator": "^0.14.1", "crypto-js": "^4.2.0", "csv-parser": "^3.2.0", + "date-fns": "^4.1.0", "express-rate-limit": "^7.1.5", "firebase": "^10.12.5", "google-auth-library": "^9.14.1", @@ -5115,6 +5116,22 @@ "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" } }, + "node_modules/concurrently/node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, "node_modules/concurrently/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -5360,19 +5377,12 @@ } }, "node_modules/date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" - }, + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" } }, "node_modules/dayjs": { diff --git a/package.json b/package.json index b496f90..38fe053 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "class-validator": "^0.14.1", "crypto-js": "^4.2.0", "csv-parser": "^3.2.0", + "date-fns": "^4.1.0", "express-rate-limit": "^7.1.5", "firebase": "^10.12.5", "google-auth-library": "^9.14.1", diff --git a/src/booking/dtos/booking-response.dto.ts b/src/booking/dtos/booking-response.dto.ts index 62c37f9..a8a0bc7 100644 --- a/src/booking/dtos/booking-response.dto.ts +++ b/src/booking/dtos/booking-response.dto.ts @@ -26,11 +26,9 @@ export class BookingUserResponseDto { nullable: true, }) @Expose() - @Transform(({ obj }) => { - return { - companyName: obj.inviteUser?.companyName || null, - }; - }) + @Transform(({ obj }) => obj.inviteUser?.companyName || null) + companyName: string; + @ApiProperty({ type: String, nullable: true, diff --git a/src/booking/services/booking.service.ts b/src/booking/services/booking.service.ts index acdcdb5..d11b25a 100644 --- a/src/booking/services/booking.service.ts +++ b/src/booking/services/booking.service.ts @@ -11,6 +11,7 @@ import { Injectable, NotFoundException, } from '@nestjs/common'; +import { format } from 'date-fns'; import { Between } from 'typeorm/find-options/operator/Between'; import { BookingRequestDto } from '../dtos/booking-request.dto'; import { CreateBookingDto } from '../dtos/create-booking.dto'; @@ -68,19 +69,39 @@ export class BookingService { userUuid: string, project: string, ) { - return this.bookingEntityRepository.find({ - where: { - user: { uuid: userUuid }, - space: { community: { project: { uuid: project } } }, - // date: when - // ? when === 'past' - // ? LessThanOrEqual(new Date()) - // : MoreThanOrEqual(new Date()) - // : undefined, - }, - relations: ['space', 'user'], - order: { date: 'DESC' }, + const now = new Date(); + const nowTime = format(now, 'HH:mm'); + + const query = this.bookingEntityRepository + .createQueryBuilder('booking') + .leftJoinAndSelect('booking.space', 'space') + .innerJoin( + 'space.community', + 'community', + 'community.project = :project', + { project }, + ) + .leftJoinAndSelect('booking.user', 'user') + .where('user.uuid = :userUuid', { userUuid }); + + if (when === 'past') { + query.andWhere( + `(DATE(booking.date) < :today OR (DATE(booking.date) = :today AND booking.startTime < :nowTime))`, + { today: now, nowTime }, + ); + } else if (when === 'future') { + query.andWhere( + `(DATE(booking.date) > :today OR (DATE(booking.date) = :today AND booking.startTime >= :nowTime))`, + { today: now, nowTime }, + ); + } + + query.orderBy({ + 'DATE(booking.date)': 'DESC', + 'booking.startTime': 'DESC', }); + + return query.getMany(); } /** @@ -158,7 +179,9 @@ export class BookingService { const previousBookings = space.bookings.filter( (booking) => timeToMinutes(booking.startTime) < dtoEndTimeInMinutes && - timeToMinutes(booking.endTime) > dtoStartTimeInMinutes, + timeToMinutes(booking.endTime) > dtoStartTimeInMinutes && + format(new Date(booking.date), 'yyyy-MM-dd') === + format(new Date(dto.date), 'yyyy-MM-dd'), ); if (previousBookings.length > 0) {