import { IsInt, IsObject, IsOptional, IsString } from "class-validator"; import { Runner } from '../entities/Runner'; import { ResponseObjectType } from '../enums/ResponseObjectType'; import { IResponse } from './IResponse'; import { ResponseRunnerGroup } from './ResponseRunnerGroup'; /** * Defines the runner stats response. * This differs from the normal runner responce. */ export class ResponseStatsRunner implements IResponse { /** * The responseType. * This contains the type of class/entity this response contains. */ responseType: ResponseObjectType = ResponseObjectType.STATSRUNNER; /** * The runner's id. */ @IsInt() id: number; /** * The runner's first name. */ @IsString() firstname: string; /** * The runner's middle name. */ @IsString() middlename?: string; /** * The runner's last name. */ @IsString() lastname: string; /** * The runner's currently ran distance in meters. */ @IsInt() distance: number; /** * The runner's currently collected donations. */ @IsInt() donationAmount: number; /** * The runner's fastest laptime in seconds. */ @IsInt() @IsOptional() minLaptime?: number; /** * The runner's group. */ @IsObject() group: ResponseRunnerGroup; /** * Creates a new runner stats response from a runner * @param runner The runner whoes response shall be generated - the following relations have to be resolved: scans, group, distanceDonations, scans.track */ public constructor(runner: Runner, laptime?: number) { this.id = runner.id; this.firstname = runner.firstname; if (runner.firstname) { this.middlename = runner.middlename; } this.lastname = runner.lastname; try { this.distance = runner.distance; } catch { this.distance = -1; } try { this.donationAmount = runner.distanceDonationAmount; } catch { this.donationAmount = -1; } if (laptime) { this.minLaptime = laptime; } this.group = runner.group.toResponse(); } }