From f3000f14cd3197c95e8a26366435a0ca99e06d8c Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Thu, 10 Dec 2020 19:31:48 +0100 Subject: [PATCH] Runner updateing now works with it's own class ref #13 --- src/controllers/RunnerController.ts | 10 ++--- src/models/actions/UpdateRunner.ts | 59 +++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 5 deletions(-) create mode 100644 src/models/actions/UpdateRunner.ts diff --git a/src/controllers/RunnerController.ts b/src/controllers/RunnerController.ts index fe522ab..b5a29f9 100644 --- a/src/controllers/RunnerController.ts +++ b/src/controllers/RunnerController.ts @@ -1,10 +1,10 @@ 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, RunnerIdsNotMatchingError, RunnerNotFoundError } from '../errors/RunnerErrors'; import { RunnerGroupNotFoundError } from '../errors/RunnerGroupErrors'; import { CreateRunner } from '../models/actions/CreateRunner'; +import { UpdateRunner } from '../models/actions/UpdateRunner'; import { Runner } from '../models/entities/Runner'; import { ResponseEmpty } from '../models/responses/ResponseEmpty'; import { ResponseRunner } from '../models/responses/ResponseRunner'; @@ -66,8 +66,8 @@ export class RunnerController { @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 }, { relations: ['scans', 'group'] }); + async put(@Param('id') id: number, @Body({ validate: true }) runner: UpdateRunner) { + let oldRunner = await this.runnerRepository.findOne({ id: id }, { relations: ['group'] }); if (!oldRunner) { throw new RunnerNotFoundError(); @@ -77,8 +77,8 @@ export class RunnerController { throw new RunnerIdsNotMatchingError(); } - await this.runnerRepository.update(oldRunner, runner); - return new ResponseRunner(runner); + await this.runnerRepository.update(oldRunner, await runner.toRunner()); + return new ResponseRunner(await this.runnerRepository.findOne({ id: id }, { relations: ['scans', 'group'] })); } @Delete('/:id') diff --git a/src/models/actions/UpdateRunner.ts b/src/models/actions/UpdateRunner.ts new file mode 100644 index 0000000..436b947 --- /dev/null +++ b/src/models/actions/UpdateRunner.ts @@ -0,0 +1,59 @@ +import { IsInt, IsObject } from 'class-validator'; +import { getConnectionManager } from 'typeorm'; +import { RunnerGroupNotFoundError } from '../../errors/RunnerGroupErrors'; +import { RunnerOrganisationWrongTypeError } from '../../errors/RunnerOrganisationErrors'; +import { RunnerTeamNeedsParentError } from '../../errors/RunnerTeamErrors'; +import { Runner } from '../entities/Runner'; +import { RunnerGroup } from '../entities/RunnerGroup'; +import { CreateParticipant } from './CreateParticipant'; + +export class UpdateRunner extends CreateParticipant { + + /** + * The new runner's team's id. + * Either provide this or his organisation's id. + */ + @IsInt() + id: number; + + /** + * The new runner's team's id. + * Either provide this or his organisation's id. + */ + @IsObject() + group: RunnerGroup; + + /** + * Creates a Runner entity from this. + */ + public async toRunner(): Promise { + let newRunner: Runner = new Runner(); + + newRunner.id = this.id; + newRunner.firstname = this.firstname; + newRunner.middlename = this.middlename; + newRunner.lastname = this.lastname; + newRunner.phone = this.phone; + newRunner.email = this.email; + newRunner.group = await this.getGroup(); + newRunner.address = await this.getAddress(); + + return newRunner; + } + + /** + * Manages all the different ways a group can be provided. + */ + public async getGroup(): Promise { + if (this.group === undefined) { + throw new RunnerTeamNeedsParentError(); + } + if (!isNaN(this.group.id)) { + let group = await getConnectionManager().get().getRepository(RunnerGroup).findOne({ id: this.group.id }); + if (!group) { throw new RunnerGroupNotFoundError; } + return group; + } + + throw new RunnerOrganisationWrongTypeError; + } +} \ No newline at end of file