From a586a0fbc7af650e467705dd9e453e767839bac1 Mon Sep 17 00:00:00 2001 From: Inga Date: Sun, 10 Jul 2022 00:22:46 +0200 Subject: [PATCH] connected queue to screenshotter; first functional version --- src/app.module.ts | 5 ---- src/hello-world/controller.spec.ts | 22 ------------------ src/hello-world/controller.ts | 12 ---------- src/hello-world/service.ts | 8 ------- ...d-return-hello-world-screenshot-1-snap.png | Bin src/screenshots/screenshots.controller.ts | 18 +++++++++++--- src/screenshots/screenshots.module.ts | 3 ++- src/screenshots/screenshots.processor.ts | 14 ++++++++++- .../screenshotter.service.spec.ts | 0 .../screenshotter.service.ts | 0 tsconfig.json | 1 + 11 files changed, 31 insertions(+), 52 deletions(-) delete mode 100644 src/hello-world/controller.spec.ts delete mode 100644 src/hello-world/controller.ts delete mode 100644 src/hello-world/service.ts rename src/{screenshotter => screenshots}/__image_snapshots__/screenshotter-service-spec-ts-screenshotter-service-should-return-hello-world-screenshot-1-snap.png (100%) rename src/{screenshotter => screenshots}/screenshotter.service.spec.ts (100%) rename src/{screenshotter => screenshots}/screenshotter.service.ts (100%) diff --git a/src/app.module.ts b/src/app.module.ts index 43cc827..ea84ba8 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,8 +1,5 @@ import { Module } from '@nestjs/common'; import { ConfigModule, ConfigService } from '@nestjs/config'; -import { HelloWorldController } from './hello-world/controller'; -import { HelloWorldService } from './hello-world/service'; -import { ScreenshotterService } from './screenshotter/screenshotter.service'; import { BullModule } from '@nestjs/bull'; import { ScreenshotsModule } from './screenshots/screenshots.module'; import { BullConfigService } from './bull/bullConfigService'; @@ -22,7 +19,5 @@ import { join } from 'path'; rootPath: join(__dirname, '..', 'client'), }), ], - controllers: [HelloWorldController], - providers: [HelloWorldService, ScreenshotterService], }) export class AppModule {} diff --git a/src/hello-world/controller.spec.ts b/src/hello-world/controller.spec.ts deleted file mode 100644 index def410e..0000000 --- a/src/hello-world/controller.spec.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { HelloWorldController } from './controller'; -import { HelloWorldService } from './service'; - -describe('HelloWorldController', () => { - let helloWorldController: HelloWorldController; - - beforeEach(async () => { - const app: TestingModule = await Test.createTestingModule({ - controllers: [HelloWorldController], - providers: [HelloWorldService], - }).compile(); - - helloWorldController = app.get(HelloWorldController); - }); - - describe('root', () => { - it('should return "Hello World!"', () => { - expect(helloWorldController.getHello()).toBe('Hello World!'); - }); - }); -}); diff --git a/src/hello-world/controller.ts b/src/hello-world/controller.ts deleted file mode 100644 index d99ae3e..0000000 --- a/src/hello-world/controller.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Controller, Get } from '@nestjs/common'; -import { HelloWorldService } from './service'; - -@Controller('hello-world') -export class HelloWorldController { - constructor(private readonly helloWorldService: HelloWorldService) {} - - @Get() - getHello(): string { - return this.helloWorldService.getHello(); - } -} diff --git a/src/hello-world/service.ts b/src/hello-world/service.ts deleted file mode 100644 index d4d1ed6..0000000 --- a/src/hello-world/service.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Injectable } from '@nestjs/common'; - -@Injectable() -export class HelloWorldService { - getHello(): string { - return 'Hello World!'; - } -} diff --git a/src/screenshotter/__image_snapshots__/screenshotter-service-spec-ts-screenshotter-service-should-return-hello-world-screenshot-1-snap.png b/src/screenshots/__image_snapshots__/screenshotter-service-spec-ts-screenshotter-service-should-return-hello-world-screenshot-1-snap.png similarity index 100% rename from src/screenshotter/__image_snapshots__/screenshotter-service-spec-ts-screenshotter-service-should-return-hello-world-screenshot-1-snap.png rename to src/screenshots/__image_snapshots__/screenshotter-service-spec-ts-screenshotter-service-should-return-hello-world-screenshot-1-snap.png diff --git a/src/screenshots/screenshots.controller.ts b/src/screenshots/screenshots.controller.ts index c2acffd..d0b3556 100644 --- a/src/screenshots/screenshots.controller.ts +++ b/src/screenshots/screenshots.controller.ts @@ -1,6 +1,8 @@ import { InjectQueue } from '@nestjs/bull'; -import { Body, Controller, Get, NotFoundException, Param, Post } from '@nestjs/common'; +import { Body, Controller, Get, NotFoundException, Param, Post, Res, StreamableFile } from '@nestjs/common'; import { ApiResponse } from '@nestjs/swagger'; +import { Response } from 'express' +import { Readable } from 'stream'; import { CreateJobRequestDto, GetJobResponseDto, JobStatusDto } from './screenshots.dto' import { QUEUE_NAME, ScreenshotsQueue } from './shared'; @@ -40,7 +42,7 @@ export class ScreenshotsController { @Get(':id/result') @ApiResponse({ status: 404 }) - async getScreenshot(@Param('id') id: string) { + async getScreenshot(@Param('id') id: string, @Res({ passthrough: true }) res: Response): Promise { const jobInfo = await this.screenshotsQueue.getJob(id) if (!jobInfo) { @@ -51,6 +53,16 @@ export class ScreenshotsController { throw new NotFoundException() } - return await jobInfo.returnvalue + switch (jobInfo.data.imageType) { + case 'jpeg': + res.setHeader('Content-Type', 'image/jpeg') + break + case 'png': + res.setHeader('Content-Type', 'image/png') + break + } + + const buffer = Buffer.from(await jobInfo.returnvalue as string, 'base64') + return new StreamableFile(buffer) } } diff --git a/src/screenshots/screenshots.module.ts b/src/screenshots/screenshots.module.ts index 504f222..69f23ec 100644 --- a/src/screenshots/screenshots.module.ts +++ b/src/screenshots/screenshots.module.ts @@ -3,6 +3,7 @@ import { Module } from '@nestjs/common'; import { QUEUE_NAME } from './shared'; import { ScreenshotsController } from './screenshots.controller'; import { ScreenshotsProcessor } from './screenshots.processor'; +import { ScreenshotterService } from './screenshotter.service'; @Module({ imports: [ @@ -11,6 +12,6 @@ import { ScreenshotsProcessor } from './screenshots.processor'; }), ], controllers: [ScreenshotsController], - providers: [ScreenshotsProcessor] + providers: [ScreenshotsProcessor, ScreenshotterService] }) export class ScreenshotsModule {} diff --git a/src/screenshots/screenshots.processor.ts b/src/screenshots/screenshots.processor.ts index 2d4dc18..e05e3e9 100644 --- a/src/screenshots/screenshots.processor.ts +++ b/src/screenshots/screenshots.processor.ts @@ -1,12 +1,24 @@ import { Process, Processor } from '@nestjs/bull'; import { Injectable } from '@nestjs/common'; +import { ScreenshotterService } from './screenshotter.service'; import { QUEUE_NAME, ScreenshotJob } from './shared'; @Injectable() @Processor(QUEUE_NAME) export class ScreenshotsProcessor { + constructor(private readonly screenshotterService: ScreenshotterService) {} + @Process() async handleScreenshotJob(job: ScreenshotJob) { - job.moveToCompleted('abc') + try { + const imageData = await this.screenshotterService.takeScreenshot({ + url: job.data.pageUrl, + imageType: job.data.imageType, + }) + + job.moveToCompleted(imageData.toString('base64')) + } catch(err) { + job.moveToFailed({ message: JSON.stringify(err) }) + } } } diff --git a/src/screenshotter/screenshotter.service.spec.ts b/src/screenshots/screenshotter.service.spec.ts similarity index 100% rename from src/screenshotter/screenshotter.service.spec.ts rename to src/screenshots/screenshotter.service.spec.ts diff --git a/src/screenshotter/screenshotter.service.ts b/src/screenshots/screenshotter.service.ts similarity index 100% rename from src/screenshotter/screenshotter.service.ts rename to src/screenshots/screenshotter.service.ts diff --git a/tsconfig.json b/tsconfig.json index 52b08c1..0301419 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,7 @@ { "compilerOptions": { "module": "commonjs", + "lib": ["ES2019"], "declaration": true, "removeComments": true, "emitDecoratorMetadata": true,