import { Body,Controller,Get,Param,Post,Req,UseGuards } from '@nestjs/common';
import type { z } from 'zod';
import { AuthGuard } from '../../../common/auth/auth.guard';
import { OrganizationContextGuard } from '../../../common/auth/organization-context.guard';
import { LocationContextGuard,type LocationScopedRequest } from '../../../common/auth/location-context.guard';
import { PermissionGuard } from '../../../common/auth/permission.guard';
import { RequirePermissions } from '../../../common/auth/permissions.decorator';
import { IncidentService } from '../application/incident.service';
import { IncidentReadModelService } from '../read-models/incident-read-model.service';
import { ZodValidationPipe } from '../../../common/validation/zod-validation.pipe';
import { incidentAssignSchema,incidentCreateSchema,incidentResolveSchema } from '../../../common/validation/critical-write.schemas';
type IncidentCreateBody = z.infer<typeof incidentCreateSchema>;
type IncidentAssignBody = z.infer<typeof incidentAssignSchema>;
type IncidentResolveBody = z.infer<typeof incidentResolveSchema>;
@Controller('/incidents')
@UseGuards(AuthGuard,OrganizationContextGuard,LocationContextGuard,PermissionGuard)
export class IncidentsController {
constructor(private readonly incidents:IncidentService,private readonly readModel:IncidentReadModelService) {}
@Post()
@RequirePermissions('incidents.manage')
create(@Req() req:LocationScopedRequest,@Body(new ZodValidationPipe(incidentCreateSchema)) body:IncidentCreateBody) {
return this.incidents.create({
organizationId:req.organizationId!,
locationId:req.locationId!,
...body,
});
}
@Get()
@RequirePermissions('incidents.read')
list(@Req() req:LocationScopedRequest) {
return this.readModel.list({
organizationId:req.organizationId!,
locationId:req.locationId!,
});
}
@Post('/:id/assign')
@RequirePermissions('incidents.manage')
assign(@Req() req:LocationScopedRequest,@Param('id') id:string,@Body(new ZodValidationPipe(incidentAssignSchema)) body:IncidentAssignBody) {
return this.incidents.assign({
organizationId:req.organizationId!,
locationId:req.locationId!,
incidentId:id,
employeeId:body.employeeId,
});
}
@Post('/:id/resolve')
@RequirePermissions('incidents.manage')
resolve(@Req() req:LocationScopedRequest,@Param('id') id:string,@Body(new ZodValidationPipe(incidentResolveSchema)) body:IncidentResolveBody) {
return this.incidents.resolve({
organizationId:req.organizationId!,
locationId:req.locationId!,
incidentId:id,
resolution:body.resolution,
});
}
}
