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 { ImportService } from '../application/import.service';
import { ImportPreviewWorker } from '../workers/import-preview.worker';
import { ImportExecutionService } from '../application/import-execution.service';
import { ZodValidationPipe } from '../../../common/validation/zod-validation.pipe';
import { importCreateSchema } from '../../../common/validation/critical-write.schemas';
import type { z } from 'zod';
type ImportCreateBody = z.infer<typeof importCreateSchema>;
@Controller('/imports')
@UseGuards(AuthGuard,OrganizationContextGuard,LocationContextGuard,PermissionGuard)
export class ImportsController {
constructor(
private readonly imports:ImportService,
private readonly previewWorker:ImportPreviewWorker,
private readonly executor:ImportExecutionService,
) {}
@Post()
@RequirePermissions('imports.create')
create(@Req() req:LocationScopedRequest,@Body(new ZodValidationPipe(importCreateSchema)) body:ImportCreateBody) {
return this.imports.create({
organizationId:req.organizationId!,locationId:req.locationId!,
userId:req.auth?.userId,...body,
});
}
@Get('/:id')
@RequirePermissions('imports.read')
get(@Req() req:LocationScopedRequest,@Param('id') id:string) {
return this.imports.get({
organizationId:req.organizationId!,locationId:req.locationId!,id,
});
}
@Get('/:id/preview')
@RequirePermissions('imports.read')
preview(@Req() req:LocationScopedRequest,@Param('id') id:string) {
return this.imports.preview({
organizationId:req.organizationId!,locationId:req.locationId!,id,
});
}
@Post('/:id/validate')
@RequirePermissions('imports.create')
validate(@Req() req:LocationScopedRequest,@Param('id') id:string) {
return this.previewWorker.validate({
organizationId:req.organizationId!,locationId:req.locationId!,importJobId:id,
});
}
@Post('/:id/confirm')
@RequirePermissions('imports.execute')
confirm(@Req() req:LocationScopedRequest,@Param('id') id:string) {
return this.imports.markConfirmed({
organizationId:req.organizationId!,locationId:req.locationId!,
id,userId:req.auth?.userId,
});
}
@Post('/:id/cancel')
@RequirePermissions('imports.create')
cancel(@Req() req:LocationScopedRequest,@Param('id') id:string) {
return this.imports.cancel({
organizationId:req.organizationId!,locationId:req.locationId!,id,
});
}
@Post('/:id/execute')
@RequirePermissions('imports.execute')
execute(@Req() req:LocationScopedRequest,@Param('id') id:string) {
return this.executor.execute({
organizationId:req.organizationId!,locationId:req.locationId!,importJobId:id,
});
}
}
