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 { ExportService } from '../application/export.service';
import { ZodValidationPipe } from '../../../common/validation/zod-validation.pipe';
import { exportCreateSchema } from '../../../common/validation/critical-write.schemas';
import { ExportWorker } from '../workers/export.worker';
import type { z } from 'zod';
type ExportCreateBody = z.infer<typeof exportCreateSchema>;
@Controller('/exports')
@UseGuards(AuthGuard,OrganizationContextGuard,LocationContextGuard,PermissionGuard)
export class ExportsController {
constructor(private readonly exportsService:ExportService,private readonly worker:ExportWorker) {}
@Post()
@RequirePermissions('exports.create')
create(@Req() req:LocationScopedRequest,@Body(new ZodValidationPipe(exportCreateSchema)) body:ExportCreateBody) {
return this.exportsService.create({
organizationId:req.organizationId!,locationId:req.locationId!,userId:req.auth!.userId,...body,
});
}
@Get('/:id')
@RequirePermissions('exports.read')
get(@Req() req:LocationScopedRequest,@Param('id') id:string) {
return this.exportsService.get({organizationId:req.organizationId!,locationId:req.locationId!,id});
}
@Post('/:id/cancel')
@RequirePermissions('exports.create')
cancel(@Req() req:LocationScopedRequest,@Param('id') id:string) {
return this.exportsService.cancel({organizationId:req.organizationId!,locationId:req.locationId!,id});
}
@Post('/:id/run')
@RequirePermissions('exports.create')
async run(@Req() req:LocationScopedRequest,@Param('id') id:string) {
await this.exportsService.get({organizationId:req.organizationId!,locationId:req.locationId!,id});
return this.worker.runOne(id);
}
@Post('/:id/download-link')
@RequirePermissions('exports.read')
link(@Req() req:LocationScopedRequest,@Param('id') id:string) {
return this.exportsService.downloadLink({
organizationId:req.organizationId!,locationId:req.locationId!,id,userId:req.auth!.userId,
});
}
}
