108 lines
5.4 KiB
TypeScript
108 lines
5.4 KiB
TypeScript
import { Get, JsonController, UseBefore } from 'routing-controllers';
|
|
import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi';
|
|
import { getConnection } from 'typeorm';
|
|
import StatsAuth from '../middlewares/StatsAuth';
|
|
import { Donation } from '../models/entities/Donation';
|
|
import { Runner } from '../models/entities/Runner';
|
|
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';
|
|
import { ResponseStatsTeam } from '../models/responses/ResponseStatsTeam';
|
|
|
|
@JsonController('/stats')
|
|
export class StatsController {
|
|
|
|
@Get()
|
|
@OpenAPI({ description: "A very basic stats endpoint providing basic counters for a dashboard or simmilar" })
|
|
async get() {
|
|
let connection = getConnection();
|
|
let runners = await connection.getRepository(Runner).find({ relations: ["scans"] });
|
|
let teams = await connection.getRepository(RunnerTeam).find();
|
|
let orgs = await connection.getRepository(RunnerOrganisation).find();
|
|
let users = await connection.getRepository(User).find();
|
|
let scans = await connection.getRepository(Scan).find();
|
|
let donations = await connection.getRepository(Donation).find({ relations: ["runner", "runner.scans"] });
|
|
return {
|
|
"total_runners": runners.length,
|
|
"total_teams": teams.length,
|
|
"total_orgs": orgs.length,
|
|
"total_users": users.length,
|
|
"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,
|
|
};
|
|
}
|
|
|
|
@Get("/runners/distance")
|
|
@UseBefore(StatsAuth)
|
|
@ResponseSchema(ResponseStatsRunner, { isArray: true })
|
|
@OpenAPI({ description: "Returns the top ten runners by distance.", security: [{ "StatsApiToken": [] }] })
|
|
async getTopRunnersByDistance() {
|
|
let runners = await getConnection().getRepository(Runner).find({ relations: ['scans', 'group', 'distanceDonations'] });
|
|
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)
|
|
@ResponseSchema(ResponseStatsRunner, { isArray: true })
|
|
@OpenAPI({ description: "Returns the top ten runners by donations.", security: [{ "StatsApiToken": [] }] })
|
|
async getTopRunnersByDonations() {
|
|
let runners = await getConnection().getRepository(Runner).find({ relations: ['scans', 'group', 'distanceDonations'] });
|
|
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")
|
|
@UseBefore(StatsAuth)
|
|
@ResponseSchema(ResponseStatsTeam, { isArray: true })
|
|
@OpenAPI({ description: "Returns the top ten teams by distance.", security: [{ "StatsApiToken": [] }] })
|
|
async getTopTeamsByDistance() {
|
|
let teams = await getConnection().getRepository(RunnerTeam).find({ relations: ["runners", "runners.scans"] });
|
|
let topTeams = teams.sort((team1, team2) => team1.distance - team2.distance).slice(0, 9);
|
|
let responseTeams: ResponseStatsTeam[] = new Array<ResponseStatsTeam>();
|
|
topTeams.forEach(team => {
|
|
responseTeams.push(new ResponseStatsTeam(team));
|
|
});
|
|
return responseTeams;
|
|
}
|
|
|
|
@Get("/teams/donations")
|
|
@UseBefore(StatsAuth)
|
|
@ResponseSchema(ResponseStatsTeam, { isArray: true })
|
|
@OpenAPI({ description: "Returns the top ten teams by donations.", security: [{ "StatsApiToken": [] }] })
|
|
async getTopTeamsByDonations() {
|
|
let teams = await getConnection().getRepository(RunnerTeam).find({ relations: ["runners", "runners.scans", "runners.distanceDonations"] });
|
|
let topTeams = teams.sort((team1, team2) => team1.distanceDonationAmount - team2.distanceDonationAmount).slice(0, 9);
|
|
let responseTeams: ResponseStatsTeam[] = new Array<ResponseStatsTeam>();
|
|
topTeams.forEach(team => {
|
|
responseTeams.push(new ResponseStatsTeam(team));
|
|
});
|
|
return responseTeams;
|
|
}
|
|
|
|
@Get("/organisations/distance")
|
|
@UseBefore(StatsAuth)
|
|
@OpenAPI({ description: "Returns the top ten organisations by distance.", security: [{ "StatsApiToken": [] }] })
|
|
async getTopOrgsByDistance() {
|
|
throw new Error("Not implemented yet.")
|
|
}
|
|
|
|
@Get("/organisations/donations")
|
|
@UseBefore(StatsAuth)
|
|
@OpenAPI({ description: "Returns the top ten organisations by donations.", security: [{ "StatsApiToken": [] }] })
|
|
async getTopOrgsByDonations() {
|
|
throw new Error("Not implemented yet.")
|
|
}
|
|
} |