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 { ZodValidationPipe } from '../../../common/validation/zod-validation.pipe';
import { operationalCaseCreateSchema,operationalCaseEvidenceSchema,operationalCaseResolveSchema } from '../../../common/validation/critical-write.schemas';
import { OperationalCaseService } from '../application/operational-case.service';
type CreateBody=z.infer<typeof operationalCaseCreateSchema>;
type EvidenceBody=z.infer<typeof operationalCaseEvidenceSchema>;
type ResolveBody=z.infer<typeof operationalCaseResolveSchema>;
@Controller('/operations/cases')
@UseGuards(AuthGuard,OrganizationContextGuard,LocationContextGuard,PermissionGuard)
export class OperationalCasesController {
constructor(private readonly cases:OperationalCaseService) {}
@Get()
@RequirePermissions('operations.cases.read')
list(@Req() req:LocationScopedRequest) {
return this.cases.list({organizationId:req.organizationId!,locationId:req.locationId!});
}
@Get('/:id')
@RequirePermissions('operations.cases.read')
get(@Req() req:LocationScopedRequest,@Param('id') id:string) {
return this.cases.get({organizationId:req.organizationId!,locationId:req.locationId!,caseId:id});
}
@Post()
@RequirePermissions('operations.cases.manage')
create(@Req() req:LocationScopedRequest,@Body(new ZodValidationPipe(operationalCaseCreateSchema)) body:CreateBody) {
return this.cases.create({organizationId:req.organizationId!,locationId:req.locationId!,openedByUserId:req.auth?.userId,...body});
}
@Post('/:id/evidence')
@RequirePermissions('operations.cases.manage')
addEvidence(@Req() req:LocationScopedRequest,@Param('id') id:string,@Body(new ZodValidationPipe(operationalCaseEvidenceSchema)) body:EvidenceBody) {
return this.cases.addEvidence({organizationId:req.organizationId!,locationId:req.locationId!,caseId:id,...body});
}
@Post('/:id/resolve')
@RequirePermissions('operations.cases.manage')
resolve(@Req() req:LocationScopedRequest,@Param('id') id:string,@Body(new ZodValidationPipe(operationalCaseResolveSchema)) body:ResolveBody) {
return this.cases.resolve({organizationId:req.organizationId!,locationId:req.locationId!,caseId:id,userId:req.auth?.userId,...body});
}
}
