From 4126d31a5e87aadd33f3c0b7878c71d428721243 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Sat, 2 Jan 2021 16:38:07 +0100 Subject: [PATCH] Added copy of runnerController with some stuff reanames for donors ref #65 --- src/controllers/DonorController.ts | 106 +++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 src/controllers/DonorController.ts diff --git a/src/controllers/DonorController.ts b/src/controllers/DonorController.ts new file mode 100644 index 0000000..4bd5ab6 --- /dev/null +++ b/src/controllers/DonorController.ts @@ -0,0 +1,106 @@ +import { Authorized, 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 { RunnerGroupNeededError, RunnerIdsNotMatchingError, RunnerNotFoundError } from '../errors/RunnerErrors'; +import { RunnerGroupNotFoundError } from '../errors/RunnerGroupErrors'; +import { CreateRunner } from '../models/actions/CreateRunner'; +import { UpdateRunner } from '../models/actions/UpdateRunner'; +import { Donor } from '../models/entities/Donor'; +import { ResponseEmpty } from '../models/responses/ResponseEmpty'; +import { ResponseRunner } from '../models/responses/ResponseRunner'; + +@JsonController('/donors') +@OpenAPI({ security: [{ "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) +export class DonorController { + private donorRepository: Repository; + + /** + * Gets the repository of this controller's model/entity. + */ + constructor() { + this.donorRepository = getConnectionManager().get().getRepository(Donor); + } + + @Get() + @Authorized("DONOR:GET") + @ResponseSchema(ResponseRunner, { isArray: true }) + @OpenAPI({ description: 'Lists all runners from all teams/orgs.
This includes the runner\'s group and distance ran.' }) + async getAll() { + let responseRunners: ResponseRunner[] = new Array(); + const runners = await this.donorRepository.find({ relations: ['scans', 'group'] }); + runners.forEach(runner => { + responseRunners.push(new ResponseRunner(runner)); + }); + return responseRunners; + } + + @Get('/:id') + @Authorized("DONOR:GET") + @ResponseSchema(ResponseRunner) + @ResponseSchema(RunnerNotFoundError, { statusCode: 404 }) + @OnUndefined(RunnerNotFoundError) + @OpenAPI({ description: 'Lists all information about the runner whose id got provided.' }) + async getOne(@Param('id') id: number) { + let runner = await this.donorRepository.findOne({ id: id }, { relations: ['scans', 'group'] }) + if (!runner) { throw new RunnerNotFoundError(); } + return new ResponseRunner(runner); + } + + @Post() + @Authorized("DONOR:CREATE") + @ResponseSchema(ResponseRunner) + @ResponseSchema(RunnerGroupNeededError) + @ResponseSchema(RunnerGroupNotFoundError) + @OpenAPI({ description: 'Create a new runner.
Please remeber to provide the runner\'s group\'s id.' }) + async post(@Body({ validate: true }) createRunner: CreateRunner) { + let runner; + try { + runner = await createRunner.toRunner(); + } catch (error) { + throw error; + } + + runner = await this.donorRepository.save(runner) + return new ResponseRunner(await this.donorRepository.findOne(runner, { relations: ['scans', 'group'] })); + } + + @Put('/:id') + @Authorized("DONOR:UPDATE") + @ResponseSchema(ResponseRunner) + @ResponseSchema(RunnerNotFoundError, { statusCode: 404 }) + @ResponseSchema(RunnerIdsNotMatchingError, { statusCode: 406 }) + @OpenAPI({ description: "Update the runner whose id you provided.
Please remember that ids can't be changed." }) + async put(@Param('id') id: number, @Body({ validate: true }) runner: UpdateRunner) { + let oldRunner = await this.donorRepository.findOne({ id: id }, { relations: ['group'] }); + + if (!oldRunner) { + throw new RunnerNotFoundError(); + } + + if (oldRunner.id != runner.id) { + throw new RunnerIdsNotMatchingError(); + } + + await this.donorRepository.save(await runner.updateRunner(oldRunner)); + return new ResponseRunner(await this.donorRepository.findOne({ id: id }, { relations: ['scans', 'group'] })); + } + + @Delete('/:id') + @Authorized("DONOR:DELETE") + @ResponseSchema(ResponseRunner) + @ResponseSchema(ResponseEmpty, { statusCode: 204 }) + @OnUndefined(204) + @OpenAPI({ description: 'Delete the runner whose id you provided.
If no runner with this id exists it will just return 204(no content).' }) + async remove(@Param("id") id: number, @QueryParam("force") force: boolean) { + let runner = await this.donorRepository.findOne({ id: id }); + if (!runner) { return null; } + const responseRunner = await this.donorRepository.findOne(runner, { relations: ['scans', 'group'] }); + + if (!runner) { + throw new RunnerNotFoundError(); + } + + await this.donorRepository.delete(runner); + return new ResponseRunner(responseRunner); + } +}