import { Body,Controller,Get,Param,Post,Req,UseGuards } from '@nestjs/common';
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 { EquipmentService } from '../application/equipment.service';
import { ZodValidationPipe } from '../../../common/validation/zod-validation.pipe';
import { equipmentCreateSchema,equipmentMaintenanceSchema } from '../../../common/validation/critical-write.schemas';
import { EquipmentReadModelService } from '../read-models/equipment-read-model.service';
import type { z } from 'zod';
type EquipmentCreateBody = z.infer<typeof equipmentCreateSchema>;
type EquipmentMaintenanceBody = z.infer<typeof equipmentMaintenanceSchema>;
@Controller('/equipment')
@UseGuards(AuthGuard,OrganizationContextGuard,LocationContextGuard,PermissionGuard)
export class EquipmentController {
constructor(private readonly equipment:EquipmentService,private readonly readModel:EquipmentReadModelService) {}
@Post()
@RequirePermissions('equipment.manage')
create(@Req() req:LocationScopedRequest,@Body(new ZodValidationPipe(equipmentCreateSchema)) body:EquipmentCreateBody) {
return this.equipment.create({
organizationId:req.organizationId!,
locationId:req.locationId!,
...body,
});
}
@Post('/:id/out-of-service')
@RequirePermissions('equipment.manage')
out(@Req() req:LocationScopedRequest,@Param('id') id:string) {
return this.equipment.setStatus({
organizationId:req.organizationId!,
locationId:req.locationId!,
equipmentId:id,
status:'out_of_service',
});
}
@Post('/:id/restore')
@RequirePermissions('equipment.manage')
restore(@Req() req:LocationScopedRequest,@Param('id') id:string) {
return this.equipment.setStatus({
organizationId:req.organizationId!,
locationId:req.locationId!,
equipmentId:id,
status:'active',
});
}
@Get()
@RequirePermissions('equipment.read')
list(@Req() req:LocationScopedRequest) {
return this.readModel.list({
organizationId:req.organizationId!,
locationId:req.locationId!,
});
}
@Post('/:id/maintenance')
@RequirePermissions('equipment.manage')
maintenance(@Req() req:LocationScopedRequest,@Param('id') id:string,@Body(new ZodValidationPipe(equipmentMaintenanceSchema)) body:EquipmentMaintenanceBody) {
return this.equipment.addMaintenance({
organizationId:req.organizationId!,locationId:req.locationId!,
equipmentId:id,
...body,
});
}
}
