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 <noreply@anthropic.com>
This commit is contained in:
2026-02-03 21:49:58 +01:00
parent 858793d698
commit 21fb193d01

View File

@@ -38,42 +38,65 @@ export class UsersService {
const { isAlsoDriver, ...prismaData } = updateUserDto; const { isAlsoDriver, ...prismaData } = updateUserDto;
const effectiveRole = updateUserDto.role || user.role; const effectiveRole = updateUserDto.role || user.role;
// Handle role change to DRIVER: auto-create driver record const hasActiveDriver = user.driver && !user.driver.deletedAt;
if (updateUserDto.role === Role.DRIVER && !user.driver) { const hasSoftDeletedDriver = user.driver && user.driver.deletedAt;
this.logger.log(
`Creating Driver record for user ${user.email} (role change to DRIVER)`, // Handle role change to DRIVER: auto-create or restore driver record
); if (updateUserDto.role === Role.DRIVER && !hasActiveDriver) {
await this.prisma.driver.create({ if (hasSoftDeletedDriver) {
data: { this.logger.log(
name: user.name || user.email, `Restoring soft-deleted Driver record for user ${user.email} (role change to DRIVER)`,
phone: user.email, );
userId: user.id, 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 // When promoting FROM DRIVER to Admin/Coordinator, keep the driver record
// (admin can explicitly uncheck the driver box later if they want) // (admin can explicitly uncheck the driver box later if they want)
// Handle "Also a Driver" toggle (independent of role) // Handle "Also a Driver" toggle (independent of role)
if (isAlsoDriver === true && !user.driver) { if (isAlsoDriver === true && !hasActiveDriver) {
this.logger.log( if (hasSoftDeletedDriver) {
`Creating Driver record for user ${user.email} (isAlsoDriver toggled on)`, this.logger.log(
); `Restoring soft-deleted Driver record for user ${user.email} (isAlsoDriver toggled on)`,
await this.prisma.driver.create({ );
data: { await this.prisma.driver.update({
name: user.name || user.email, where: { id: user.driver!.id },
phone: user.email, data: { deletedAt: null, name: user.name || user.email },
userId: user.id, });
}, } else {
}); this.logger.log(
} else if (isAlsoDriver === false && user.driver && effectiveRole !== Role.DRIVER) { `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 // Only allow removing driver record if user is NOT in the DRIVER role
this.logger.log( this.logger.log(
`Soft-deleting Driver record for user ${user.email} (isAlsoDriver toggled off)`, `Soft-deleting Driver record for user ${user.email} (isAlsoDriver toggled off)`,
); );
await this.prisma.driver.update({ await this.prisma.driver.update({
where: { id: user.driver.id }, where: { id: user.driver!.id },
data: { deletedAt: new Date() }, data: { deletedAt: new Date() },
}); });
} }