From f1b99897308dc4902d2ffa657dab070acf7d1f1e Mon Sep 17 00:00:00 2001 From: natib21 Date: Wed, 24 Jun 2026 11:47:02 +0000 Subject: [PATCH] fix --- .../modules/first-mile/first-mile.service.ts | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/apps/edr-freight-api/src/modules/first-mile/first-mile.service.ts b/apps/edr-freight-api/src/modules/first-mile/first-mile.service.ts index 88edcc752..2d4079a8b 100644 --- a/apps/edr-freight-api/src/modules/first-mile/first-mile.service.ts +++ b/apps/edr-freight-api/src/modules/first-mile/first-mile.service.ts @@ -1,4 +1,4 @@ -import { Injectable, NotFoundException } from '@nestjs/common'; +import { Injectable, Logger, NotFoundException } from '@nestjs/common'; import { FindOptionsWhere } from 'typeorm'; import { BookingsRepository } from '../bookings/bookings.repository'; @@ -29,6 +29,8 @@ const SORTABLE_FIELDS: (keyof FirstMile)[] = [ @Injectable() export class FirstMileService { + private readonly logger = new Logger(FirstMileService.name); + constructor( private readonly firstMileRepository: FirstMileRepository, private readonly bookingsRepository: BookingsRepository, @@ -141,8 +143,8 @@ export class FirstMileService { throw new NotFoundException(`First-mile record ${id} not found`); } - // Notify assigned driver when a vehicle is newly assigned - if (dto.vehicleId && dto.vehicleId !== existing.vehicleId) { + // Notify assigned driver on every explicit vehicle assignment or reassignment + if (dto.vehicleId) { void this.notifyDriverAssignment(dto.vehicleId, existing); } @@ -152,23 +154,31 @@ export class FirstMileService { private async notifyDriverAssignment(vehicleId: string, record: FirstMile): Promise { try { const vehicle = await this.vehiclesService.findById(vehicleId); - if (!vehicle.assignedDriverId) return; + if (!vehicle.assignedDriverId) { + this.logger.warn(`Vehicle ${vehicleId} has no assigned driver — skipping SMS`); + return; + } const driver = await this.driversService.findById(vehicle.assignedDriverId); - if (!driver.phoneNumber) return; + if (!driver.phoneNumber) { + this.logger.warn(`Driver ${vehicle.assignedDriverId} has no phone number — skipping SMS`); + return; + } const booking = (record as FirstMile & { booking?: { reference?: string; firstMilePickupAddress?: string | null; originYard?: { label?: string } | null } }).booking; await this.notificationsService.notifyDriverVehicleAssignment({ driverPhone: driver.phoneNumber, - driverName: `${driver.firstName} ${driver.lastName}`, + driverName: `${driver.firstName ?? ''} ${driver.lastName ?? ''}`.trim(), vehiclePlateNumber: vehicle.plateNumber ?? vehicleId, bookingReference: booking?.reference ?? record.bookingId, pickupAddress: booking?.firstMilePickupAddress, destinationYard: booking?.originYard?.label, }); + + this.logger.log(`SMS sent to driver ${driver.phoneNumber} for vehicle ${vehicleId} assignment`); } catch (err) { - // Notification failure must never break the assignment flow + this.logger.error(`Failed to notify driver for vehicle ${vehicleId}: ${String(err)}`); } }