import { Injectable, NotFoundException } from "@nestjs/common"; import { BookingsRepository } from "./bookings.repository"; import { CreateBookingDto } from "./dto/create-booking.dto"; import { FilterBookingDto } from "./dto/filter-booking.dto"; import { Booking } from "./entities/booking.entity"; @Injectable() export class BookingsService { constructor(private readonly bookingsRepository: BookingsRepository) {} /** Create a new freight booking. */ async create(dto: CreateBookingDto): Promise { return this.bookingsRepository.create({ ...dto, scheduledDate: new Date(dto.scheduledDate), }); } /** Return a paginated list of bookings matching the filter. */ async findAll( filter: FilterBookingDto, ): Promise<{ items: Booking[]; total: number }> { const page = filter.page ?? 1; const pageSize = filter.pageSize ?? 20; const [items, total] = await this.bookingsRepository.findAndCount({ where: { ...(filter.status ? { status: filter.status } : {}), ...(filter.customerId ? { customerId: filter.customerId } : {}), }, skip: (page - 1) * pageSize, take: pageSize, order: { createdAt: "DESC" }, }); return { items, total }; } /** Get a single booking by ID, throwing if not found. */ async findById(id: string): Promise { const booking = await this.bookingsRepository.findById(id); if (!booking) { throw new NotFoundException(`Booking ${id} not found`); } return booking; } /** Soft-delete a booking. */ async remove(id: string): Promise { await this.findById(id); await this.bookingsRepository.softDelete(id); } }