mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-27 10:52:53 +00:00
72 lines
2.0 KiB
TypeScript
72 lines
2.0 KiB
TypeScript
import {
|
|
Body,
|
|
Controller,
|
|
Get,
|
|
NotFoundException,
|
|
Param,
|
|
ParseUUIDPipe,
|
|
Post,
|
|
} from "@nestjs/common";
|
|
import { ApiBearerAuth, ApiOperation, ApiTags } from "@nestjs/swagger";
|
|
|
|
import { BookingStaff } from "../../common/booking-guards";
|
|
import { FREIGHT_PERMS } from "../../seed/freight-permissions.registry";
|
|
import { BackofficeResetPasswordDto } from "./dto/forgot-password.dto";
|
|
import {
|
|
CustomerResetService,
|
|
CustomerResetTarget,
|
|
} from "./customer-reset.service";
|
|
|
|
/**
|
|
* Staff-triggered password reset. The customer receives a single-use link and
|
|
* sets their own password — staff never see or handle a credential.
|
|
*/
|
|
@ApiTags("backoffice")
|
|
@Controller("backoffice/customers")
|
|
@ApiBearerAuth()
|
|
export class CustomerResetController {
|
|
constructor(private readonly customerResetService: CustomerResetService) {}
|
|
|
|
@Get(":companyId/reset-target")
|
|
@BookingStaff(FREIGHT_PERMS.customers.resetPassword)
|
|
@ApiOperation({
|
|
summary: "The primary contact's IAM account a reset link would be sent to",
|
|
})
|
|
async resetTarget(
|
|
@Param("companyId", ParseUUIDPipe) companyId: string,
|
|
): Promise<CustomerResetTarget> {
|
|
const target = await this.customerResetService.getResetTarget(companyId);
|
|
|
|
if (!target) {
|
|
throw new NotFoundException(
|
|
"This customer has no active primary-contact account to reset",
|
|
);
|
|
}
|
|
|
|
return target;
|
|
}
|
|
|
|
@Post(":companyId/reset-password")
|
|
@BookingStaff(FREIGHT_PERMS.customers.resetPassword)
|
|
@ApiOperation({
|
|
summary: "Send a password-reset link to a customer's primary contact",
|
|
})
|
|
async resetPassword(
|
|
@Param("companyId", ParseUUIDPipe) companyId: string,
|
|
@Body() dto: BackofficeResetPasswordDto,
|
|
) {
|
|
const sent = await this.customerResetService.sendResetLinkToCustomer(
|
|
companyId,
|
|
dto.channel,
|
|
);
|
|
|
|
if (!sent) {
|
|
throw new NotFoundException(
|
|
`No active primary contact with ${dto.channel === "email" ? "an email address" : "a phone number"} for this customer`,
|
|
);
|
|
}
|
|
|
|
return sent;
|
|
}
|
|
}
|