From d850650aeb632576114a0f7d726533585e0fd3bb Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 30 Dec 2020 14:30:31 +0100 Subject: [PATCH] Added response class for the runner stats ref #56 --- src/controllers/StatsController.ts | 19 +++++-- src/models/responses/ResponseStatsRunner.ts | 60 +++++++++++++++++++++ 2 files changed, 75 insertions(+), 4 deletions(-) create mode 100644 src/models/responses/ResponseStatsRunner.ts diff --git a/src/controllers/StatsController.ts b/src/controllers/StatsController.ts index 5df9126..83b0b95 100644 --- a/src/controllers/StatsController.ts +++ b/src/controllers/StatsController.ts @@ -8,6 +8,7 @@ import { RunnerOrganisation } from '../models/entities/RunnerOrganisation'; import { RunnerTeam } from '../models/entities/RunnerTeam'; import { Scan } from '../models/entities/Scan'; import { User } from '../models/entities/User'; +import { ResponseStatsRunner } from '../models/responses/ResponseStatsRunner'; @JsonController('/stats') export class StatsController { @@ -38,16 +39,26 @@ export class StatsController { @UseBefore(StatsAuth) @OpenAPI({ description: "Returns the top ten runners by distance.", security: [{ "StatsApiToken": [] }] }) async getTopRunnersByDistance() { - let runners = await getConnection().getRepository(Runner).find({ relations: ["scans"] }); - return runners.sort((runner1, runner2) => runner1.distance - runner2.distance).slice(0, 9); + let runners = await getConnection().getRepository(Runner).find({ relations: ['scans', 'group'] }); + let topRunners = runners.sort((runner1, runner2) => runner1.distance - runner2.distance).slice(0, 9); + let responseRunners: ResponseStatsRunner[] = new Array(); + topRunners.forEach(runner => { + responseRunners.push(new ResponseStatsRunner(runner)); + }); + return responseRunners; } @Get("/runners/donations") @UseBefore(StatsAuth) @OpenAPI({ description: "Returns the top ten runners by donations.", security: [{ "StatsApiToken": [] }] }) async getTopRunnersByDonations() { - let runners = await getConnection().getRepository(Runner).find({ relations: ["scans", "distanceDonations"] }); - return runners.sort((runner1, runner2) => runner1.distanceDonationAmount - runner2.distanceDonationAmount).slice(0, 9); + let runners = await getConnection().getRepository(Runner).find({ relations: ["scans", "distanceDonations", 'group'] }); + let topRunners = runners.sort((runner1, runner2) => runner1.distanceDonationAmount - runner2.distanceDonationAmount).slice(0, 9); + let responseRunners: ResponseStatsRunner[] = new Array(); + topRunners.forEach(runner => { + responseRunners.push(new ResponseStatsRunner(runner)); + }); + return responseRunners; } @Get("/teams/distance") diff --git a/src/models/responses/ResponseStatsRunner.ts b/src/models/responses/ResponseStatsRunner.ts new file mode 100644 index 0000000..652916b --- /dev/null +++ b/src/models/responses/ResponseStatsRunner.ts @@ -0,0 +1,60 @@ +import { + IsInt, + IsObject, + IsString +} from "class-validator"; +import { Runner } from '../entities/Runner'; +import { RunnerGroup } from '../entities/RunnerGroup'; + +/** + * Defines the runner response. +*/ +export class ResponseStatsRunner { + /** + * The participant's id. + */ + @IsInt() + id: number; + + /** + * The participant's first name. + */ + @IsString() + firstname: string; + + /** + * The participant's middle name. + */ + @IsString() + middlename?: string; + + /** + * The participant's last name. + */ + @IsString() + lastname: string; + + /** + * The runner's currently ran distance in meters. + */ + @IsInt() + distance: number; + + /** + * The runner's group. + */ + @IsObject() + group: RunnerGroup; + + /** + * Creates a ResponseRunner object from a runner. + * @param runner The user the response shall be build for. + */ + public constructor(runner: Runner) { + this.firstname = runner.firstname; + this.middlename = runner.middlename; + this.lastname = runner.lastname; + this.distance = runner.scans.filter(scan => { scan.valid === true }).reduce((sum, current) => sum + current.distance, 0); + this.group = runner.group; + } +}