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'; @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'] }); let topRunners = runners.sort((runner1, runner2) => runner1.distance - runner2.distance).slice(0, 9); let responseRunners: ResponseStatsRunner[] = new Array(); 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", "distanceDonations", 'group'] }); let topRunners = runners.sort((runner1, runner2) => runner1.distanceDonationAmount - runner2.distanceDonationAmount).slice(0, 9); let responseRunners: ResponseStatsRunner[] = new Array(); topRunners.forEach(runner => { responseRunners.push(new ResponseStatsRunner(runner)); }); return responseRunners; } @Get("/teams/distance") @UseBefore(StatsAuth) @OpenAPI({ description: "Returns the top ten teams by distance.", security: [{ "StatsApiToken": [] }] }) async getTopTeamsByDistance() { 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() { 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") @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.") } }