Merge pull request 'Bugfixes for trackscans feature/160-responseTrackScan_total_distance' (#161) from feature/160-responseTrackScan_total_distance into dev
Some checks failed
continuous-integration/drone/push Build is failing
Some checks failed
continuous-integration/drone/push Build is failing
Reviewed-on: #161
This commit is contained in:
commit
3d3790c2eb
@ -67,7 +67,7 @@ export class RunnerSelfServiceController {
|
|||||||
@ResponseSchema(ResponseScanStation)
|
@ResponseSchema(ResponseScanStation)
|
||||||
@ResponseSchema(ScanStationNotFoundError, { statusCode: 404 })
|
@ResponseSchema(ScanStationNotFoundError, { statusCode: 404 })
|
||||||
@OnUndefined(ScanStationNotFoundError)
|
@OnUndefined(ScanStationNotFoundError)
|
||||||
@OpenAPI({ description: 'Lists basic information about the station whose token got provided. <br> This includes it\'s associated track.', security: [{ "ScanApiToken": [] }] })
|
@OpenAPI({ description: 'Lists basic information about the station whose token got provided. <br> This includes it\'s associated track.', security: [{ "StationApiToken": [] }] })
|
||||||
async getStationMe(@Req() req: Request) {
|
async getStationMe(@Req() req: Request) {
|
||||||
let scan = await this.stationRepository.findOne({ id: parseInt(req.headers["station_id"].toString()) }, { relations: ['track'] })
|
let scan = await this.stationRepository.findOne({ id: parseInt(req.headers["station_id"].toString()) }, { relations: ['track'] })
|
||||||
if (!scan) { throw new ScanStationNotFoundError(); }
|
if (!scan) { throw new ScanStationNotFoundError(); }
|
||||||
@ -77,7 +77,7 @@ export class RunnerSelfServiceController {
|
|||||||
@Post('/runners/forgot')
|
@Post('/runners/forgot')
|
||||||
@ResponseSchema(RunnerNotFoundError, { statusCode: 404 })
|
@ResponseSchema(RunnerNotFoundError, { statusCode: 404 })
|
||||||
@OnUndefined(ResponseEmpty)
|
@OnUndefined(ResponseEmpty)
|
||||||
@OpenAPI({ description: 'TODO' })
|
@OpenAPI({ description: 'Use this endpoint to reuqest a new selfservice token/link to be sent to your mail address (rate limited to one mail every 24hrs).' })
|
||||||
async requestNewToken(@QueryParam('mail') mail: string) {
|
async requestNewToken(@QueryParam('mail') mail: string) {
|
||||||
if (!mail) {
|
if (!mail) {
|
||||||
throw new RunnerNotFoundError();
|
throw new RunnerNotFoundError();
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import { Authorized, Body, Delete, Get, JsonController, OnUndefined, Param, Post, Put, QueryParam, UseBefore } from 'routing-controllers';
|
import { Request } from "express";
|
||||||
|
import { Authorized, Body, Delete, Get, JsonController, OnUndefined, Param, Post, Put, QueryParam, Req, UseBefore } from 'routing-controllers';
|
||||||
import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi';
|
import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi';
|
||||||
import { getConnectionManager, Repository } from 'typeorm';
|
import { getConnectionManager, Repository } from 'typeorm';
|
||||||
import { RunnerNotFoundError } from '../errors/RunnerErrors';
|
import { RunnerNotFoundError } from '../errors/RunnerErrors';
|
||||||
@ -14,7 +15,6 @@ import { TrackScan } from '../models/entities/TrackScan';
|
|||||||
import { ResponseEmpty } from '../models/responses/ResponseEmpty';
|
import { ResponseEmpty } from '../models/responses/ResponseEmpty';
|
||||||
import { ResponseScan } from '../models/responses/ResponseScan';
|
import { ResponseScan } from '../models/responses/ResponseScan';
|
||||||
import { ResponseTrackScan } from '../models/responses/ResponseTrackScan';
|
import { ResponseTrackScan } from '../models/responses/ResponseTrackScan';
|
||||||
|
|
||||||
@JsonController('/scans')
|
@JsonController('/scans')
|
||||||
@OpenAPI({ security: [{ "AuthToken": [] }, { "RefreshTokenCookie": [] }] })
|
@OpenAPI({ security: [{ "AuthToken": [] }, { "RefreshTokenCookie": [] }] })
|
||||||
export class ScanController {
|
export class ScanController {
|
||||||
@ -60,7 +60,7 @@ export class ScanController {
|
|||||||
@UseBefore(ScanAuth)
|
@UseBefore(ScanAuth)
|
||||||
@ResponseSchema(ResponseScan)
|
@ResponseSchema(ResponseScan)
|
||||||
@ResponseSchema(RunnerNotFoundError, { statusCode: 404 })
|
@ResponseSchema(RunnerNotFoundError, { statusCode: 404 })
|
||||||
@OpenAPI({ description: 'Create a new scan (not track scan - use /scans/trackscans instead). <br> Please rmemember to provide the scan\'s runner\'s id and distance.', security: [{ "ScanApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] })
|
@OpenAPI({ description: 'Create a new scan (not track scan - use /scans/trackscans instead). <br> Please rmemember to provide the scan\'s runner\'s id and distance.', security: [{ "StationApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] })
|
||||||
async post(@Body({ validate: true }) createScan: CreateScan) {
|
async post(@Body({ validate: true }) createScan: CreateScan) {
|
||||||
let scan = await createScan.toEntity();
|
let scan = await createScan.toEntity();
|
||||||
scan = await this.scanRepository.save(scan);
|
scan = await this.scanRepository.save(scan);
|
||||||
@ -71,8 +71,12 @@ export class ScanController {
|
|||||||
@UseBefore(ScanAuth)
|
@UseBefore(ScanAuth)
|
||||||
@ResponseSchema(ResponseTrackScan)
|
@ResponseSchema(ResponseTrackScan)
|
||||||
@ResponseSchema(RunnerNotFoundError, { statusCode: 404 })
|
@ResponseSchema(RunnerNotFoundError, { statusCode: 404 })
|
||||||
@OpenAPI({ description: 'Create a new track scan (for "normal" scans use /scans instead). <br> Please remember that to provide the scan\'s card\'s station\'s id.', security: [{ "ScanApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] })
|
@OpenAPI({ description: 'Create a new track scan (for "normal" scans use /scans instead). <br> Please remember that to provide the scan\'s card\'s station\'s id.', security: [{ "StationApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] })
|
||||||
async postTrackScans(@Body({ validate: true }) createScan: CreateTrackScan) {
|
async postTrackScans(@Body({ validate: true }) createScan: CreateTrackScan, @Req() req: Request) {
|
||||||
|
const station_id = req.headers["station_id"];
|
||||||
|
if (station_id) {
|
||||||
|
createScan.station = parseInt(station_id.toString());
|
||||||
|
}
|
||||||
let scan = await createScan.toEntity();
|
let scan = await createScan.toEntity();
|
||||||
scan = await this.trackScanRepository.save(scan);
|
scan = await this.trackScanRepository.save(scan);
|
||||||
return (await this.scanRepository.findOne({ id: scan.id }, { relations: ['runner', 'track', 'runner.scans', 'runner.group', 'runner.scans.track', 'card', 'station'] })).toResponse();
|
return (await this.scanRepository.findOne({ id: scan.id }, { relations: ['runner', 'track', 'runner.scans', 'runner.group', 'runner.scans.track', 'card', 'station'] })).toResponse();
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import { IsInt, IsPositive } from 'class-validator';
|
import { IsInt, IsOptional, IsPositive } from 'class-validator';
|
||||||
|
import { BadRequestError } from 'routing-controllers';
|
||||||
import { getConnection } from 'typeorm';
|
import { getConnection } from 'typeorm';
|
||||||
import { RunnerCardNotFoundError } from '../../../errors/RunnerCardErrors';
|
import { RunnerCardNotFoundError } from '../../../errors/RunnerCardErrors';
|
||||||
import { RunnerNotFoundError } from '../../../errors/RunnerErrors';
|
import { RunnerNotFoundError } from '../../../errors/RunnerErrors';
|
||||||
@ -22,10 +23,12 @@ export class CreateTrackScan {
|
|||||||
/**
|
/**
|
||||||
* The scanning station's id that created the scan.
|
* The scanning station's id that created the scan.
|
||||||
* Mainly used for logging and traceing back scans (or errors).
|
* Mainly used for logging and traceing back scans (or errors).
|
||||||
|
* You don't have to provide the station if you're authenticateing via a scanstation token (The server takes care of it for you).
|
||||||
*/
|
*/
|
||||||
@IsInt()
|
@IsInt()
|
||||||
@IsPositive()
|
@IsPositive()
|
||||||
station: number;
|
@IsOptional()
|
||||||
|
station?: number;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new Track entity from this.
|
* Creates a new Track entity from this.
|
||||||
@ -44,12 +47,15 @@ export class CreateTrackScan {
|
|||||||
}
|
}
|
||||||
|
|
||||||
newScan.timestamp = Math.round(new Date().getTime() / 1000);
|
newScan.timestamp = Math.round(new Date().getTime() / 1000);
|
||||||
newScan.lapTime = await this.getLaptime(newScan)
|
newScan = await this.validateScan(newScan);
|
||||||
newScan.valid = await this.validateScan(newScan);
|
|
||||||
|
|
||||||
return newScan;
|
return newScan;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get's a runnerCard entity via the provided id.
|
||||||
|
* @returns The runnerCard whom's id you provided.
|
||||||
|
*/
|
||||||
public async getCard(): Promise<RunnerCard> {
|
public async getCard(): Promise<RunnerCard> {
|
||||||
const track = await getConnection().getRepository(RunnerCard).findOne({ id: this.card }, { relations: ["runner"] });
|
const track = await getConnection().getRepository(RunnerCard).findOne({ id: this.card }, { relations: ["runner"] });
|
||||||
if (!track) {
|
if (!track) {
|
||||||
@ -58,7 +64,14 @@ export class CreateTrackScan {
|
|||||||
return track;
|
return track;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get's a scanstation entity via the provided id.
|
||||||
|
* @returns The scanstation whom's id you provided.
|
||||||
|
*/
|
||||||
public async getStation(): Promise<ScanStation> {
|
public async getStation(): Promise<ScanStation> {
|
||||||
|
if (!this.station) {
|
||||||
|
throw new BadRequestError("You are missing the station's id!")
|
||||||
|
}
|
||||||
const station = await getConnection().getRepository(ScanStation).findOne({ id: this.station }, { relations: ["track"] });
|
const station = await getConnection().getRepository(ScanStation).findOne({ id: this.station }, { relations: ["track"] });
|
||||||
if (!station) {
|
if (!station) {
|
||||||
throw new ScanStationNotFoundError();
|
throw new ScanStationNotFoundError();
|
||||||
@ -66,15 +79,22 @@ export class CreateTrackScan {
|
|||||||
return station;
|
return station;
|
||||||
}
|
}
|
||||||
|
|
||||||
public validateScan(scan: TrackScan): boolean {
|
/**
|
||||||
return (scan.lapTime > scan.track.minimumLapTime);
|
* Validates the scan and sets it's lap time;
|
||||||
}
|
* @param scan The scan you want to validate
|
||||||
|
* @returns The validated scan with it's laptime set.
|
||||||
public async getLaptime(scan: TrackScan): Promise<number> {
|
*/
|
||||||
|
public async validateScan(scan: TrackScan): Promise<TrackScan> {
|
||||||
const scans = await getConnection().getRepository(TrackScan).find({ where: { runner: scan.runner, valid: true }, relations: ["track"] });
|
const scans = await getConnection().getRepository(TrackScan).find({ where: { runner: scan.runner, valid: true }, relations: ["track"] });
|
||||||
if (scans.length == 0) { return 0; }
|
if (scans.length == 0) {
|
||||||
|
scan.lapTime = 0;
|
||||||
|
scan.valid = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
const newestScan = scans[scans.length - 1];
|
const newestScan = scans[scans.length - 1];
|
||||||
return (scan.timestamp - newestScan.timestamp);
|
scan.lapTime = scan.timestamp - newestScan.timestamp;
|
||||||
|
scan.valid = (scan.lapTime > scan.track.minimumLapTime);
|
||||||
|
}
|
||||||
|
return scan;
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user