aboutsummaryrefslogtreecommitdiffstats
path: root/src/file/controller/file.controller.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/file/controller/file.controller.ts')
-rw-r--r--src/file/controller/file.controller.ts75
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,
+ };
+ }
+}