Spaces:
Runtime error
Runtime error
File size: 2,461 Bytes
498cc9f ee3e190 498cc9f ee3e190 498cc9f d201b18 498cc9f 1d6d4ff 498cc9f d201b18 498cc9f ee3e190 498cc9f | 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 | import {
Controller,
Get,
Delete,
Query,
HttpCode,
HttpStatus,
Res,
StreamableFile,
} from '@nestjs/common';
import type { Response } from 'express';
import { ApiTags, ApiOperation, ApiQuery } from '@nestjs/swagger';
import { BackblazeStorageService } from './backblaze-storage.service';
import { FileType } from './enums/file-type.enum';
import { LogToDiscord } from 'src/shared/decorators/log-to-discord.decorator';
@ApiTags('Upload: Backblaze B2 Storage')
@Controller('backblaze')
@LogToDiscord()
export class BackblazeStorageController {
constructor(
private readonly backblazeStorageService: BackblazeStorageService,
) {}
@Get('presigned-upload')
@ApiOperation({ summary: 'Get presigned upload URL' })
@ApiQuery({ name: 'fileName', required: true })
@ApiQuery({ name: 'fileType', enum: FileType, required: false })
async getPresignedUploadUrl(
@Query('fileName') fileName: string,
@Query('fileType') fileType?: FileType,
) {
return this.backblazeStorageService.getPresignedUploadUrl(
fileName,
fileType,
);
}
@Get('resize')
@ApiOperation({ summary: 'Resize and serve image from B2' })
@ApiQuery({ name: 'path', required: true, description: 'File path in B2' })
@ApiQuery({ name: 'w', required: false, description: 'Width in pixels' })
@ApiQuery({ name: 'h', required: false, description: 'Height in pixels' })
@ApiQuery({
name: 'q',
required: false,
description: 'Quality (1-100)',
type: Number,
})
async resizeImage(
@Res({ passthrough: true }) res: Response,
@Query('path') path: string,
@Query('w') width?: string,
@Query('h') height?: string,
@Query('q') quality?: string,
): Promise<StreamableFile> {
const result = await this.backblazeStorageService.resizeImage(
path,
width ? parseInt(width) : undefined,
height ? parseInt(height) : undefined,
quality ? parseInt(quality) : undefined,
);
res.set({
'Content-Type': result.contentType,
'Cache-Control': 'public, max-age=31536000', // Cache for 1 year
});
return new StreamableFile(result.buffer);
}
@Delete('by-url')
@HttpCode(HttpStatus.OK)
@ApiOperation({ summary: 'Delete file by CDN URL' })
async deleteFileByUrl(@Query('url') url: string) {
const result = await this.backblazeStorageService.deleteFileByUrl(url);
return {
message: 'File deleted successfully',
...result,
};
}
}
|