diff options
Diffstat (limited to 'src/file/controller/file.controller.ts')
| -rw-r--r-- | src/file/controller/file.controller.ts | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/file/controller/file.controller.ts b/src/file/controller/file.controller.ts new file mode 100644 index 0000000..d7632ed --- /dev/null +++ b/src/file/controller/file.controller.ts @@ -0,0 +1,75 @@ +import { Body, Controller, ForbiddenException, Get, GoneException, Param, Post } from '@nestjs/common'; +import { SessionService } from '../../session/service/session.service'; +import { SessionTokenDto } from '../dto/session-key.dto'; +import { CreateFileDto } from '../dto/create-file.dto'; +import { FileService } from '../service/file.service'; + +@Controller('file') +export class FileController { + constructor( + private readonly sessionService: SessionService, + private readonly fileService: FileService, + ) {} + + @Post('retrieve-keys') + async use(@Body() sessionTokenDto: SessionTokenDto) { + const sessionMarkedAsUsed = await this.sessionService.markSessionAsUsed(sessionTokenDto.token); + + if (!sessionMarkedAsUsed) { + throw new ForbiddenException(); + } + + const files = await this.fileService.findManyValid(sessionTokenDto.token); + + return { + files: files.map((file) => ({ + key: file.key, + purpose: file.purpose?.name, + validUntil: file.validUntil, + })), + }; + } + + @Post('create') + async create(@Body() createFileDto: CreateFileDto) { + const session = await this.sessionService.findValid(createFileDto.token); + + if (!session) { + throw new ForbiddenException(); + } + + const data = JSON.stringify(createFileDto.data); + const b64EncodedData = Buffer.from(data).toString('base64'); + const validTo = new Date(Date.now() + 1000 * 60 * 30); + + const file = await this.fileService.createFile(b64EncodedData, createFileDto.purpose, validTo, session); + return { + creationDate: file.creationDate, + validUntil: file.validUntil, + purpose: file.purpose, + session: { + validUntil: file.session.validUntil, + }, + }; + } + + @Get('retrieve-file/:key') + async retrieve(@Param('key') key: string) { + const fileMarkedAsUsed = await this.fileService.markFileAsUsed(key); + + if (!fileMarkedAsUsed) { + throw new ForbiddenException(); + } + + const fileData = await this.fileService.fetchFileContents(key); + if (!fileData) { + throw new GoneException('This file has been deleted'); + } + + const json = JSON.parse(Buffer.from(fileData, 'base64').toString('utf8')); + + return { + data: json, + }; + } +} |
