Add junk drawer
This commit is contained in:
94
src/junk-drawer/junk-drawer.controller.ts
Normal file
94
src/junk-drawer/junk-drawer.controller.ts
Normal file
@@ -0,0 +1,94 @@
|
||||
import {
|
||||
Body,
|
||||
Controller,
|
||||
Get,
|
||||
Param,
|
||||
Post,
|
||||
Redirect,
|
||||
Render,
|
||||
Res,
|
||||
UploadedFile,
|
||||
UploadedFiles,
|
||||
UseInterceptors,
|
||||
} from '@nestjs/common';
|
||||
import { JunkDrawerService } from './junk-drawer.service';
|
||||
import { ApiConsumes, ApiTags } from '@nestjs/swagger';
|
||||
import { FilesInterceptor } from '@nestjs/platform-express';
|
||||
import { generateUniqueSlug } from 'src/utils/slug';
|
||||
import { JunkDrawerMetadata } from './types';
|
||||
import { Response } from 'express';
|
||||
|
||||
@Controller('junk-drawer')
|
||||
@ApiTags('junk-drawer')
|
||||
export class JunkDrawerController {
|
||||
constructor(private readonly junkDrawerService: JunkDrawerService) {}
|
||||
|
||||
@Get('')
|
||||
@Render('junk-drawer/upload')
|
||||
generateUploadForm() {
|
||||
return {};
|
||||
}
|
||||
|
||||
@Get(':slug')
|
||||
@Render('junk-drawer/view')
|
||||
async viewJunkDrawer(@Param('slug') slug: string): Promise<any> {
|
||||
const metadata = await this.junkDrawerService.getJunkDrawerMetadata(slug);
|
||||
return { ...metadata };
|
||||
}
|
||||
|
||||
@Get(':slug/:filename')
|
||||
async downloadJunkDrawerItem(
|
||||
@Param('slug') slug: string,
|
||||
@Param('filename') filename: string,
|
||||
@Res() res: Response,
|
||||
) {
|
||||
const metadata = await this.junkDrawerService.getJunkDrawerMetadata(slug);
|
||||
if (!metadata) {
|
||||
return res.status(404).send('File not found or expired');
|
||||
}
|
||||
const item = metadata.items.find((item) => item.filename === filename);
|
||||
if (!item) {
|
||||
return res.status(404).send('File not found or expired');
|
||||
}
|
||||
const buffer = await this.junkDrawerService.getJunkDrawerItem(
|
||||
slug,
|
||||
filename,
|
||||
);
|
||||
return res
|
||||
.header('Content-Type', item.mimetype)
|
||||
.header('Content-Disposition', `filename="${item.filename}"`)
|
||||
.send(buffer);
|
||||
}
|
||||
|
||||
@Post('upload')
|
||||
@Redirect('', 302)
|
||||
@ApiConsumes('multipart/form-data')
|
||||
@UseInterceptors(FilesInterceptor('files'))
|
||||
async handleFileUpload(
|
||||
@UploadedFiles() files: Express.Multer.File[],
|
||||
@Body('description') description: string,
|
||||
): Promise<any> {
|
||||
const uniqueSlug = generateUniqueSlug();
|
||||
const metadata: JunkDrawerMetadata = {
|
||||
slug: uniqueSlug,
|
||||
version: '1.0.0',
|
||||
lastModified: new Date(),
|
||||
description,
|
||||
items: files.map((file) => ({
|
||||
filename: file.originalname,
|
||||
size: file.size,
|
||||
lastModified: new Date(),
|
||||
mimetype: file.mimetype,
|
||||
})),
|
||||
};
|
||||
for (const file of files) {
|
||||
await this.junkDrawerService.storeJunkDrawerItem(
|
||||
uniqueSlug,
|
||||
file.originalname,
|
||||
file.buffer,
|
||||
);
|
||||
}
|
||||
await this.junkDrawerService.storeJunkDrawerMetadata(metadata);
|
||||
return { url: `/junk-drawer/${uniqueSlug}` };
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user