Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | import { Controller, Post, Get, Delete, Body, Param, Req, UseGuards, Res, UseInterceptors, UploadedFile, } from '@nestjs/common'; import { FileInterceptor } from '@nestjs/platform-express'; import type { Response } from 'express'; import { StorageHubService } from '../../../platform/storage/storage-hub.service'; import { JwtAuthGuard } from '../../../platform/auth/jwt-auth.guard'; import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger'; @Controller('api/v1/storage') @ApiTags('Storage') export class StorageController { constructor(private readonly storageService: StorageHubService) {} @Post('upload') @UseGuards(JwtAuthGuard) @UseInterceptors(FileInterceptor('file')) @ApiOperation({ summary: 'Upload file operation' }) @ApiResponse({ status: 201, description: 'Operation successful' }) async uploadFile( @UploadedFile() file: any, @Body('key') key: string, @Req() req: any, ) { return this.storageService.uploadFile(req.user.tenantId, { key, filename: file.originalname, mimeType: file.mimetype, buffer: file.buffer, }); } @Post('share') @UseGuards(JwtAuthGuard) @ApiOperation({ summary: 'Share file operation' }) @ApiResponse({ status: 201, description: 'Operation successful' }) async shareFile( @Body('key') key: string, @Body('expiresInSeconds') expiresInSeconds: number, @Req() req: any, ) { const url = await this.storageService.generateTokenUrl( req.user.tenantId, key, expiresInSeconds, ); return { downloadUrl: url }; } // Token download (public route) @Get('download/:token') @ApiOperation({ summary: 'Download file operation' }) @ApiResponse({ status: 200, description: 'Operation successful' }) async downloadFile(@Param('token') token: string, @Res() res: Response) { const file = await this.storageService.getFileByToken(token); res.setHeader('Content-Type', file.mimeType); res.setHeader( 'Content-Disposition', `attachment; filename="${file.filename}"`, ); res.send(file.buffer); } @Delete(':key') @UseGuards(JwtAuthGuard) @ApiOperation({ summary: 'Delete file operation' }) @ApiResponse({ status: 200, description: 'Operation successful' }) async deleteFile(@Param('key') key: string, @Req() req: any) { const success = await this.storageService.deleteFile( req.user.tenantId, key, ); return { success }; } } |