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 { FileService } from '../application/file.service';
import { FileVerificationService } from '../application/file-verification.service';
import { ZodValidationPipe } from '../../../common/validation/zod-validation.pipe';
import { fileUploadSessionSchema } from '../../../common/validation/critical-write.schemas';
import type { z } from 'zod';
type FileUploadSessionBody = z.infer<typeof fileUploadSessionSchema>;
@Controller('/files')
@UseGuards(AuthGuard,OrganizationContextGuard,LocationContextGuard,PermissionGuard)
export class FilesController {
constructor(private readonly files:FileService,private readonly verification:FileVerificationService) {}
@Post('/upload-sessions')
@RequirePermissions('files.upload')
upload(@Req() req:LocationScopedRequest,@Body(new ZodValidationPipe(fileUploadSessionSchema)) body:FileUploadSessionBody) {
return this.files.createUploadSession({
organizationId:req.organizationId!,locationId:req.locationId!,userId:req.auth?.userId,...body,
});
}
@Post('/upload-sessions/:id/complete')
@RequirePermissions('files.upload')
complete(@Req() req:LocationScopedRequest,@Param('id') id:string) {
return this.files.complete({organizationId:req.organizationId!,locationId:req.locationId!,uploadSessionId:id});
}
@Get('/:id')
@RequirePermissions('files.read')
get(@Req() req:LocationScopedRequest,@Param('id') id:string) {
return this.files.get({organizationId:req.organizationId!,locationId:req.locationId!,fileAssetId:id,userId:req.auth!.userId});
}
@Post('/:id/download-link')
@RequirePermissions('files.read')
link(@Req() req:LocationScopedRequest,@Param('id') id:string) {
return this.files.downloadLink({
organizationId:req.organizationId!,locationId:req.locationId!,fileAssetId:id,userId:req.auth!.userId,
});
}
@Post('/:id/archive')
@RequirePermissions('files.manage')
archive(@Req() req:LocationScopedRequest,@Param('id') id:string) {
return this.files.archive({
organizationId:req.organizationId!,locationId:req.locationId!,fileAssetId:id,userId:req.auth!.userId,
});
}
@Post('/:id/verify')
@RequirePermissions('files.manage')
verify(@Req() req:LocationScopedRequest,@Param('id') id:string) {
return this.verification.verify({organizationId:req.organizationId!,locationId:req.locationId!,fileAssetId:id});
}
}
