Added response class for the runner stats

ref #56
This commit is contained in:
Nicolai Ort 2020-12-30 14:30:31 +01:00
parent 43e256f38c
commit d850650aeb
2 changed files with 75 additions and 4 deletions

View File

@ -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<ResponseStatsRunner>();
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<ResponseStatsRunner>();
topRunners.forEach(runner => {
responseRunners.push(new ResponseStatsRunner(runner));
});
return responseRunners;
}
@Get("/teams/distance")

View File

@ -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;
}
}