|
|
import { |
|
|
Controller, |
|
|
Post, |
|
|
Get, |
|
|
Delete, |
|
|
Param, |
|
|
UploadedFile, |
|
|
UseInterceptors, |
|
|
Body, |
|
|
Res, |
|
|
MaxFileSizeValidator, |
|
|
ParseFilePipe, |
|
|
HttpStatus, |
|
|
HttpException, |
|
|
} from '@nestjs/common'; |
|
|
import { FileInterceptor } from '@nestjs/platform-express'; |
|
|
import { Response } from 'express'; |
|
|
import { FileService } from './file.service'; |
|
|
|
|
|
@Controller('clipboard/:roomCode/files') |
|
|
export class FileController { |
|
|
constructor(private readonly fileService: FileService) {} |
|
|
|
|
|
@Post() |
|
|
@UseInterceptors(FileInterceptor('file')) |
|
|
async uploadFile( |
|
|
@Param('roomCode') roomCode: string, |
|
|
@UploadedFile( |
|
|
new ParseFilePipe({ |
|
|
validators: [ |
|
|
new MaxFileSizeValidator({ maxSize: 10 * 1024 * 1024 }), |
|
|
], |
|
|
}), |
|
|
) |
|
|
file: Express.Multer.File, |
|
|
@Body('clientId') clientId: string, |
|
|
) { |
|
|
try { |
|
|
const fileEntry = await this.fileService.uploadFile( |
|
|
roomCode, |
|
|
file, |
|
|
clientId, |
|
|
); |
|
|
return fileEntry; |
|
|
} catch (error) { |
|
|
throw new HttpException( |
|
|
error.message || 'Failed to upload file', |
|
|
HttpStatus.INTERNAL_SERVER_ERROR, |
|
|
); |
|
|
} |
|
|
} |
|
|
|
|
|
@Get(':fileId') |
|
|
async getFile( |
|
|
@Param('roomCode') roomCode: string, |
|
|
@Param('fileId') fileId: string, |
|
|
@Res() res: Response, |
|
|
) { |
|
|
try { |
|
|
const fileData = await this.fileService.getFileData(roomCode, fileId); |
|
|
const fileUrl = fileData.url; |
|
|
|
|
|
|
|
|
const originalFilename = res.req.query.filename; |
|
|
const redirectUrl = originalFilename |
|
|
? `${fileUrl}?download=true&originalName=${encodeURIComponent(originalFilename.toString())}` |
|
|
: fileUrl; |
|
|
|
|
|
return res.redirect(redirectUrl); |
|
|
} catch (error) { |
|
|
throw new HttpException( |
|
|
error.message || 'Failed to get file', |
|
|
HttpStatus.NOT_FOUND, |
|
|
); |
|
|
} |
|
|
} |
|
|
|
|
|
@Delete(':fileId') |
|
|
async deleteFile( |
|
|
@Param('roomCode') roomCode: string, |
|
|
@Param('fileId') fileId: string, |
|
|
) { |
|
|
try { |
|
|
const success = await this.fileService.deleteFile(roomCode, fileId); |
|
|
return { success }; |
|
|
} catch (error) { |
|
|
throw new HttpException( |
|
|
error.message || 'Failed to delete file', |
|
|
HttpStatus.INTERNAL_SERVER_ERROR, |
|
|
); |
|
|
} |
|
|
} |
|
|
} |
|
|
|