54 lines
1.5 KiB
TypeScript
54 lines
1.5 KiB
TypeScript
|
import { BadRequestException, Controller, Post, Req } from '@nestjs/common'
|
||
|
import { ApiBody, ApiConsumes, ApiOperation, ApiTags } from '@nestjs/swagger'
|
||
|
import { FastifyRequest } from 'fastify'
|
||
|
|
||
|
import { ApiSecurityAuth } from '~/common/decorators/swagger.decorator'
|
||
|
import { AuthUser } from '~/modules/auth/decorators/auth-user.decorator'
|
||
|
|
||
|
import { Perm, definePermission } from '~/modules/auth/decorators/permission.decorator'
|
||
|
|
||
|
import { FileUploadDto } from './upload.dto'
|
||
|
import { UploadService } from './upload.service'
|
||
|
|
||
|
export const permissions = definePermission('upload', {
|
||
|
UPLOAD: 'upload',
|
||
|
} as const)
|
||
|
|
||
|
@ApiSecurityAuth()
|
||
|
@ApiTags('Tools - 上传模块')
|
||
|
@Controller('upload')
|
||
|
export class UploadController {
|
||
|
constructor(private uploadService: UploadService) {}
|
||
|
|
||
|
@Post()
|
||
|
@Perm(permissions.UPLOAD)
|
||
|
@ApiOperation({ summary: '上传' })
|
||
|
@ApiConsumes('multipart/form-data')
|
||
|
@ApiBody({
|
||
|
type: FileUploadDto,
|
||
|
})
|
||
|
async upload(@Req() req: FastifyRequest, @AuthUser() user: IAuthUser) {
|
||
|
if (!req.isMultipart())
|
||
|
throw new BadRequestException('Request is not multipart')
|
||
|
|
||
|
const file = await req.file()
|
||
|
|
||
|
// https://github.com/fastify/fastify-multipart
|
||
|
// const parts = req.files()
|
||
|
// for await (const part of parts)
|
||
|
// console.log(part.file)
|
||
|
|
||
|
try {
|
||
|
const path = await this.uploadService.saveFile(file, user.uid)
|
||
|
|
||
|
return {
|
||
|
filename: path,
|
||
|
}
|
||
|
}
|
||
|
catch (error) {
|
||
|
console.log(error)
|
||
|
throw new BadRequestException('上传失败')
|
||
|
}
|
||
|
}
|
||
|
}
|