diff --git a/src/controllers/StatsController.ts b/src/controllers/StatsController.ts index 9d147c0..5df9126 100644 --- a/src/controllers/StatsController.ts +++ b/src/controllers/StatsController.ts @@ -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") diff --git a/src/models/entities/Runner.ts b/src/models/entities/Runner.ts index def167d..1c509d6 100644 --- a/src/models/entities/Runner.ts +++ b/src/models/entities/Runner.ts @@ -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; + } } \ No newline at end of file diff --git a/src/models/entities/RunnerGroup.ts b/src/models/entities/RunnerGroup.ts index 4256f6e..b5bcfcd 100644 --- a/src/models/entities/RunnerGroup.ts +++ b/src/models/entities/RunnerGroup.ts @@ -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); + } } \ No newline at end of file