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:
@@ -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() },
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user