From 21fb193d0130ea1ea2266d9511a2e0bc0e5b066b Mon Sep 17 00:00:00 2001 From: kyle Date: Tue, 3 Feb 2026 21:49:58 +0100 Subject: [PATCH] fix: restore soft-deleted driver record when re-enabling driver toggle When a coordinator's driver status was toggled off (soft-delete) and then back on, the create failed because the soft-deleted record still existed. Now checks for active vs soft-deleted driver records and restores the existing record instead of trying to create a duplicate. Co-Authored-By: Claude Opus 4.5 --- backend/src/users/users.service.ts | 73 ++++++++++++++++++++---------- 1 file changed, 48 insertions(+), 25 deletions(-) diff --git a/backend/src/users/users.service.ts b/backend/src/users/users.service.ts index b83beed..38c6417 100644 --- a/backend/src/users/users.service.ts +++ b/backend/src/users/users.service.ts @@ -38,42 +38,65 @@ export class UsersService { const { isAlsoDriver, ...prismaData } = updateUserDto; const effectiveRole = updateUserDto.role || user.role; - // Handle role change to DRIVER: auto-create driver record - if (updateUserDto.role === Role.DRIVER && !user.driver) { - this.logger.log( - `Creating Driver record for user ${user.email} (role change to DRIVER)`, - ); - await this.prisma.driver.create({ - data: { - name: user.name || user.email, - phone: user.email, - userId: user.id, - }, - }); + const hasActiveDriver = user.driver && !user.driver.deletedAt; + const hasSoftDeletedDriver = user.driver && user.driver.deletedAt; + + // Handle role change to DRIVER: auto-create or restore driver record + if (updateUserDto.role === Role.DRIVER && !hasActiveDriver) { + if (hasSoftDeletedDriver) { + this.logger.log( + `Restoring soft-deleted Driver record for user ${user.email} (role change to DRIVER)`, + ); + await this.prisma.driver.update({ + where: { id: user.driver!.id }, + data: { deletedAt: null, name: user.name || user.email }, + }); + } else { + this.logger.log( + `Creating Driver record for user ${user.email} (role change to DRIVER)`, + ); + await this.prisma.driver.create({ + data: { + name: user.name || user.email, + phone: user.email, + userId: user.id, + }, + }); + } } // When promoting FROM DRIVER to Admin/Coordinator, keep the driver record // (admin can explicitly uncheck the driver box later if they want) // Handle "Also a Driver" toggle (independent of role) - if (isAlsoDriver === true && !user.driver) { - this.logger.log( - `Creating Driver record for user ${user.email} (isAlsoDriver toggled on)`, - ); - await this.prisma.driver.create({ - data: { - name: user.name || user.email, - phone: user.email, - userId: user.id, - }, - }); - } else if (isAlsoDriver === false && user.driver && effectiveRole !== Role.DRIVER) { + if (isAlsoDriver === true && !hasActiveDriver) { + if (hasSoftDeletedDriver) { + this.logger.log( + `Restoring soft-deleted Driver record for user ${user.email} (isAlsoDriver toggled on)`, + ); + await this.prisma.driver.update({ + where: { id: user.driver!.id }, + data: { deletedAt: null, name: user.name || user.email }, + }); + } else { + this.logger.log( + `Creating Driver record for user ${user.email} (isAlsoDriver toggled on)`, + ); + await this.prisma.driver.create({ + data: { + name: user.name || user.email, + phone: user.email, + userId: user.id, + }, + }); + } + } else if (isAlsoDriver === false && hasActiveDriver && effectiveRole !== Role.DRIVER) { // Only allow removing driver record if user is NOT in the DRIVER role this.logger.log( `Soft-deleting Driver record for user ${user.email} (isAlsoDriver toggled off)`, ); await this.prisma.driver.update({ - where: { id: user.driver.id }, + where: { id: user.driver!.id }, data: { deletedAt: new Date() }, }); }