1- import { Body , Controller , Delete , Get , HttpStatus , Param , Patch , Post , Res } from '@nestjs/common'
1+ import {
2+ Body ,
3+ Controller ,
4+ Delete ,
5+ FileTypeValidator ,
6+ Get ,
7+ HttpStatus ,
8+ MaxFileSizeValidator ,
9+ Param ,
10+ ParseFilePipe ,
11+ Patch ,
12+ Post ,
13+ Res ,
14+ UploadedFile ,
15+ UseInterceptors ,
16+ } from '@nestjs/common'
217import { FilestorageCreateDto , FilestorageDto , FilestorageUpdateDto } from './_dto/filestorage.dto'
318import { FilestorageService } from './filestorage.service'
419import { AbstractController } from '~/_common/abstracts/abstract.controller'
@@ -19,7 +34,10 @@ import { PickProjectionHelper } from '~/_common/helpers/pick-projection.helper'
1934import { ApiReadResponseDecorator } from '~/_common/decorators/api-read-response.decorator'
2035import { ApiUpdateDecorator } from '~/_common/decorators/api-update.decorator'
2136import { ApiDeletedResponseDecorator } from '~/_common/decorators/api-deleted-response.decorator'
37+ import { Public } from '~/_common/decorators/public.decorator'
38+ import { FileInterceptor } from '@nestjs/platform-express'
2239
40+ @Public ( )
2341@ApiTags ( 'core' )
2442@Controller ( 'filestorage' )
2543export class FilestorageController extends AbstractController {
@@ -35,9 +53,16 @@ export class FilestorageController extends AbstractController {
3553 }
3654
3755 @Post ( )
56+ @UseInterceptors ( FileInterceptor ( 'file' ) )
3857 @ApiCreateDecorator ( FilestorageCreateDto , FilestorageDto )
39- public async create ( @Res ( ) res : Response , @Body ( ) body : FilestorageCreateDto ) : Promise < Response > {
40- const data = await this . _service . create ( body )
58+ public async create (
59+ @Res ( ) res : Response ,
60+ @Body ( ) body : FilestorageCreateDto ,
61+ @UploadedFile (
62+ new ParseFilePipe ( { fileIsRequired : false } ) ,
63+ ) file ?: Express . Multer . File ,
64+ ) : Promise < Response > {
65+ const data = await this . _service . create ( { ...body , file } )
4166 return res . status ( HttpStatus . CREATED ) . json ( {
4267 statusCode : HttpStatus . CREATED ,
4368 data,
@@ -66,6 +91,15 @@ export class FilestorageController extends AbstractController {
6691 } )
6792 }
6893
94+ @Get ( ':_id([0-9a-fA-F]{24})/raw' )
95+ @ApiParam ( { name : '_id' , type : String } )
96+ @ApiReadResponseDecorator ( FilestorageDto )
97+ public async readRawData ( @Param ( '_id' , ObjectIdValidationPipe ) _id : Types . ObjectId , @Res ( ) res : Response ) : Promise < void > {
98+ const [ data , stream ] = await this . _service . findByIdWithRawData ( _id )
99+ res . setHeader ( 'Content-Type' , data . mime || 'application/octet-stream' )
100+ stream . pipe ( res )
101+ }
102+
69103 @Patch ( ':_id([0-9a-fA-F]{24})' )
70104 @ApiParam ( { name : '_id' , type : String } )
71105 @ApiUpdateDecorator ( FilestorageUpdateDto , FilestorageDto )
0 commit comments