diff --git a/docker-compose.yml b/docker-compose.yml index c003c69..19f941d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,11 +8,11 @@ services: ports: - "80:80" environment: - BACKEND_V1_GET_URL: ' ' - BACKEND_V2_GET_URL: http://localhost:8080/api/v2/ - BACKEND_V2_POST_URL: http://localhost:8080/api/v2/ + BACKEND_V2_GET_URL: http://localhost:8080/api/v2/scenes/ + BACKEND_V2_POST_URL: http://localhost:8080/api/v2/scenes/ SOCKET_SERVER_URL: http://localhost:5000/ - + STORAGE_BACKEND: "http" + HTTP_STORAGE_BACKEND_URL: "http://localhost:8080/api/v2" excalidraw-storage-backend: build: . ports: diff --git a/src/app.module.ts b/src/app.module.ts index c43006c..8ae99b0 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -2,10 +2,11 @@ import { MiddlewareConsumer, Module } from '@nestjs/common'; import { RawParserMiddleware } from './raw-parser.middleware'; import { ScenesController } from './scenes/scenes.controller'; import { StorageService } from './storage/storage.service'; +import { RoomsController } from './rooms/rooms.controller'; @Module({ imports: [], - controllers: [ScenesController], + controllers: [ScenesController, RoomsController], providers: [StorageService], }) export class AppModule { diff --git a/src/main.ts b/src/main.ts index 613b2a0..0b403e9 100644 --- a/src/main.ts +++ b/src/main.ts @@ -9,7 +9,7 @@ function isLogLevel(value: any): value is LogLevel { async function bootstrap() { const logLevel = isLogLevel(process.env.LOG_LEVEL) ? process.env.LOG_LEVEL - : 'debug'; + : 'log'; const app = await NestFactory.create(AppModule, { cors: true, diff --git a/src/raw-parser.middleware.ts b/src/raw-parser.middleware.ts index e2a7d19..970ccde 100644 --- a/src/raw-parser.middleware.ts +++ b/src/raw-parser.middleware.ts @@ -2,7 +2,7 @@ import { Injectable, NestMiddleware } from '@nestjs/common'; import { raw } from 'express'; import { hasBody } from 'type-is'; -// Excalidraw Front end doesn't send a Content Type Header +// Excalidraw Front end doesn't send a Content Type Header // so we tell raw parser to check if there is a body const rawParserMiddleware = raw({ type: hasBody }); diff --git a/src/rooms/rooms.controller.spec.ts b/src/rooms/rooms.controller.spec.ts new file mode 100644 index 0000000..0402040 --- /dev/null +++ b/src/rooms/rooms.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { RoomsController } from './rooms.controller'; + +describe('RoomsController', () => { + let controller: RoomsController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [RoomsController], + }).compile(); + + controller = module.get(RoomsController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/src/rooms/rooms.controller.ts b/src/rooms/rooms.controller.ts new file mode 100644 index 0000000..9014789 --- /dev/null +++ b/src/rooms/rooms.controller.ts @@ -0,0 +1,49 @@ +import { + Body, + Controller, + Get, + Header, + Logger, + NotFoundException, + Param, + Put, + Res, +} from '@nestjs/common'; +import { Response } from 'express'; +import { StorageNamespace, StorageService } from 'src/storage/storage.service'; +import { Readable } from 'stream'; + +@Controller('rooms') +export class RoomsController { + private readonly logger = new Logger(RoomsController.name); + namespace = StorageNamespace.ROOMS; + + constructor(private storageService: StorageService) {} + + @Get(':id') + @Header('content-type', 'application/octet-stream') + async findOne(@Param() params, @Res() res: Response): Promise { + const data = await this.storageService.get(params.id, this.namespace); + this.logger.debug(`Get room ${params.id}`); + + if (!data) { + throw new NotFoundException(); + } + + const stream = new Readable(); + stream.push(data); + stream.push(null); + stream.pipe(res); + } + + @Put(':id') + async create(@Param() params, @Body() payload: Buffer) { + const id = params.id; + await this.storageService.set(id, payload, this.namespace); + this.logger.debug(`Created scene ${id}`); + + return { + id, + }; + } +} diff --git a/src/scenes/scenes.controller.ts b/src/scenes/scenes.controller.ts index 7579c40..eec0a5f 100644 --- a/src/scenes/scenes.controller.ts +++ b/src/scenes/scenes.controller.ts @@ -5,6 +5,7 @@ import { Header, InternalServerErrorException, Logger, + NotFoundException, Param, Post, Res, @@ -14,7 +15,7 @@ import { StorageNamespace, StorageService } from 'src/storage/storage.service'; import { Readable } from 'stream'; import { customAlphabet } from 'nanoid'; -@Controller() +@Controller('scenes') export class ScenesController { private readonly logger = new Logger(ScenesController.name); namespace = StorageNamespace.SCENES; @@ -26,6 +27,10 @@ export class ScenesController { const data = await this.storageService.get(params.id, this.namespace); this.logger.debug(`Get scene ${params.id}`); + if (!data) { + throw new NotFoundException(); + } + const stream = new Readable(); stream.push(data); stream.push(null);