Implemented more stats endpoints

ref #56
This commit is contained in:
Nicolai Ort 2020-12-29 22:17:29 +01:00
parent 555e37eaf7
commit 6e121a3ce2
3 changed files with 32 additions and 5 deletions

View File

@ -30,6 +30,7 @@ export class StatsController {
"total_scans": scans.filter(scan => { scan.valid === true }).length,
"total_distance": runners.reduce((sum, current) => sum + current.distance, 0),
"total_donation_amount": donations.reduce((sum, current) => sum + current.amount, 0),
"average_distance": runners.reduce((sum, current) => sum + current.distance, 0) / runners.length,
};
}
@ -37,8 +38,7 @@ export class StatsController {
@UseBefore(StatsAuth)
@OpenAPI({ description: "Returns the top ten runners by distance.", security: [{ "StatsApiToken": [] }] })
async getTopRunnersByDistance() {
let connection = getConnection();
let runners = await connection.getRepository(Runner).find({ relations: ["scans"] });
let runners = await getConnection().getRepository(Runner).find({ relations: ["scans"] });
return runners.sort((runner1, runner2) => runner1.distance - runner2.distance).slice(0, 9);
}
@ -46,21 +46,24 @@ export class StatsController {
@UseBefore(StatsAuth)
@OpenAPI({ description: "Returns the top ten runners by donations.", security: [{ "StatsApiToken": [] }] })
async getTopRunnersByDonations() {
throw new Error("Not implemented yet.")
let runners = await getConnection().getRepository(Runner).find({ relations: ["scans", "distanceDonations"] });
return runners.sort((runner1, runner2) => runner1.distanceDonationAmount - runner2.distanceDonationAmount).slice(0, 9);
}
@Get("/teams/distance")
@UseBefore(StatsAuth)
@OpenAPI({ description: "Returns the top ten teams by distance.", security: [{ "StatsApiToken": [] }] })
async getTopTeamsByDistance() {
throw new Error("Not implemented yet.")
let teams = await getConnection().getRepository(RunnerTeam).find({ relations: ["runners", "runners.scans"] });
return teams.sort((team1, team2) => team1.distance - team2.distance).slice(0, 9);
}
@Get("/teams/donations")
@UseBefore(StatsAuth)
@OpenAPI({ description: "Returns the top ten teams by donations.", security: [{ "StatsApiToken": [] }] })
async getTopTeamsByDonations() {
throw new Error("Not implemented yet.")
let teams = await getConnection().getRepository(RunnerTeam).find({ relations: ["runners", "runners.scans", "runners.distanceDonations"] });
return teams.sort((team1, team2) => team1.distanceDonationAmount - team2.distanceDonationAmount).slice(0, 9);
}
@Get("/organisations/distance")

View File

@ -58,4 +58,12 @@ export class Runner extends Participant {
public get distance(): number {
return this.validScans.reduce((sum, current) => sum + current.distance, 0);
}
/**
* Returns the total donations a runner has collected based on his linked donations and distance ran.
*/
@IsInt()
public get distanceDonationAmount(): number {
return this.distanceDonations.reduce((sum, current) => sum + current.amountPerDistance, 0) * this.distance;
}
}

View File

@ -44,4 +44,20 @@ export abstract class RunnerGroup {
*/
@OneToMany(() => Runner, runner => runner.group, { nullable: true })
runners: Runner[];
/**
* Returns the total distance ran by this group's runners based on all their valid scans.
*/
@IsInt()
public get distance(): number {
return this.runners.reduce((sum, current) => sum + current.distance, 0);
}
/**
* Returns the total donations a runner has collected based on his linked donations and distance ran.
*/
@IsInt()
public get distanceDonationAmount(): number {
return this.runners.reduce((sum, current) => sum + current.distanceDonationAmount, 0);
}
}