From 8beb658bccb754b73ff7cb39d9d1e18e33cde0dd Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Fri, 4 Dec 2020 19:01:36 +0100 Subject: [PATCH] New response model for runners ref #13 --- src/controllers/RunnerController.ts | 13 +++-- src/models/entities/Runner.ts | 16 ++++-- src/models/responses/ResponseRunner.ts | 78 ++++++++++++++++++++++++++ 3 files changed, 97 insertions(+), 10 deletions(-) create mode 100644 src/models/responses/ResponseRunner.ts diff --git a/src/controllers/RunnerController.ts b/src/controllers/RunnerController.ts index 124a062..851a495 100644 --- a/src/controllers/RunnerController.ts +++ b/src/controllers/RunnerController.ts @@ -5,7 +5,7 @@ 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') @@ -20,10 +20,15 @@ export class RunnerController { } @Get() - @ResponseSchema(Runner, { isArray: true }) + @ResponseSchema(ResponseRunner, { isArray: true }) @OpenAPI({ description: 'Lists all runners.' }) - getAll() { - return this.runnerRepository.find(); + async getAll() { + let responseRunners: ResponseRunner[] = new Array(); + const runners = await this.runnerRepository.find(); + runners.forEach(runner => { + responseRunners.push(new ResponseRunner(runner)); + }); + return responseRunners; } @Get('/:id') diff --git a/src/models/entities/Runner.ts b/src/models/entities/Runner.ts index e4d3ff7..843d36a 100644 --- a/src/models/entities/Runner.ts +++ b/src/models/entities/Runner.ts @@ -1,9 +1,9 @@ -import { Entity, Column, OneToMany, ManyToOne, ChildEntity } from "typeorm"; -import { IsInt, IsNotEmpty, } from "class-validator"; -import { Participant } from "./Participant"; -import { RunnerGroup } from "./RunnerGroup"; +import { IsInt, IsNotEmpty } from "class-validator"; +import { ChildEntity, getConnectionManager, ManyToOne, OneToMany } from "typeorm"; import { DistanceDonation } from "./DistanceDonation"; +import { Participant } from "./Participant"; import { RunnerCard } from "./RunnerCard"; +import { RunnerGroup } from "./RunnerGroup"; import { Scan } from "./Scan"; /** @@ -38,7 +38,11 @@ export class Runner extends Participant { @IsInt() public get distance(): number { - return this.scans.filter(scan => scan.valid === true).reduce((sum, current) => sum + current.distance, 0); + getConnectionManager().get().getRepository(Scan).find({ runner: this }) + .then(myScans => { + return myScans.reduce((sum, current) => sum + current.distance, 0); + }) + .catch(err => { throw err }) + .finally(do => { return -1; }); } - } diff --git a/src/models/responses/ResponseRunner.ts b/src/models/responses/ResponseRunner.ts new file mode 100644 index 0000000..b2f3dfe --- /dev/null +++ b/src/models/responses/ResponseRunner.ts @@ -0,0 +1,78 @@ +import { + IsInt, + + IsObject, + + IsString +} from "class-validator"; +import { Runner } from '../entities/Runner'; +import { RunnerGroup } from '../entities/RunnerGroup'; + +/** + * Defines a track of given length. +*/ +export class ResponseRunner { + /** + * Autogenerated unique id (primary key). + */ + @IsInt() + id: number;; + + /** + * The runner's first name. + */ + @IsString() + firstname: string; + + /** + * The runner's middle name. + * Optional. + */ + @IsString() + middlename?: string; + + /** + * The runner's last name. + */ + @IsString() + lastname: string; + + /** + * The runner's phone number. + * Optional. + */ + @IsString() + phone?: string; + + /** + * The runner's e-mail address. + * Optional. + */ + @IsString() + email?: string; + + /** + * The runner's currently ran distance in meters. + * Optional. + */ + @IsInt() + distance: number; + + /** + * The runner's group. + */ + @IsObject() + group: RunnerGroup; + + + public constructor(runner: Runner) { + this.id = runner.id; + this.firstname = runner.firstname; + this.middlename = runner.middlename; + this.lastname = runner.lastname; + this.phone = runner.phone; + this.email = runner.email; + this.distance = runner.distance; + this.group = runner.group; + } +}