parent
53a01ad977
commit
5d31d8d1a2
|
@ -9,6 +9,7 @@ import { RunnerTeam } from '../models/entities/RunnerTeam';
|
||||||
import { Scan } from '../models/entities/Scan';
|
import { Scan } from '../models/entities/Scan';
|
||||||
import { User } from '../models/entities/User';
|
import { User } from '../models/entities/User';
|
||||||
import { ResponseStats } from '../models/responses/ResponseStats';
|
import { ResponseStats } from '../models/responses/ResponseStats';
|
||||||
|
import { ResponseStatsOrgnisation } from '../models/responses/ResponseStatsOrganisation';
|
||||||
import { ResponseStatsRunner } from '../models/responses/ResponseStatsRunner';
|
import { ResponseStatsRunner } from '../models/responses/ResponseStatsRunner';
|
||||||
import { ResponseStatsTeam } from '../models/responses/ResponseStatsTeam';
|
import { ResponseStatsTeam } from '../models/responses/ResponseStatsTeam';
|
||||||
|
|
||||||
|
@ -57,6 +58,14 @@ export class StatsController {
|
||||||
return responseRunners;
|
return responseRunners;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Get("/scans")
|
||||||
|
@UseBefore(StatsAuth)
|
||||||
|
@ResponseSchema(ResponseStatsRunner, { isArray: true })
|
||||||
|
@OpenAPI({ description: "Returns the top ten fastest track times (with their runner and the runner's group).", security: [{ "StatsApiToken": [] }] })
|
||||||
|
async getTopRunnersByTrackTime() {
|
||||||
|
throw new Error("Not implemented yet.")
|
||||||
|
}
|
||||||
|
|
||||||
@Get("/teams/distance")
|
@Get("/teams/distance")
|
||||||
@UseBefore(StatsAuth)
|
@UseBefore(StatsAuth)
|
||||||
@ResponseSchema(ResponseStatsTeam, { isArray: true })
|
@ResponseSchema(ResponseStatsTeam, { isArray: true })
|
||||||
|
@ -89,13 +98,25 @@ export class StatsController {
|
||||||
@UseBefore(StatsAuth)
|
@UseBefore(StatsAuth)
|
||||||
@OpenAPI({ description: "Returns the top ten organisations by distance.", security: [{ "StatsApiToken": [] }] })
|
@OpenAPI({ description: "Returns the top ten organisations by distance.", security: [{ "StatsApiToken": [] }] })
|
||||||
async getTopOrgsByDistance() {
|
async getTopOrgsByDistance() {
|
||||||
throw new Error("Not implemented yet.")
|
let orgs = await getConnection().getRepository(RunnerOrganisation).find({ relations: ['runners', 'runners.scans', 'runners.distanceDonations', 'runners.scans.track', 'teams', 'teams.runners', 'teams.runners.scans', 'teams.runners.distanceDonations', 'teams.runners.scans.track'] });
|
||||||
|
let topOrgs = orgs.sort((org1, org2) => org1.distance - org2.distance).slice(0, 9);
|
||||||
|
let responseOrgs: ResponseStatsOrgnisation[] = new Array<ResponseStatsOrgnisation>();
|
||||||
|
topOrgs.forEach(org => {
|
||||||
|
responseOrgs.push(new ResponseStatsOrgnisation(org));
|
||||||
|
});
|
||||||
|
return responseOrgs;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Get("/organisations/donations")
|
@Get("/organisations/donations")
|
||||||
@UseBefore(StatsAuth)
|
@UseBefore(StatsAuth)
|
||||||
@OpenAPI({ description: "Returns the top ten organisations by donations.", security: [{ "StatsApiToken": [] }] })
|
@OpenAPI({ description: "Returns the top ten organisations by donations.", security: [{ "StatsApiToken": [] }] })
|
||||||
async getTopOrgsByDonations() {
|
async getTopOrgsByDonations() {
|
||||||
throw new Error("Not implemented yet.")
|
let orgs = await getConnection().getRepository(RunnerOrganisation).find({ relations: ['runners', 'runners.scans', 'runners.distanceDonations', 'runners.scans.track', 'teams', 'teams.runners', 'teams.runners.scans', 'teams.runners.distanceDonations', 'teams.runners.scans.track'] });
|
||||||
|
let topOrgs = orgs.sort((org1, org2) => org1.distanceDonationAmount - org2.distanceDonationAmount).slice(0, 9);
|
||||||
|
let responseOrgs: ResponseStatsOrgnisation[] = new Array<ResponseStatsOrgnisation>();
|
||||||
|
topOrgs.forEach(org => {
|
||||||
|
responseOrgs.push(new ResponseStatsOrgnisation(org));
|
||||||
|
});
|
||||||
|
return responseOrgs;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,6 +1,7 @@
|
||||||
import { IsOptional } from "class-validator";
|
import { IsInt, IsOptional } from "class-validator";
|
||||||
import { ChildEntity, ManyToOne, OneToMany } from "typeorm";
|
import { ChildEntity, ManyToOne, OneToMany } from "typeorm";
|
||||||
import { Address } from "./Address";
|
import { Address } from "./Address";
|
||||||
|
import { Runner } from './Runner';
|
||||||
import { RunnerGroup } from "./RunnerGroup";
|
import { RunnerGroup } from "./RunnerGroup";
|
||||||
import { RunnerTeam } from "./RunnerTeam";
|
import { RunnerTeam } from "./RunnerTeam";
|
||||||
|
|
||||||
|
@ -24,4 +25,32 @@ export class RunnerOrganisation extends RunnerGroup {
|
||||||
*/
|
*/
|
||||||
@OneToMany(() => RunnerTeam, team => team.parentGroup, { nullable: true })
|
@OneToMany(() => RunnerTeam, team => team.parentGroup, { nullable: true })
|
||||||
teams: RunnerTeam[];
|
teams: RunnerTeam[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all runners associated with this organisation (directly or indirectly via teams).
|
||||||
|
*/
|
||||||
|
public get allRunners(): Runner[] {
|
||||||
|
let returnRunners: Runner[] = new Array<Runner>();
|
||||||
|
returnRunners.push(...this.runners);
|
||||||
|
for (let team of this.teams) {
|
||||||
|
returnRunners.push(...team.runners)
|
||||||
|
}
|
||||||
|
return returnRunners;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the total distance ran by this group's runners based on all their valid scans.
|
||||||
|
*/
|
||||||
|
@IsInt()
|
||||||
|
public get distance(): number {
|
||||||
|
return this.allRunners.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.allRunners.reduce((sum, current) => sum + current.distanceDonationAmount, 0);
|
||||||
|
}
|
||||||
}
|
}
|
47
src/models/responses/ResponseStatsOrganisation.ts
Normal file
47
src/models/responses/ResponseStatsOrganisation.ts
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
import {
|
||||||
|
IsInt,
|
||||||
|
|
||||||
|
IsString
|
||||||
|
} from "class-validator";
|
||||||
|
import { RunnerOrganisation } from '../entities/RunnerOrganisation';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the org stats response.
|
||||||
|
* This differs from the normal org responce.
|
||||||
|
*/
|
||||||
|
export class ResponseStatsOrgnisation {
|
||||||
|
/**
|
||||||
|
* The orgs's id.
|
||||||
|
*/
|
||||||
|
@IsInt()
|
||||||
|
id: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The orgs's name.
|
||||||
|
*/
|
||||||
|
@IsString()
|
||||||
|
name: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The orgs's runner's currently ran distance in meters.
|
||||||
|
*/
|
||||||
|
@IsInt()
|
||||||
|
distance: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The orgs's currently collected donations.
|
||||||
|
*/
|
||||||
|
@IsInt()
|
||||||
|
donationAmount: number;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a ResponseRunner object from a runner.
|
||||||
|
* @param runner The user the response shall be build for.
|
||||||
|
*/
|
||||||
|
public constructor(org: RunnerOrganisation) {
|
||||||
|
this.name = org.name;
|
||||||
|
this.id = org.id;
|
||||||
|
this.distance = org.distance;
|
||||||
|
this.donationAmount = org.distanceDonationAmount;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user