diff --git a/src/controllers/ScanController.ts b/src/controllers/ScanController.ts index b7aa72f..09833dc 100644 --- a/src/controllers/ScanController.ts +++ b/src/controllers/ScanController.ts @@ -1,6 +1,6 @@ import { Authorized, Body, Delete, Get, JsonController, OnUndefined, Param, Post, Put, QueryParam, UseBefore } from 'routing-controllers'; import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi'; -import { getConnectionManager, Repository } from 'typeorm'; +import { getConnection, getConnectionManager, Repository } from 'typeorm'; import { RunnerNotFoundError } from '../errors/RunnerErrors'; import { ScanIdsNotMatchingError, ScanNotFoundError } from '../errors/ScanErrors'; import ScanAuth from '../middlewares/ScanAuth'; @@ -8,6 +8,7 @@ import { CreateScan } from '../models/actions/CreateScan'; import { CreateTrackScan } from '../models/actions/CreateTrackScan'; import { UpdateScan } from '../models/actions/UpdateScan'; import { Scan } from '../models/entities/Scan'; +import { TrackScan } from '../models/entities/TrackScan'; import { ResponseEmpty } from '../models/responses/ResponseEmpty'; import { ResponseScan } from '../models/responses/ResponseScan'; import { ResponseTrackScan } from '../models/responses/ResponseTrackScan'; @@ -31,7 +32,7 @@ export class ScanController { @OpenAPI({ description: 'Lists all scans (normal or track) from all runners.
This includes the scan\'s runner\'s distance ran.' }) async getAll() { let responseScans: ResponseScan[] = new Array(); - const scans = await this.scanRepository.find({ relations: ['runner', 'runner.scans', 'runner.scans.track'] }); + const scans = await this.scanRepository.find({ relations: ['runner', 'track', 'runner.scans', 'runner.scans.track', 'card', 'station'] }); scans.forEach(scan => { responseScans.push(scan.toResponse()); }); @@ -46,7 +47,7 @@ export class ScanController { @OnUndefined(ScanNotFoundError) @OpenAPI({ description: 'Lists all information about the scan whose id got provided. This includes the scan\'s runner\'s distance ran.' }) async getOne(@Param('id') id: number) { - let scan = await this.scanRepository.findOne({ id: id }, { relations: ['runner', 'runner.scans', 'runner.scans.track'] }) + let scan = await this.scanRepository.findOne({ id: id }, { relations: ['runner', 'track', 'runner.scans', 'runner.scans.track', 'card', 'station'] }) if (!scan) { throw new ScanNotFoundError(); } return scan.toResponse(); } @@ -59,7 +60,7 @@ export class ScanController { async post(@Body({ validate: true }) createScan: CreateScan) { let scan = await createScan.toScan(); scan = await this.scanRepository.save(scan); - return (await this.scanRepository.findOne({ id: scan.id }, { relations: ['runner', 'runner.scans', 'runner.scans.track'] })).toResponse(); + return (await this.scanRepository.findOne({ id: scan.id }, { relations: ['runner', 'track', 'runner.scans', 'runner.scans.track', 'card', 'station'] })).toResponse(); } @Post("/trackscans") @@ -69,8 +70,8 @@ export class ScanController { @OpenAPI({ description: 'Create a new track scan.
This is just a alias for posting /scans', security: [{ "ScanApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) async postTrackScans(@Body({ validate: true }) createScan: CreateTrackScan) { let scan = await createScan.toScan(); - scan = await this.scanRepository.save(scan); - return (await this.scanRepository.findOne({ id: scan.id }, { relations: ['runner', 'track', 'runner.scans', 'runner.scans.track'] })).toResponse(); + scan = await getConnection().getRepository(TrackScan).save(scan); + return (await this.scanRepository.findOne({ id: scan.id }, { relations: ['runner', 'track', 'runner.scans', 'runner.scans.track', 'card', 'station'] })).toResponse(); } @Put('/:id') @@ -92,7 +93,7 @@ export class ScanController { } await this.scanRepository.save(await scan.updateScan(oldScan)); - return (await this.scanRepository.findOne({ id: id }, { relations: ['runner'] })).toResponse(); + return (await this.scanRepository.findOne({ id: id }, { relations: ['runner', 'track', 'runner.scans', 'runner.scans.track', 'card', 'station'] })).toResponse(); } @Delete('/:id') @@ -104,7 +105,7 @@ export class ScanController { async remove(@Param("id") id: number, @QueryParam("force") force: boolean) { let scan = await this.scanRepository.findOne({ id: id }); if (!scan) { return null; } - const responseScan = await this.scanRepository.findOne({ id: scan.id }, { relations: ["runner"] }); + const responseScan = await this.scanRepository.findOne({ id: scan.id }, { relations: ['runner', 'track', 'runner.scans', 'runner.scans.track', 'card', 'station'] }); await this.scanRepository.delete(scan); return responseScan.toResponse(); diff --git a/src/models/actions/CreateTrackScan.ts b/src/models/actions/CreateTrackScan.ts index 2303352..44877f0 100644 --- a/src/models/actions/CreateTrackScan.ts +++ b/src/models/actions/CreateTrackScan.ts @@ -1,35 +1,28 @@ -import { IsNotEmpty } from 'class-validator'; +import { IsInt, IsPositive } from 'class-validator'; import { getConnection } from 'typeorm'; import { RunnerNotFoundError } from '../../errors/RunnerErrors'; import { RunnerCard } from '../entities/RunnerCard'; import { ScanStation } from '../entities/ScanStation'; import { TrackScan } from '../entities/TrackScan'; -import { CreateScan } from './CreateScan'; /** * This classed is used to create a new Scan entity from a json body (post request). */ -export class CreateTrackScan extends CreateScan { - - /** - * The scan's associated track. - * This is used to determine the scan's distance. - */ - @IsNotEmpty() - track: number; - +export class CreateTrackScan { /** * The runnerCard associated with the scan. * This get's saved for documentation and management purposes. */ - @IsNotEmpty() + @IsInt() + @IsPositive() card: number; /** * The scanning station that created the scan. * Mainly used for logging and traceing back scans (or errors) */ - @IsNotEmpty() + @IsInt() + @IsPositive() station: number; /** diff --git a/src/models/responses/ResponseTrackScan.ts b/src/models/responses/ResponseTrackScan.ts index 724a8fd..dba450c 100644 --- a/src/models/responses/ResponseTrackScan.ts +++ b/src/models/responses/ResponseTrackScan.ts @@ -1,8 +1,8 @@ import { IsDateString, IsNotEmpty } from "class-validator"; -import { RunnerCard } from '../entities/RunnerCard'; -import { ScanStation } from '../entities/ScanStation'; import { TrackScan } from '../entities/TrackScan'; +import { ResponseRunnerCard } from './ResponseRunnerCard'; import { ResponseScan } from './ResponseScan'; +import { ResponseScanStation } from './ResponseScanStation'; import { ResponseTrack } from './ResponseTrack'; /** @@ -19,13 +19,13 @@ export class ResponseTrackScan extends ResponseScan { * The runnerCard associated with the scan. */ @IsNotEmpty() - card: RunnerCard; + card: ResponseRunnerCard; /** * The scanning station that created the scan. */ @IsNotEmpty() - station: ScanStation; + station: ResponseScanStation; /** * The scan's creation timestamp. @@ -41,8 +41,9 @@ export class ResponseTrackScan extends ResponseScan { public constructor(scan: TrackScan) { super(scan); this.track = new ResponseTrack(scan.track); - this.card = scan.card; - this.station = scan.station; + this.card = scan.card.toResponse(); + this.station = scan.station.toResponse(); this.timestamp = scan.timestamp; + this.distance = scan.distance; } }