import { Body, Delete, Get, JsonController, OnUndefined, Param, Post, Put, QueryParam } from 'routing-controllers'; import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi'; import { getConnectionManager, Repository } from 'typeorm'; import { EntityFromBody } from 'typeorm-routing-controllers-extensions'; import { RunnerGroupNeededError, RunnerGroupNotFoundError, RunnerIdsNotMatchingError, RunnerNotFoundError, RunnerOnlyOneGroupAllowedError } from '../errors/RunnerErrors'; import { CreateRunner } from '../models/creation/CreateRunner'; import { Runner } from '../models/entities/Runner'; import { ResponseRunner } from '../models/responses/ResponseRunner'; @JsonController('/runners') //@Authorized('RUNNERS:read') export class RunnerController { private runnerRepository: Repository; /** * Gets the repository of this controller's model/entity. */ constructor() { this.runnerRepository = getConnectionManager().get().getRepository(Runner); } @Get() @ResponseSchema(ResponseRunner, { isArray: true }) @OpenAPI({ description: 'Lists all runners.' }) async getAll() { let responseRunners: ResponseRunner[] = new Array(); const runners = await this.runnerRepository.find({ relations: ['scans', 'group'] }); console.log(runners); runners.forEach(runner => { responseRunners.push(new ResponseRunner(runner)); }); return responseRunners; } @Get('/:id') @ResponseSchema(ResponseRunner) @ResponseSchema(RunnerNotFoundError, { statusCode: 404 }) @OnUndefined(RunnerNotFoundError) @OpenAPI({ description: 'Returns a runner of a specified id (if it exists)' }) async getOne(@Param('id') id: number) { return new ResponseRunner(await this.runnerRepository.findOne({ id: id }, { relations: ['scans', 'group'] })); } @Post() @ResponseSchema(ResponseRunner) @ResponseSchema(RunnerOnlyOneGroupAllowedError) @ResponseSchema(RunnerGroupNeededError) @ResponseSchema(RunnerGroupNotFoundError) @OpenAPI({ description: 'Create a new runner object (id will be generated automagicly).' }) async post(@Body({ validate: true }) createRunner: CreateRunner) { let runner; try { runner = await createRunner.toRunner(); } catch (error) { return error; } runner = await this.runnerRepository.save(runner) return new ResponseRunner(await this.runnerRepository.findOne(runner, { relations: ['scans', 'group'] })); } @Put('/:id') @ResponseSchema(ResponseRunner) @ResponseSchema(RunnerNotFoundError, { statusCode: 404 }) @ResponseSchema(RunnerIdsNotMatchingError, { statusCode: 406 }) @OpenAPI({ description: "Update a runner object (id can't be changed)." }) async put(@Param('id') id: number, @EntityFromBody() runner: Runner) { let oldRunner = await this.runnerRepository.findOne({ id: id }); if (!oldRunner) { throw new RunnerNotFoundError(); } if (oldRunner.id != runner.id) { throw new RunnerIdsNotMatchingError(); } await this.runnerRepository.update(oldRunner, runner); return new ResponseRunner(runner); } @Delete('/:id') @ResponseSchema(ResponseRunner) @ResponseSchema(RunnerNotFoundError, { statusCode: 404 }) @OpenAPI({ description: 'Delete a specified runner (if it exists).' }) async remove(@Param('id') id: number, @QueryParam("force") force: boolean) { const runner = await this.runnerRepository.findOne({ id: id }); if (!runner) { throw new RunnerNotFoundError(); } await this.runnerRepository.delete(runner); return new ResponseRunner(runner); } }