From 701207e100c7b7b71a4791a7594bd346a4618066 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 2 Dec 2020 18:46:40 +0100 Subject: [PATCH] Created basic runner controller ref #13 --- src/controllers/RunnerController.ts | 91 +++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 src/controllers/RunnerController.ts diff --git a/src/controllers/RunnerController.ts b/src/controllers/RunnerController.ts new file mode 100644 index 0000000..89e5e8b --- /dev/null +++ b/src/controllers/RunnerController.ts @@ -0,0 +1,91 @@ +import { JsonController, Param, Body, Get, Post, Put, Delete, NotFoundError, OnUndefined, NotAcceptableError, Authorized } from 'routing-controllers'; +import { getConnectionManager, Repository } from 'typeorm'; +import { EntityFromBody } from 'typeorm-routing-controllers-extensions'; +import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi'; +import { Runner } from '../models/Runner'; +import { IsInt, IsNotEmpty, IsPositive, IsString } from 'class-validator'; +import {RunnerIdsNotMatchingError, RunnerNotFoundError} from "../errors/RunnerErrors"; + +class CreateRunner { + @IsString() + @IsNotEmpty() + name: string; + + @IsInt() + @IsPositive() + length: number; +} + +@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(Runner, { isArray: true }) + @OpenAPI({ description: "Lists all runners." }) + getAll() { + return this.runnerRepository.find(); + } + + @Get('/:id') + @ResponseSchema(Runner) + @ResponseSchema(RunnerNotFoundError, {statusCode: 404}) + @OnUndefined(RunnerNotFoundError) + @OpenAPI({ description: "Returns a runner of a specified id (if it exists)" }) + getOne(@Param('id') id: number) { + return this.runnerRepository.findOne({ id: id }); + } + + @Post() + @ResponseSchema(Runner) + @OpenAPI({ description: "Create a new runner object (id will be generated automagicly)." }) + post( + @Body({ validate: true }) + runner: CreateRunner + ) { + return this.runnerRepository.save(runner); + } + + @Put('/:id') + @ResponseSchema(Runner) + @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 runner; + } + + @Delete('/:id') + @ResponseSchema(Runner) + @ResponseSchema(RunnerNotFoundError, {statusCode: 404}) + @OpenAPI({description: "Delete a specified runner (if it exists)."}) + async remove(@Param('id') id: number) { + let runner = await this.runnerRepository.findOne({ id: id }); + + if (!runner) { + throw new RunnerNotFoundError(); + } + + await this.runnerRepository.delete(runner); + return runner; + } +}