import { Body, Controller, Get, Param, ParseUUIDPipe, Patch, Post, Put, Query, Req, } from '@nestjs/common'; import { CurrentAuth } from '../auth/decorators/current-auth.decorator'; import { RequirePermissions } from '../authorization/decorators/require-permissions.decorator'; import type { AuthPrincipal, RequestWithContext } from '../common/http/request-context'; import { ChangeInspectionVisitStatusDto } from './dto/change-inspection-visit-status.dto'; import { CloseInspectionVisitDto } from './dto/close-inspection-visit.dto'; import { CreateInspectionVisitDto } from './dto/create-inspection-visit.dto'; import { ExcludeInspectionVisitAssetDto } from './dto/exclude-inspection-visit-asset.dto'; import { ListInspectionVisitsQueryDto } from './dto/list-inspection-visits-query.dto'; import { ReplaceInspectionVisitAssetsDto } from './dto/replace-inspection-visit-assets.dto'; import { ReplaceInspectionVisitTeamDto } from './dto/replace-inspection-visit-team.dto'; import { UpdateInspectionVisitDto } from './dto/update-inspection-visit.dto'; import { InspectionVisitsService } from './inspection-visits.service'; @Controller('inspection-visits') export class InspectionVisitsController { constructor(private readonly visits: InspectionVisitsService) {} @Get() @RequirePermissions('inspections.read') list(@Query() query: ListInspectionVisitsQueryDto) { return this.visits.list(query); } @Get('assignees') @RequirePermissions('inspections.assign') assignees() { return this.visits.listAssignees(); } @Get('planning-context/areas') @RequirePermissions('inspections.read') planningAreas() { return this.visits.listPlanningAreas(); } @Get('planning-context/areas/:areaId/operators') @RequirePermissions('inspections.read') planningOperators( @Param('areaId', new ParseUUIDPipe({ version: '4' })) areaId: string, ) { return this.visits.listPlanningOperators(areaId); } @Get(':id') @RequirePermissions('inspections.read') get(@Param('id', new ParseUUIDPipe({ version: '4' })) id: string) { return this.visits.getById(id); } @Post() @RequirePermissions('inspections.manage', 'inspections.assign') create( @Body() dto: CreateInspectionVisitDto, @CurrentAuth() principal: AuthPrincipal, @Req() request: RequestWithContext, ) { return this.visits.create(dto, principal, request); } @Patch(':id') @RequirePermissions('inspections.manage') update( @Param('id', new ParseUUIDPipe({ version: '4' })) id: string, @Body() dto: UpdateInspectionVisitDto, @CurrentAuth() principal: AuthPrincipal, @Req() request: RequestWithContext, ) { return this.visits.update(id, dto, principal, request); } @Put(':id/assets') @RequirePermissions('inspections.manage') replaceAssets( @Param('id', new ParseUUIDPipe({ version: '4' })) id: string, @Body() dto: ReplaceInspectionVisitAssetsDto, @CurrentAuth() principal: AuthPrincipal, @Req() request: RequestWithContext, ) { return this.visits.replaceAssets(id, dto, principal, request); } @Post(':id/checklist/generate') @RequirePermissions('inspections.manage') generateChecklist( @Param('id', new ParseUUIDPipe({ version: '4' })) id: string, @CurrentAuth() principal: AuthPrincipal, @Req() request: RequestWithContext, ) { return this.visits.generateChecklist(id, principal, request); } @Post(':id/assets/:assetId/exclude') @RequirePermissions('inspections.manage') excludeAsset( @Param('id', new ParseUUIDPipe({ version: '4' })) id: string, @Param('assetId', new ParseUUIDPipe({ version: '4' })) assetId: string, @Body() dto: ExcludeInspectionVisitAssetDto, @CurrentAuth() principal: AuthPrincipal, @Req() request: RequestWithContext, ) { return this.visits.excludeAsset(id, assetId, dto.reason, principal, request); } @Post(':id/assets/:assetId/include') @RequirePermissions('inspections.manage') includeAsset( @Param('id', new ParseUUIDPipe({ version: '4' })) id: string, @Param('assetId', new ParseUUIDPipe({ version: '4' })) assetId: string, @CurrentAuth() principal: AuthPrincipal, @Req() request: RequestWithContext, ) { return this.visits.includeAsset(id, assetId, principal, request); } @Put(':id/team') @RequirePermissions('inspections.assign') replaceTeam( @Param('id', new ParseUUIDPipe({ version: '4' })) id: string, @Body() dto: ReplaceInspectionVisitTeamDto, @CurrentAuth() principal: AuthPrincipal, @Req() request: RequestWithContext, ) { return this.visits.replaceTeam(id, dto, principal, request); } @Put(':id/status') @RequirePermissions('inspections.manage') changeStatus( @Param('id', new ParseUUIDPipe({ version: '4' })) id: string, @Body() dto: ChangeInspectionVisitStatusDto, @CurrentAuth() principal: AuthPrincipal, @Req() request: RequestWithContext, ) { return this.visits.changeStatus(id, dto, principal, request); } @Post(':id/start') @RequirePermissions('inspections.execute') start( @Param('id', new ParseUUIDPipe({ version: '4' })) id: string, @CurrentAuth() principal: AuthPrincipal, @Req() request: RequestWithContext, ) { return this.visits.start(id, principal, request); } @Post(':id/close') @RequirePermissions('inspections.execute') close( @Param('id', new ParseUUIDPipe({ version: '4' })) id: string, @Body() dto: CloseInspectionVisitDto, @CurrentAuth() principal: AuthPrincipal, @Req() request: RequestWithContext, ) { return this.visits.close(id, dto, principal, request); } }