Small Nest.js-based project
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
test-assignment-datawrapper/src/screenshots/screenshots.controller.ts

55 lines
1.3 KiB

import { InjectQueue } from '@nestjs/bull';
import { Body, Controller, Get, NotFoundException, Param, Post } from '@nestjs/common';
import { QUEUE_NAME, ScreenshotsQueue } from './shared';
type CreateScreenshotJobDto = {
pageUrl: URL,
imageType: 'jpeg' | 'png'
}
@Controller('screenshots')
export class ScreenshotsController {
constructor(@InjectQueue(QUEUE_NAME) private readonly screenshotsQueue: ScreenshotsQueue) {}
@Post()
async createScreenshotJob(@Body() createScreenshotJobDto: CreateScreenshotJobDto) {
const result = await this.screenshotsQueue.add(createScreenshotJobDto)
return {
jobId: result.id.toString()
}
}
@Get(':id')
async getJob(@Param('id') id: string) {
const jobInfo = await this.screenshotsQueue.getJob(id)
if (!jobInfo) {
throw new NotFoundException()
}
switch (await jobInfo.getState()) {
case 'completed':
return { status: 'completed' }
case 'failed':
return { status: 'failed' }
default:
return { status: 'queued' }
}
}
@Get(':id/result')
async getScreenshot(@Param('id') id: string) {
const jobInfo = await this.screenshotsQueue.getJob(id)
if (!jobInfo) {
throw new NotFoundException()
}
if (!await jobInfo.isCompleted()) {
throw new NotFoundException()
}
return await jobInfo.returnvalue
}
}