From 581ca5ff6c67ed1c701c06532671441293ee0706 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Fri, 29 Jan 2021 16:45:23 +0100 Subject: [PATCH 1/8] Added Responseobjecttype enum ref #132 --- src/models/enums/ResponseObjectType.ts | 33 ++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/models/enums/ResponseObjectType.ts diff --git a/src/models/enums/ResponseObjectType.ts b/src/models/enums/ResponseObjectType.ts new file mode 100644 index 0000000..dfdf482 --- /dev/null +++ b/src/models/enums/ResponseObjectType.ts @@ -0,0 +1,33 @@ +/** + * This enum contains all object types/entities a response can contain. + */ +export enum ResponseObjectType { + AUTH = 'AUTH', + DISTANCEDONATION = 'DISTANCEDONATION', + DONATION = 'DONATION', + DONOR = 'DONOR', + EMPTY = 'EMPTY', + GROUPCONTACT = 'GROUPCONTACT', + LOGOUT = 'LOGOUT', + PARTICIPANT = 'PARTICIPANT', + PERMISSION = 'PERMISSION', + PRINCIPAL = 'PRINCIPAL', + RUNNER = 'RUNNER', + RUNNERCARD = 'RUNNERCARD', + RUNNERGROUP = 'RUNNERGROUP', + RUNNERORGANIZATION = 'RUNNERORGANIZATION', + RUNNERTEAM = 'RUNNERTEAM', + SCAN = 'SCAN', + SCANSTATION = 'SCANSTATION', + SELFSERVICEDONATION = 'SELFSERVICEDONATION', + SELFSERVICRUNNER = 'SELFSERVICRUNNER', + STATS = 'STATS', + STATSCLIENT = 'STATSCLIENT', + STATSRUNNER = 'STATSRUNNER', + STATSTEAM = 'STATSTEAM', + TRACK = 'TRACK', + TRACKSCAN = 'TRACKSCAN', + USER = 'USER', + USERGROUP = 'USERGROUP', + USERPERMISSIONS = 'USERPERMISSIONS', +} \ No newline at end of file From e44cc4c4cbecdf7c8d90f0af73fffd8b01eba61e Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Fri, 29 Jan 2021 16:49:19 +0100 Subject: [PATCH 2/8] Added a Response interface ref #132 --- src/models/responses/IResponse.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/models/responses/IResponse.ts diff --git a/src/models/responses/IResponse.ts b/src/models/responses/IResponse.ts new file mode 100644 index 0000000..c3917dd --- /dev/null +++ b/src/models/responses/IResponse.ts @@ -0,0 +1,13 @@ +import { ResponseObjectType } from '../enums/ResponseObjectType'; + +/** + * Defines the repsonse interface. + * This forces all response classes to implement the interfaces properties. +*/ +export interface IResponse { + /** + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType; +} From 9d5e486c6ddb4db87d36409fbd8bca1bf9659e9f Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Fri, 29 Jan 2021 17:06:43 +0100 Subject: [PATCH 3/8] Implemented the interface in all responses refr #132 --- src/models/responses/ResponseAuth.ts | 11 ++++++++++- src/models/responses/ResponseDistanceDonation.ts | 9 ++++++++- src/models/responses/ResponseDonation.ts | 11 ++++++++++- src/models/responses/ResponseDonor.ts | 9 ++++++++- src/models/responses/ResponseEmpty.ts | 10 +++++++++- src/models/responses/ResponseGroupContact.ts | 10 +++++++++- src/models/responses/ResponseLogout.ts | 10 +++++++++- src/models/responses/ResponseParticipant.ts | 10 +++++++++- src/models/responses/ResponsePermission.ts | 10 +++++++++- src/models/responses/ResponsePrincipal.ts | 10 +++++++++- src/models/responses/ResponseRunner.ts | 9 ++++++++- src/models/responses/ResponseRunnerCard.ts | 10 +++++++++- src/models/responses/ResponseRunnerGroup.ts | 10 +++++++++- src/models/responses/ResponseRunnerOrganization.ts | 9 ++++++++- src/models/responses/ResponseRunnerTeam.ts | 9 ++++++++- src/models/responses/ResponseScan.ts | 10 +++++++++- src/models/responses/ResponseScanStation.ts | 12 ++++++++++-- .../responses/ResponseSelfServiceDonation.ts | 10 +++++++++- src/models/responses/ResponseSelfServiceRunner.ts | 9 ++++++++- src/models/responses/ResponseStats.ts | 10 +++++++++- src/models/responses/ResponseStatsClient.ts | 10 +++++++++- src/models/responses/ResponseStatsOrganization.ts | 10 +++++++++- src/models/responses/ResponseStatsRunner.ts | 10 +++++++++- src/models/responses/ResponseStatsTeam.ts | 10 +++++++++- src/models/responses/ResponseTrack.ts | 10 +++++++++- src/models/responses/ResponseTrackScan.ts | 14 +++++++++++--- src/models/responses/ResponseUser.ts | 10 +++++++++- src/models/responses/ResponseUserGroup.ts | 10 +++++++++- src/models/responses/ResponseUserPermissions.ts | 10 +++++++++- 29 files changed, 260 insertions(+), 32 deletions(-) diff --git a/src/models/responses/ResponseAuth.ts b/src/models/responses/ResponseAuth.ts index 6948253..7c042ac 100644 --- a/src/models/responses/ResponseAuth.ts +++ b/src/models/responses/ResponseAuth.ts @@ -1,9 +1,18 @@ import { IsInt, IsString } from 'class-validator'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; /** * Defines the repsonse auth. */ -export class ResponseAuth { +export class ResponseAuth implements IResponse { + + /** + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType = ResponseObjectType.AUTH; + /** * The access_token - JWT shortterm access token. */ diff --git a/src/models/responses/ResponseDistanceDonation.ts b/src/models/responses/ResponseDistanceDonation.ts index 388ece0..a76d122 100644 --- a/src/models/responses/ResponseDistanceDonation.ts +++ b/src/models/responses/ResponseDistanceDonation.ts @@ -1,12 +1,19 @@ import { IsInt, IsObject, IsPositive } from 'class-validator'; import { DistanceDonation } from '../entities/DistanceDonation'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; import { ResponseDonation } from './ResponseDonation'; import { ResponseRunner } from './ResponseRunner'; /** * Defines the distance donation response. */ -export class ResponseDistanceDonation extends ResponseDonation { +export class ResponseDistanceDonation extends ResponseDonation implements IResponse { + /** + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType = ResponseObjectType.DISTANCEDONATION; /** * The donation's associated runner. diff --git a/src/models/responses/ResponseDonation.ts b/src/models/responses/ResponseDonation.ts index c2789e3..e29f11f 100644 --- a/src/models/responses/ResponseDonation.ts +++ b/src/models/responses/ResponseDonation.ts @@ -1,11 +1,20 @@ import { IsInt, IsNotEmpty, IsPositive } from "class-validator"; import { Donation } from '../entities/Donation'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; import { ResponseDonor } from './ResponseDonor'; /** * Defines the donation response. */ -export class ResponseDonation { +export class ResponseDonation implements IResponse { + + /** + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType = ResponseObjectType.DONATION; + /** * The donation's id. */ diff --git a/src/models/responses/ResponseDonor.ts b/src/models/responses/ResponseDonor.ts index 5f659f9..2b1e3fc 100644 --- a/src/models/responses/ResponseDonor.ts +++ b/src/models/responses/ResponseDonor.ts @@ -2,12 +2,19 @@ import { IsBoolean, IsInt } from "class-validator"; import { Donor } from '../entities/Donor'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; import { ResponseParticipant } from './ResponseParticipant'; /** * Defines the donor response. */ -export class ResponseDonor extends ResponseParticipant { +export class ResponseDonor extends ResponseParticipant implements IResponse { + /** + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType = ResponseObjectType.DONOR; /** * Does this donor need a receipt? diff --git a/src/models/responses/ResponseEmpty.ts b/src/models/responses/ResponseEmpty.ts index 57b0543..d6e2018 100644 --- a/src/models/responses/ResponseEmpty.ts +++ b/src/models/responses/ResponseEmpty.ts @@ -1,9 +1,17 @@ import { IsString } from 'class-validator'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; /** * Defines a empty response object. */ -export class ResponseEmpty { +export class ResponseEmpty implements IResponse { + /** + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType = ResponseObjectType.EMPTY; + @IsString() response: string = "nothing here" } diff --git a/src/models/responses/ResponseGroupContact.ts b/src/models/responses/ResponseGroupContact.ts index 291dde5..4cd826d 100644 --- a/src/models/responses/ResponseGroupContact.ts +++ b/src/models/responses/ResponseGroupContact.ts @@ -1,12 +1,20 @@ import { IsInt, IsObject, IsString } from "class-validator"; import { Address } from '../entities/Address'; import { GroupContact } from '../entities/GroupContact'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; import { ResponseRunnerGroup } from './ResponseRunnerGroup'; /** * Defines the group contact response. */ -export class ResponseGroupContact { +export class ResponseGroupContact implements IResponse { + /** + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType = ResponseObjectType.GROUPCONTACT; + /** * The contact's id. */ diff --git a/src/models/responses/ResponseLogout.ts b/src/models/responses/ResponseLogout.ts index fdb8d49..8cd8ce9 100644 --- a/src/models/responses/ResponseLogout.ts +++ b/src/models/responses/ResponseLogout.ts @@ -1,9 +1,17 @@ import { IsString } from 'class-validator'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; /** * Defines the logout response. */ -export class Logout { +export class Logout implements IResponse { + /** + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType = ResponseObjectType.LOGOUT; + /** * The logout's timestamp. */ diff --git a/src/models/responses/ResponseParticipant.ts b/src/models/responses/ResponseParticipant.ts index 93a6918..b5ca124 100644 --- a/src/models/responses/ResponseParticipant.ts +++ b/src/models/responses/ResponseParticipant.ts @@ -1,11 +1,19 @@ import { IsInt, IsObject, IsOptional, IsString } from "class-validator"; import { Address } from '../entities/Address'; import { Participant } from '../entities/Participant'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; /** * Defines the participant response. */ -export abstract class ResponseParticipant { +export abstract class ResponseParticipant implements IResponse { + /** + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType = ResponseObjectType.PARTICIPANT; + /** * The participant's id. */ diff --git a/src/models/responses/ResponsePermission.ts b/src/models/responses/ResponsePermission.ts index a6b0bc1..5eb500d 100644 --- a/src/models/responses/ResponsePermission.ts +++ b/src/models/responses/ResponsePermission.ts @@ -7,12 +7,20 @@ import { import { Permission } from '../entities/Permission'; import { PermissionAction } from '../enums/PermissionAction'; import { PermissionTarget } from '../enums/PermissionTargets'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; import { ResponsePrincipal } from './ResponsePrincipal'; /** * Defines the permission response. */ -export class ResponsePermission { +export class ResponsePermission implements IResponse { + /** + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType = ResponseObjectType.PERMISSION; + /** * The permission's id. */ diff --git a/src/models/responses/ResponsePrincipal.ts b/src/models/responses/ResponsePrincipal.ts index afd4dd1..8ad4414 100644 --- a/src/models/responses/ResponsePrincipal.ts +++ b/src/models/responses/ResponsePrincipal.ts @@ -2,11 +2,19 @@ import { IsInt } from "class-validator"; import { Principal } from '../entities/Principal'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; /** * Defines the principal response. */ -export abstract class ResponsePrincipal { +export abstract class ResponsePrincipal implements IResponse { + + /** + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType = ResponseObjectType.PRINCIPAL; /** * The principal's id. diff --git a/src/models/responses/ResponseRunner.ts b/src/models/responses/ResponseRunner.ts index 0d2fb67..5820baf 100644 --- a/src/models/responses/ResponseRunner.ts +++ b/src/models/responses/ResponseRunner.ts @@ -4,12 +4,19 @@ import { } from "class-validator"; import { Runner } from '../entities/Runner'; import { RunnerGroup } from '../entities/RunnerGroup'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; import { ResponseParticipant } from './ResponseParticipant'; /** * Defines the runner response. */ -export class ResponseRunner extends ResponseParticipant { +export class ResponseRunner extends ResponseParticipant implements IResponse { + /** + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType = ResponseObjectType.RUNNER; /** * The runner's currently ran distance in meters. diff --git a/src/models/responses/ResponseRunnerCard.ts b/src/models/responses/ResponseRunnerCard.ts index f895a9c..84309be 100644 --- a/src/models/responses/ResponseRunnerCard.ts +++ b/src/models/responses/ResponseRunnerCard.ts @@ -1,11 +1,19 @@ import { IsBoolean, IsEAN, IsInt, IsNotEmpty, IsObject, IsString } from "class-validator"; import { RunnerCard } from '../entities/RunnerCard'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; import { ResponseRunner } from './ResponseRunner'; /** * Defines the runner card response. */ -export class ResponseRunnerCard { +export class ResponseRunnerCard implements IResponse { + /** + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType = ResponseObjectType.RUNNERCARD; + /** * The card's id. */ diff --git a/src/models/responses/ResponseRunnerGroup.ts b/src/models/responses/ResponseRunnerGroup.ts index 7be35a6..e9f6e56 100644 --- a/src/models/responses/ResponseRunnerGroup.ts +++ b/src/models/responses/ResponseRunnerGroup.ts @@ -1,11 +1,19 @@ import { IsInt, IsNotEmpty, IsObject, IsOptional, IsString } from "class-validator"; import { GroupContact } from '../entities/GroupContact'; import { RunnerGroup } from '../entities/RunnerGroup'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; /** * Defines the runnerGroup response. */ -export abstract class ResponseRunnerGroup { +export abstract class ResponseRunnerGroup implements IResponse { + /** + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType = ResponseObjectType.RUNNERGROUP; + /** * The runnerGroup's id. */ diff --git a/src/models/responses/ResponseRunnerOrganization.ts b/src/models/responses/ResponseRunnerOrganization.ts index dcafb53..37e9af5 100644 --- a/src/models/responses/ResponseRunnerOrganization.ts +++ b/src/models/responses/ResponseRunnerOrganization.ts @@ -12,12 +12,19 @@ import { import { Address } from '../entities/Address'; import { RunnerOrganization } from '../entities/RunnerOrganization'; import { RunnerTeam } from '../entities/RunnerTeam'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; import { ResponseRunnerGroup } from './ResponseRunnerGroup'; /** * Defines the runnerOrganization response. */ -export class ResponseRunnerOrganization extends ResponseRunnerGroup { +export class ResponseRunnerOrganization extends ResponseRunnerGroup implements IResponse { + /** + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType = ResponseObjectType.RUNNERORGANIZATION; /** * The runnerOrganization's address. diff --git a/src/models/responses/ResponseRunnerTeam.ts b/src/models/responses/ResponseRunnerTeam.ts index 50566cf..5d5760b 100644 --- a/src/models/responses/ResponseRunnerTeam.ts +++ b/src/models/responses/ResponseRunnerTeam.ts @@ -1,12 +1,19 @@ import { IsNotEmpty, IsObject } from "class-validator"; import { RunnerTeam } from '../entities/RunnerTeam'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; import { ResponseRunnerGroup } from './ResponseRunnerGroup'; import { ResponseRunnerOrganization } from './ResponseRunnerOrganization'; /** * Defines the runnerTeam response. */ -export class ResponseRunnerTeam extends ResponseRunnerGroup { +export class ResponseRunnerTeam extends ResponseRunnerGroup implements IResponse { + /** + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType = ResponseObjectType.RUNNERTEAM; /** * The runnerTeam's parent group (organization). diff --git a/src/models/responses/ResponseScan.ts b/src/models/responses/ResponseScan.ts index e666442..f8f2142 100644 --- a/src/models/responses/ResponseScan.ts +++ b/src/models/responses/ResponseScan.ts @@ -1,11 +1,19 @@ import { IsBoolean, IsInt, IsNotEmpty, IsPositive } from "class-validator"; import { Scan } from '../entities/Scan'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; import { ResponseRunner } from './ResponseRunner'; /** * Defines the scan response. */ -export class ResponseScan { +export class ResponseScan implements IResponse { + /** + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType = ResponseObjectType.SCAN; + /** * The scans's id. */ diff --git a/src/models/responses/ResponseScanStation.ts b/src/models/responses/ResponseScanStation.ts index 7d7dc48..455549b 100644 --- a/src/models/responses/ResponseScanStation.ts +++ b/src/models/responses/ResponseScanStation.ts @@ -11,12 +11,20 @@ import { IsString } from "class-validator"; import { ScanStation } from '../entities/ScanStation'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; import { ResponseTrack } from './ResponseTrack'; /** * Defines the statsClient response. */ -export class ResponseScanStation { +export class ResponseScanStation implements IResponse { + /** + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType = ResponseObjectType.SCANSTATION; + /** * The client's id. */ @@ -64,7 +72,7 @@ export class ResponseScanStation { this.description = station.description; this.prefix = station.prefix; this.key = "Only visible on creation."; - this.track = station.track; + this.track = station.track.toResponse(); this.enabled = station.enabled; } } diff --git a/src/models/responses/ResponseSelfServiceDonation.ts b/src/models/responses/ResponseSelfServiceDonation.ts index 4f10f3c..beb8fdc 100644 --- a/src/models/responses/ResponseSelfServiceDonation.ts +++ b/src/models/responses/ResponseSelfServiceDonation.ts @@ -1,11 +1,19 @@ import { IsInt, IsNotEmpty, IsPositive } from 'class-validator'; import { DistanceDonation } from '../entities/DistanceDonation'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; /** * Defines the runner selfservice donation response. * Why? B/C runner's are not allowed to view all information available to admin users. */ -export class ResponseSelfServiceDonation { +export class ResponseSelfServiceDonation implements IResponse { + /** + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType = ResponseObjectType.SELFSERVICEDONATION; + /** * The donation's donor. */ diff --git a/src/models/responses/ResponseSelfServiceRunner.ts b/src/models/responses/ResponseSelfServiceRunner.ts index fa9a1f1..00fe9b9 100644 --- a/src/models/responses/ResponseSelfServiceRunner.ts +++ b/src/models/responses/ResponseSelfServiceRunner.ts @@ -3,6 +3,8 @@ import { DistanceDonation } from '../entities/DistanceDonation'; import { Runner } from '../entities/Runner'; import { RunnerGroup } from '../entities/RunnerGroup'; import { RunnerTeam } from '../entities/RunnerTeam'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; import { ResponseParticipant } from './ResponseParticipant'; import { ResponseSelfServiceDonation } from './ResponseSelfServiceDonation'; @@ -10,7 +12,12 @@ import { ResponseSelfServiceDonation } from './ResponseSelfServiceDonation'; * Defines the runner selfservice response. * Why? B/C runner's are not allowed to view all information available to admin users. */ -export class ResponseSelfServiceRunner extends ResponseParticipant { +export class ResponseSelfServiceRunner extends ResponseParticipant implements IResponse { + /** + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType = ResponseObjectType.SELFSERVICERUNNER; /** * The runner's currently ran distance in meters. diff --git a/src/models/responses/ResponseStats.ts b/src/models/responses/ResponseStats.ts index d184089..f3d36a3 100644 --- a/src/models/responses/ResponseStats.ts +++ b/src/models/responses/ResponseStats.ts @@ -7,12 +7,20 @@ import { RunnerOrganization } from '../entities/RunnerOrganization'; import { RunnerTeam } from '../entities/RunnerTeam'; import { Scan } from '../entities/Scan'; import { User } from '../entities/User'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; /** * Defines the stats response. * The stats response calculates some basic stats for a dashboard or public display. */ -export class ResponseStats { +export class ResponseStats implements IResponse { + /** + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType = ResponseObjectType.STATS; + /** * The amount of runners registered in the system. */ diff --git a/src/models/responses/ResponseStatsClient.ts b/src/models/responses/ResponseStatsClient.ts index 4028e2a..7f10352 100644 --- a/src/models/responses/ResponseStatsClient.ts +++ b/src/models/responses/ResponseStatsClient.ts @@ -8,11 +8,19 @@ import { IsString } from "class-validator"; import { StatsClient } from '../entities/StatsClient'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; /** * Defines the statsClient response. */ -export class ResponseStatsClient { +export class ResponseStatsClient implements IResponse { + /** + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType = ResponseObjectType.STATSCLIENT; + /** * The client's id. */ diff --git a/src/models/responses/ResponseStatsOrganization.ts b/src/models/responses/ResponseStatsOrganization.ts index 592435a..5339b55 100644 --- a/src/models/responses/ResponseStatsOrganization.ts +++ b/src/models/responses/ResponseStatsOrganization.ts @@ -4,12 +4,20 @@ import { IsString } from "class-validator"; import { RunnerOrganization } from '../entities/RunnerOrganization'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; /** * Defines the org stats response. * This differs from the normal org responce. */ -export class ResponseStatsOrgnisation { +export class ResponseStatsOrgnisation implements IResponse { + /** + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType = ResponseObjectType.STATSORGANIZATION; + /** * The orgs's id. */ diff --git a/src/models/responses/ResponseStatsRunner.ts b/src/models/responses/ResponseStatsRunner.ts index 8b55983..bd0b212 100644 --- a/src/models/responses/ResponseStatsRunner.ts +++ b/src/models/responses/ResponseStatsRunner.ts @@ -5,12 +5,20 @@ import { } from "class-validator"; import { Runner } from '../entities/Runner'; import { RunnerGroup } from '../entities/RunnerGroup'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; /** * Defines the runner stats response. * This differs from the normal runner responce. */ -export class ResponseStatsRunner { +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. */ diff --git a/src/models/responses/ResponseStatsTeam.ts b/src/models/responses/ResponseStatsTeam.ts index 362971a..b1fbd22 100644 --- a/src/models/responses/ResponseStatsTeam.ts +++ b/src/models/responses/ResponseStatsTeam.ts @@ -5,12 +5,20 @@ import { } from "class-validator"; import { RunnerGroup } from '../entities/RunnerGroup'; import { RunnerTeam } from '../entities/RunnerTeam'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; /** * Defines the team stats response. * This differs from the normal team responce. */ -export class ResponseStatsTeam { +export class ResponseStatsTeam implements IResponse { + /** + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType = ResponseObjectType.STATSTEAM; + /** * The team's id. */ diff --git a/src/models/responses/ResponseTrack.ts b/src/models/responses/ResponseTrack.ts index 27ef813..a4bdea0 100644 --- a/src/models/responses/ResponseTrack.ts +++ b/src/models/responses/ResponseTrack.ts @@ -1,11 +1,19 @@ import { IsInt, IsOptional, IsString } from "class-validator"; import { TrackLapTimeCantBeNegativeError } from '../../errors/TrackErrors'; import { Track } from '../entities/Track'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; /** * Defines the track response. */ -export class ResponseTrack { +export class ResponseTrack implements IResponse { + /** + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType = ResponseObjectType.TRACK; + /** * The track's id. */ diff --git a/src/models/responses/ResponseTrackScan.ts b/src/models/responses/ResponseTrackScan.ts index d52b4f7..c92bd46 100644 --- a/src/models/responses/ResponseTrackScan.ts +++ b/src/models/responses/ResponseTrackScan.ts @@ -1,5 +1,7 @@ import { IsDateString, IsNotEmpty } from "class-validator"; import { TrackScan } from '../entities/TrackScan'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; import { ResponseRunnerCard } from './ResponseRunnerCard'; import { ResponseScan } from './ResponseScan'; import { ResponseScanStation } from './ResponseScanStation'; @@ -8,10 +10,16 @@ import { ResponseTrack } from './ResponseTrack'; /** * Defines the trackScan response. */ -export class ResponseTrackScan extends ResponseScan { +export class ResponseTrackScan extends ResponseScan implements IResponse { /** - * The scan's associated track. - */ + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType = ResponseObjectType.TRACKSCAN; + + /** + * The scan's associated track. + */ @IsNotEmpty() track: ResponseTrack; diff --git a/src/models/responses/ResponseUser.ts b/src/models/responses/ResponseUser.ts index 884622c..598189f 100644 --- a/src/models/responses/ResponseUser.ts +++ b/src/models/responses/ResponseUser.ts @@ -7,12 +7,20 @@ import { } from "class-validator"; import { User } from '../entities/User'; import { UserGroup } from '../entities/UserGroup'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; import { ResponsePrincipal } from './ResponsePrincipal'; /** * Defines the user response. */ -export class ResponseUser extends ResponsePrincipal { +export class ResponseUser extends ResponsePrincipal implements IResponse { + /** + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType = ResponseObjectType.USER; + /** * The user's first name. */ diff --git a/src/models/responses/ResponseUserGroup.ts b/src/models/responses/ResponseUserGroup.ts index e0276f9..9d1923f 100644 --- a/src/models/responses/ResponseUserGroup.ts +++ b/src/models/responses/ResponseUserGroup.ts @@ -1,12 +1,20 @@ import { IsArray, IsNotEmpty, IsOptional, IsString } from "class-validator"; import { Permission } from '../entities/Permission'; import { UserGroup } from '../entities/UserGroup'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; import { ResponsePrincipal } from './ResponsePrincipal'; /** * Defines the userGroup response. */ -export class ResponseUserGroup extends ResponsePrincipal { +export class ResponseUserGroup extends ResponsePrincipal implements IResponse { + /** + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType = ResponseObjectType.USERGROUP; + /** * The userGroup's name. */ diff --git a/src/models/responses/ResponseUserPermissions.ts b/src/models/responses/ResponseUserPermissions.ts index d5a8a7b..524398d 100644 --- a/src/models/responses/ResponseUserPermissions.ts +++ b/src/models/responses/ResponseUserPermissions.ts @@ -5,12 +5,20 @@ import { IsOptional } from "class-validator"; import { User } from '../entities/User'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; import { ResponsePermission } from './ResponsePermission'; /** * Defines the user permission response (get /api/users/:id/permissions). */ -export class ResponseUserPermissions { +export class ResponseUserPermissions implements IResponse { + /** + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType = ResponseObjectType.USERPERMISSIONS; + /** * The permissions directly granted to the user. */ From 2a878194865d406123805659c011c329c955f669 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Fri, 29 Jan 2021 17:06:57 +0100 Subject: [PATCH 4/8] Fixed typos and missing types ref #132 --- src/models/enums/ResponseObjectType.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/models/enums/ResponseObjectType.ts b/src/models/enums/ResponseObjectType.ts index dfdf482..e0622be 100644 --- a/src/models/enums/ResponseObjectType.ts +++ b/src/models/enums/ResponseObjectType.ts @@ -20,9 +20,10 @@ export enum ResponseObjectType { SCAN = 'SCAN', SCANSTATION = 'SCANSTATION', SELFSERVICEDONATION = 'SELFSERVICEDONATION', - SELFSERVICRUNNER = 'SELFSERVICRUNNER', + SELFSERVICERUNNER = 'SELFSERVICRUNNER', STATS = 'STATS', STATSCLIENT = 'STATSCLIENT', + STATSORGANIZATION = 'STATSORGANIZATION', STATSRUNNER = 'STATSRUNNER', STATSTEAM = 'STATSTEAM', TRACK = 'TRACK', From bcc15e42863b641b97cd03440f141332e112c889 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Fri, 29 Jan 2021 18:46:15 +0100 Subject: [PATCH 5/8] Adjusted tests for the new responseType parameter (part 1) ref #132 --- src/tests/cards/cards_add.spec.ts | 21 ++++++++----- src/tests/cards/cards_update.spec.ts | 12 ++++--- src/tests/contacts/contact_add.spec.ts | 9 ++++-- src/tests/contacts/contact_update.spec.ts | 15 ++++++--- src/tests/donations/donations_add.spec.ts | 6 ++-- src/tests/runnerOrgs/org_add.spec.ts | 8 ++--- src/tests/runnerOrgs/org_delete.spec.ts | 6 ++-- src/tests/runnerOrgs/org_update.spec.ts | 31 ++++++++++--------- src/tests/runnerTeams/team_delete.spec.ts | 2 +- src/tests/runners/runner_add.spec.ts | 1 + src/tests/runners/runner_get.spec.ts | 1 + src/tests/scans/scans_add.spec.ts | 24 ++++++++++---- src/tests/scans/scans_get.spec.ts | 1 + src/tests/scans/scans_update.spec.ts | 13 +++++--- .../scanstations/scanstations_add.spec.ts | 12 ++++--- src/tests/tracks/track_add.spec.ts | 9 ++++-- src/tests/tracks/track_delete.spec.ts | 3 +- src/tests/trackscans/trackscans_add.spec.ts | 1 + 18 files changed, 113 insertions(+), 62 deletions(-) diff --git a/src/tests/cards/cards_add.spec.ts b/src/tests/cards/cards_add.spec.ts index 244ba12..10ee9d4 100644 --- a/src/tests/cards/cards_add.spec.ts +++ b/src/tests/cards/cards_add.spec.ts @@ -34,7 +34,8 @@ describe('POST /api/cards successfully (without runner)', () => { delete res.data.code; expect(res.data).toEqual({ "runner": null, - "enabled": true + "enabled": true, + "responseType": "RUNNERCARD" }); }); it('creating a disabled card should return 200', async () => { @@ -47,7 +48,8 @@ describe('POST /api/cards successfully (without runner)', () => { delete res.data.code; expect(res.data).toEqual({ "runner": null, - "enabled": false + "enabled": false, + "responseType": "RUNNERCARD" }); }); it('creating a enabled card should return 200', async () => { @@ -60,7 +62,8 @@ describe('POST /api/cards successfully (without runner)', () => { delete res.data.code; expect(res.data).toEqual({ "runner": null, - "enabled": true + "enabled": true, + "responseType": "RUNNERCARD" }); }); }); @@ -97,7 +100,8 @@ describe('POST /api/cards successfully (with runner)', () => { delete res.data.code; expect(res.data).toEqual({ "runner": added_runner, - "enabled": true + "enabled": true, + "responseType": "RUNNERCARD" }); }); it('creating a card with runner (no optional params) should return 200', async () => { @@ -110,7 +114,8 @@ describe('POST /api/cards successfully (with runner)', () => { delete res.data.code; expect(res.data).toEqual({ "runner": added_runner, - "enabled": true + "enabled": true, + "responseType": "RUNNERCARD" }); }); it('creating a enabled card with runner should return 200', async () => { @@ -124,7 +129,8 @@ describe('POST /api/cards successfully (with runner)', () => { delete res.data.code; expect(res.data).toEqual({ "runner": added_runner, - "enabled": true + "enabled": true, + "responseType": "RUNNERCARD" }); }); it('creating a disabled card with runner should return 200', async () => { @@ -138,7 +144,8 @@ describe('POST /api/cards successfully (with runner)', () => { delete res.data.code; expect(res.data).toEqual({ "runner": added_runner, - "enabled": false + "enabled": false, + "responseType": "RUNNERCARD" }); }); }); \ No newline at end of file diff --git a/src/tests/cards/cards_update.spec.ts b/src/tests/cards/cards_update.spec.ts index 804428c..6ec1506 100644 --- a/src/tests/cards/cards_update.spec.ts +++ b/src/tests/cards/cards_update.spec.ts @@ -96,7 +96,8 @@ describe('adding + updating card.runner successfully', () => { "id": added_card.id, "runner": added_runner, "enabled": true, - "code": added_card.code + "code": added_card.code, + "responseType": "RUNNERCARD" }); }); it('valid runner update (change runner) should return 200', async () => { @@ -110,7 +111,8 @@ describe('adding + updating card.runner successfully', () => { "id": added_card.id, "runner": added_runner2, "enabled": true, - "code": added_card.code + "code": added_card.code, + "responseType": "RUNNERCARD" }); }); }); @@ -142,7 +144,8 @@ describe('adding + updating other values successfully', () => { "id": added_card.id, "runner": null, "enabled": false, - "code": added_card.code + "code": added_card.code, + "responseType": "RUNNERCARD" }); }); it('valid enable update should return 200', async () => { @@ -156,7 +159,8 @@ describe('adding + updating other values successfully', () => { "id": added_card.id, "runner": null, "enabled": true, - "code": added_card.code + "code": added_card.code, + "responseType": "RUNNERCARD" }); }); }); diff --git a/src/tests/contacts/contact_add.spec.ts b/src/tests/contacts/contact_add.spec.ts index 7508e05..c6a13e0 100644 --- a/src/tests/contacts/contact_add.spec.ts +++ b/src/tests/contacts/contact_add.spec.ts @@ -149,7 +149,8 @@ describe('POST /api/contacts working (with group)', () => { "city": null, "country": null }, - "groups": [added_org] + "groups": [added_org], + "responseType": "GROUPCONTACT" }); }); it('creating a new contact with a valid team should return 200', async () => { @@ -174,7 +175,8 @@ describe('POST /api/contacts working (with group)', () => { "city": null, "country": null }, - "groups": [added_team] + "groups": [added_team], + "responseType": "GROUPCONTACT" }); }); it('creating a new contact with a valid org and team should return 200', async () => { @@ -200,7 +202,8 @@ describe('POST /api/contacts working (with group)', () => { "city": null, "country": null }, - "groups": [added_org, added_team] + "groups": [added_org, added_team], + "responseType": "GROUPCONTACT" }); }); it('checking if the added team\'s contact is the new contact should return 200', async () => { diff --git a/src/tests/contacts/contact_update.spec.ts b/src/tests/contacts/contact_update.spec.ts index 52fe57c..2a6decc 100644 --- a/src/tests/contacts/contact_update.spec.ts +++ b/src/tests/contacts/contact_update.spec.ts @@ -101,7 +101,8 @@ describe('Update contact group after adding (should work)', () => { "city": null, "country": null }, - "groups": [added_org] + "groups": [added_org], + "responseType": "GROUPCONTACT" }); }); it('valid group update to single team should return 200', async () => { @@ -127,7 +128,8 @@ describe('Update contact group after adding (should work)', () => { "city": null, "country": null }, - "groups": [added_team] + "groups": [added_team], + "responseType": "GROUPCONTACT" }); }); it('valid group update to org and team should return 200', async () => { @@ -153,7 +155,8 @@ describe('Update contact group after adding (should work)', () => { "city": null, "country": null }, - "groups": [added_org, added_team] + "groups": [added_org, added_team], + "responseType": "GROUPCONTACT" }); }); it('valid group update to none should return 200', async () => { @@ -179,7 +182,8 @@ describe('Update contact group after adding (should work)', () => { "city": null, "country": null }, - "groups": [] + "groups": [], + "responseType": "GROUPCONTACT" }); }); }); @@ -220,7 +224,8 @@ describe('Update contact group invalid after adding (should fail)', () => { "city": null, "country": null }, - "groups": [added_org] + "groups": [added_org], + "responseType": "GROUPCONTACT" }); }); it('invalid group update to single team should return 404', async () => { diff --git a/src/tests/donations/donations_add.spec.ts b/src/tests/donations/donations_add.spec.ts index e463c13..daad122 100644 --- a/src/tests/donations/donations_add.spec.ts +++ b/src/tests/donations/donations_add.spec.ts @@ -179,7 +179,8 @@ describe('POST /api/donations/fixed successfully', () => { expect(res.headers['content-type']).toContain("application/json"); expect(res.data).toEqual({ "donor": added_donor, - "amount": 1000 + "amount": 1000, + "responseType": "DONATION" }); }); }); @@ -230,7 +231,8 @@ describe('POST /api/donations/distance successfully', () => { "donor": added_donor, "amountPerDistance": 100, "runner": added_runner, - "amount": 0 + "amount": 0, + "responseType": "DISTANCEDONATION" }) }); }); \ No newline at end of file diff --git a/src/tests/runnerOrgs/org_add.spec.ts b/src/tests/runnerOrgs/org_add.spec.ts index 30eb5f8..d40ef2a 100644 --- a/src/tests/runnerOrgs/org_add.spec.ts +++ b/src/tests/runnerOrgs/org_add.spec.ts @@ -55,7 +55,6 @@ describe('adding + getting from all orgs', () => { delete added_org.id expect(added_org).toEqual({ "name": "test123", - "contact": null, "address": { "address1": null, "address2": null, @@ -64,7 +63,8 @@ describe('adding + getting from all orgs', () => { "postalcode": null, }, "registrationEnabled": false, - "teams": [] + "teams": [], + "responseType": "RUNNERORGANIZATION" }) }); }); @@ -89,7 +89,6 @@ describe('adding + getting explicitly', () => { delete added_org2.id expect(added_org2).toEqual({ "name": "test123", - "contact": null, "address": { "address1": null, "address2": null, @@ -98,7 +97,8 @@ describe('adding + getting explicitly', () => { "postalcode": null, }, "registrationEnabled": false, - "teams": [] + "teams": [], + "responseType": "RUNNERORGANIZATION" }) }); }); \ No newline at end of file diff --git a/src/tests/runnerOrgs/org_delete.spec.ts b/src/tests/runnerOrgs/org_delete.spec.ts index dd190fb..114777e 100644 --- a/src/tests/runnerOrgs/org_delete.spec.ts +++ b/src/tests/runnerOrgs/org_delete.spec.ts @@ -43,7 +43,6 @@ describe('adding + deletion (successfull)', () => { delete added_org2.id expect(added_org2).toEqual({ "name": "test123", - "contact": null, "address": { "address1": null, "address2": null, @@ -52,7 +51,8 @@ describe('adding + deletion (successfull)', () => { "postalcode": null, }, "registrationEnabled": false, - "teams": [] + "teams": [], + "responseType": "RUNNERORGANIZATION" }); }); it('check if org really was deleted', async () => { @@ -127,7 +127,6 @@ describe('adding + deletion with teams still existing (with force)', () => { delete added_org2.teams; expect(added_org2).toEqual({ "name": "test123", - "contact": null, "address": { "address1": null, "address2": null, @@ -136,6 +135,7 @@ describe('adding + deletion with teams still existing (with force)', () => { "postalcode": null, }, "registrationEnabled": false, + "responseType": "RUNNERORGANIZATION" }); }); it('check if org really was deleted', async () => { diff --git a/src/tests/runnerOrgs/org_update.spec.ts b/src/tests/runnerOrgs/org_update.spec.ts index 6e33766..569750d 100644 --- a/src/tests/runnerOrgs/org_update.spec.ts +++ b/src/tests/runnerOrgs/org_update.spec.ts @@ -41,7 +41,6 @@ describe('adding + updating name', () => { delete added_org2.id expect(added_org2).toEqual({ "name": "testlelele", - "contact": null, "address": { "address1": null, "address2": null, @@ -50,7 +49,8 @@ describe('adding + updating name', () => { "postalcode": null, }, "registrationEnabled": false, - "teams": [] + "teams": [], + "responseType": "RUNNERORGANIZATION" }) }); }); @@ -109,7 +109,6 @@ describe('adding + updateing address valid)', () => { expect(res.data).toEqual({ "id": added_org_id, "name": "testlelele", - "contact": null, "address": { "address1": "Test1", "address2": null, @@ -118,7 +117,8 @@ describe('adding + updateing address valid)', () => { "postalcode": "90174" }, "registrationEnabled": false, - "teams": [] + "teams": [], + "responseType": "RUNNERORGANIZATION" }); }); it('updateing address\'s first line should return 200', async () => { @@ -139,7 +139,6 @@ describe('adding + updateing address valid)', () => { expect(res.data).toEqual({ "id": added_org_id, "name": "testlelele", - "contact": null, "address": { "address1": "Test2", "address2": null, @@ -148,7 +147,8 @@ describe('adding + updateing address valid)', () => { "postalcode": "90174" }, "registrationEnabled": false, - "teams": [] + "teams": [], + "responseType": "RUNNERORGANIZATION" }); }); it('updateing address\'s second line should return 200', async () => { @@ -169,7 +169,6 @@ describe('adding + updateing address valid)', () => { expect(res.data).toEqual({ "id": added_org_id, "name": "testlelele", - "contact": null, "address": { "address1": "Test2", "address2": "Test3", @@ -178,7 +177,8 @@ describe('adding + updateing address valid)', () => { "postalcode": "90174" }, "registrationEnabled": false, - "teams": [] + "teams": [], + "responseType": "RUNNERORGANIZATION" }); }); it('updateing address\'s city should return 200', async () => { @@ -199,7 +199,6 @@ describe('adding + updateing address valid)', () => { expect(res.data).toEqual({ "id": added_org_id, "name": "testlelele", - "contact": null, "address": { "address1": "Test2", "address2": "Test3", @@ -208,7 +207,8 @@ describe('adding + updateing address valid)', () => { "postalcode": "90174" }, "registrationEnabled": false, - "teams": [] + "teams": [], + "responseType": "RUNNERORGANIZATION" }); }); it('updateing address\'s country should return 200', async () => { @@ -238,7 +238,8 @@ describe('adding + updateing address valid)', () => { "postalcode": "90174" }, "registrationEnabled": false, - "teams": [] + "teams": [], + "responseType": "RUNNERORGANIZATION" }); }); it('updateing address\'s postal code should return 200', async () => { @@ -259,7 +260,6 @@ describe('adding + updateing address valid)', () => { expect(res.data).toEqual({ "id": added_org_id, "name": "testlelele", - "contact": null, "address": { "address1": "Test2", "address2": "Test3", @@ -268,7 +268,8 @@ describe('adding + updateing address valid)', () => { "postalcode": "91065" }, "registrationEnabled": false, - "teams": [] + "teams": [], + "responseType": "RUNNERORGANIZATION" }); }); it('removing org\'s address should return 200', async () => { @@ -282,7 +283,6 @@ describe('adding + updateing address valid)', () => { expect(res.data).toEqual({ "id": added_org_id, "name": "testlelele", - "contact": null, "address": { "address1": null, "address2": null, @@ -291,7 +291,8 @@ describe('adding + updateing address valid)', () => { "postalcode": null }, "registrationEnabled": false, - "teams": [] + "teams": [], + "responseType": "RUNNERORGANIZATION" }); }); }); diff --git a/src/tests/runnerTeams/team_delete.spec.ts b/src/tests/runnerTeams/team_delete.spec.ts index b379d76..0cf5046 100644 --- a/src/tests/runnerTeams/team_delete.spec.ts +++ b/src/tests/runnerTeams/team_delete.spec.ts @@ -48,7 +48,7 @@ describe('adding org', () => { delete deleted_team.parentGroup; expect(deleted_team).toEqual({ "name": "test123", - "contact": null + "responseType": "RUNNERTEAM" }); }); it('check if team really was deleted', async () => { diff --git a/src/tests/runners/runner_add.spec.ts b/src/tests/runners/runner_add.spec.ts index 86083d6..63bc2aa 100644 --- a/src/tests/runners/runner_add.spec.ts +++ b/src/tests/runners/runner_add.spec.ts @@ -17,6 +17,7 @@ beforeAll(async () => { describe('GET /api/runners', () => { it('basic get should return 200', async () => { const res = await axios.get(base + '/api/runners', axios_config); + console.log(res.data) expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json") }); diff --git a/src/tests/runners/runner_get.spec.ts b/src/tests/runners/runner_get.spec.ts index 1b71abd..5a49711 100644 --- a/src/tests/runners/runner_get.spec.ts +++ b/src/tests/runners/runner_get.spec.ts @@ -131,6 +131,7 @@ describe('GET /api/teams/:id/runners after adding', () => { }); it('check if scans was added via the orgs/runners endpoint.', async () => { const res = await axios.get(base + '/api/teams/' + added_team.id + "/runners", axios_config); + console.log(res.data); expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); expect(res.data).toContainEqual(added_runner); diff --git a/src/tests/scans/scans_add.spec.ts b/src/tests/scans/scans_add.spec.ts index 8a28e26..167856d 100644 --- a/src/tests/scans/scans_add.spec.ts +++ b/src/tests/scans/scans_add.spec.ts @@ -98,10 +98,12 @@ describe('POST /api/scans successfully', () => { expect(res.headers['content-type']).toContain("application/json"); delete res.data.id; delete res.data.runner.distance; + delete res.data.runner.group; expect(res.data).toEqual({ "runner": added_runner, "distance": 200, - "valid": true + "valid": true, + "responseType": "SCAN" }); }); it('creating a valid scan should return 200', async () => { @@ -114,10 +116,12 @@ describe('POST /api/scans successfully', () => { expect(res.headers['content-type']).toContain("application/json"); delete res.data.id; delete res.data.runner.distance; + delete res.data.runner.group; expect(res.data).toEqual({ "runner": added_runner, "distance": 200, - "valid": true + "valid": true, + "responseType": "SCAN" }); }); it('creating a invalid scan should return 200', async () => { @@ -130,10 +134,12 @@ describe('POST /api/scans successfully', () => { expect(res.headers['content-type']).toContain("application/json"); delete res.data.id; delete res.data.runner.distance; + delete res.data.runner.group; expect(res.data).toEqual({ "runner": added_runner, "distance": 200, - "valid": false + "valid": false, + "responseType": "SCAN" }); }); }); @@ -192,10 +198,12 @@ describe('POST /api/scans successfully via scan station', () => { expect(res.headers['content-type']).toContain("application/json"); delete res.data.id; delete res.data.runner.distance; + delete res.data.runner.group; expect(res.data).toEqual({ "runner": added_runner, "distance": 200, - "valid": true + "valid": true, + "responseType": "SCAN", }); }); it('creating a valid scan should return 200', async () => { @@ -211,10 +219,12 @@ describe('POST /api/scans successfully via scan station', () => { expect(res.headers['content-type']).toContain("application/json"); delete res.data.id; delete res.data.runner.distance; + delete res.data.runner.group; expect(res.data).toEqual({ "runner": added_runner, "distance": 200, - "valid": true + "valid": true, + "responseType": "SCAN" }); }); it('creating a invalid scan should return 200', async () => { @@ -230,10 +240,12 @@ describe('POST /api/scans successfully via scan station', () => { expect(res.headers['content-type']).toContain("application/json"); delete res.data.id; delete res.data.runner.distance; + delete res.data.runner.group; expect(res.data).toEqual({ "runner": added_runner, "distance": 200, - "valid": false + "valid": false, + "responseType": "SCAN", }); }); }); diff --git a/src/tests/scans/scans_get.spec.ts b/src/tests/scans/scans_get.spec.ts index e6a08a9..b45b334 100644 --- a/src/tests/scans/scans_get.spec.ts +++ b/src/tests/scans/scans_get.spec.ts @@ -72,6 +72,7 @@ describe('adding + getting scans', () => { expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); added_scan.runner.distance = 0; + added_scan.runner.group = added_org; expect(res.data).toContainEqual(added_scan); }); }); \ No newline at end of file diff --git a/src/tests/scans/scans_update.spec.ts b/src/tests/scans/scans_update.spec.ts index b261ee8..e711a39 100644 --- a/src/tests/scans/scans_update.spec.ts +++ b/src/tests/scans/scans_update.spec.ts @@ -123,12 +123,13 @@ describe('adding + updating successfilly', () => { expect(res2.status).toEqual(200); expect(res2.headers['content-type']).toContain("application/json") delete res2.data.runner.distance; + delete res2.data.runner.group; expect(res2.data).toEqual({ "id": added_scan.id, "runner": added_runner, "distance": 100, - "valid": true - + "valid": true, + "responseType": "SCAN" }); }); it('valid valid update should return 200', async () => { @@ -141,11 +142,13 @@ describe('adding + updating successfilly', () => { expect(res2.status).toEqual(200); expect(res2.headers['content-type']).toContain("application/json"); delete res2.data.runner.distance; + delete res2.data.runner.group; expect(res2.data).toEqual({ "id": added_scan.id, "runner": added_runner, "distance": 100, - "valid": false + "valid": false, + "responseType": "SCAN" }); }); it('creating a new runner with only needed params should return 200', async () => { @@ -169,11 +172,13 @@ describe('adding + updating successfilly', () => { expect(res2.status).toEqual(200); expect(res2.headers['content-type']).toContain("application/json"); delete res2.data.runner.distance; + delete res2.data.runner.group; expect(res2.data).toEqual({ "id": added_scan.id, "runner": added_runner2, "distance": added_scan.distance, - "valid": added_scan.valid + "valid": added_scan.valid, + "responseType": "SCAN" }); }); }); diff --git a/src/tests/scanstations/scanstations_add.spec.ts b/src/tests/scanstations/scanstations_add.spec.ts index e4c3570..04ae0d2 100644 --- a/src/tests/scanstations/scanstations_add.spec.ts +++ b/src/tests/scanstations/scanstations_add.spec.ts @@ -56,7 +56,8 @@ describe('POST /api/stations successfully', () => { expect(res.data).toEqual({ "track": added_track, "description": null, - "enabled": true + "enabled": true, + "responseType": "SCANSTATION" }); }); it('creating a station with all parameters (optional set to true/empty) should return 200', async () => { @@ -73,7 +74,8 @@ describe('POST /api/stations successfully', () => { expect(res.data).toEqual({ "track": added_track, "description": null, - "enabled": true + "enabled": true, + "responseType": "SCANSTATION" }); }); it('creating a disabled station with all parameters (optional set to true/empty) should return 200', async () => { @@ -90,7 +92,8 @@ describe('POST /api/stations successfully', () => { expect(res.data).toEqual({ "track": added_track, "description": null, - "enabled": false + "enabled": false, + "responseType": "SCANSTATION" }); }); it('creating a station with all parameters (optional set) should return 200', async () => { @@ -107,7 +110,8 @@ describe('POST /api/stations successfully', () => { expect(res.data).toEqual({ "track": added_track, "description": "test station for testing", - "enabled": true + "enabled": true, + "responseType": "SCANSTATION" }); }); }); diff --git a/src/tests/tracks/track_add.spec.ts b/src/tests/tracks/track_add.spec.ts index 7f39f8d..b45bb45 100644 --- a/src/tests/tracks/track_add.spec.ts +++ b/src/tests/tracks/track_add.spec.ts @@ -54,7 +54,8 @@ describe('POST /api/tracks successfully', () => { expect(res.data).toEqual({ "name": "testtrack", "distance": 200, - "minimumLapTime": null + "minimumLapTime": null, + "responseType": "TRACK" }) }); it('creating a track with all parameters (optional set to null) should return 200', async () => { @@ -69,7 +70,8 @@ describe('POST /api/tracks successfully', () => { expect(res.data).toEqual({ "name": "testtrack", "distance": 200, - "minimumLapTime": null + "minimumLapTime": null, + "responseType": "TRACK" }) }); it('creating a track with all parameters should return 200', async () => { @@ -84,7 +86,8 @@ describe('POST /api/tracks successfully', () => { expect(res.data).toEqual({ "name": "testtrack", "distance": 200, - "minimumLapTime": 123 + "minimumLapTime": 123, + "responseType": "TRACK" }) }); }); diff --git a/src/tests/tracks/track_delete.spec.ts b/src/tests/tracks/track_delete.spec.ts index cb7ae89..04a1d99 100644 --- a/src/tests/tracks/track_delete.spec.ts +++ b/src/tests/tracks/track_delete.spec.ts @@ -35,7 +35,8 @@ describe('DETELE track', () => { expect(res2.data).toEqual({ "name": "testtrack", "distance": 200, - "minimumLapTime": null + "minimumLapTime": null, + "responseType": "TRACK" }); }); it('check if track really was deleted', async () => { diff --git a/src/tests/trackscans/trackscans_add.spec.ts b/src/tests/trackscans/trackscans_add.spec.ts index a79011c..6c2d74f 100644 --- a/src/tests/trackscans/trackscans_add.spec.ts +++ b/src/tests/trackscans/trackscans_add.spec.ts @@ -242,6 +242,7 @@ describe('POST /api/scans successfully via scan station', () => { headers: { "authorization": "Bearer " + added_station.key }, validateStatus: undefined }); + console.log(res.data) expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); expect(res.data.valid).toEqual(false); From ff8af090e3ea1760fb6110284cff870a0b4cbf84 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Sat, 30 Jan 2021 15:39:39 +0100 Subject: [PATCH 6/8] Adjusted tests for the new responseType parameter (part 2) ref #132 --- src/tests/contacts/contact_update.spec.ts | 1 + src/tests/donations/donations_update.spec.ts | 2 +- src/tests/runnerOrgs/org_update.spec.ts | 1 - src/tests/runnerTeams/team_update.spec.ts | 1 + src/tests/runners/runner_update.spec.ts | 2 ++ 5 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/tests/contacts/contact_update.spec.ts b/src/tests/contacts/contact_update.spec.ts index 2a6decc..ac7fa04 100644 --- a/src/tests/contacts/contact_update.spec.ts +++ b/src/tests/contacts/contact_update.spec.ts @@ -210,6 +210,7 @@ describe('Update contact group invalid after adding (should fail)', () => { expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); added_contact = res.data + delete res.data.groups[0].teams; expect(res.data).toEqual({ "id": res.data.id, "firstname": "first", diff --git a/src/tests/donations/donations_update.spec.ts b/src/tests/donations/donations_update.spec.ts index 51bb46f..503991e 100644 --- a/src/tests/donations/donations_update.spec.ts +++ b/src/tests/donations/donations_update.spec.ts @@ -323,7 +323,7 @@ describe('adding + updating distance donation valid', () => { "amountPerDistance": 69, "donor": added_donor.id }, axios_config); - delete res.data.runner.group; + delete res.data.runner; expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); expect(res.data.runner).toEqual(added_runner2); diff --git a/src/tests/runnerOrgs/org_update.spec.ts b/src/tests/runnerOrgs/org_update.spec.ts index 569750d..ddc2ea2 100644 --- a/src/tests/runnerOrgs/org_update.spec.ts +++ b/src/tests/runnerOrgs/org_update.spec.ts @@ -229,7 +229,6 @@ describe('adding + updateing address valid)', () => { expect(res.data).toEqual({ "id": added_org_id, "name": "testlelele", - "contact": null, "address": { "address1": "Test2", "address2": "Test3", diff --git a/src/tests/runnerTeams/team_update.spec.ts b/src/tests/runnerTeams/team_update.spec.ts index be1b1be..c8480ab 100644 --- a/src/tests/runnerTeams/team_update.spec.ts +++ b/src/tests/runnerTeams/team_update.spec.ts @@ -127,6 +127,7 @@ describe('add+update parent org (valid)', () => { delete added_org2.registrationEnabled; delete res4.data.parentGroup.key; delete res4.data.parentGroup.registrationEnabled; + delete res4.data.parentGroup.teams; expect(res4.data.parentGroup).toEqual(added_org2) }); }); \ No newline at end of file diff --git a/src/tests/runners/runner_update.spec.ts b/src/tests/runners/runner_update.spec.ts index 8f8b5cf..8ae2aa3 100644 --- a/src/tests/runners/runner_update.spec.ts +++ b/src/tests/runners/runner_update.spec.ts @@ -49,6 +49,7 @@ describe('Update runner name after adding', () => { delete res3.data.group.key; delete res3.data.group.registrationEnabled; delete runnercopy.group.registrationEnabled; + delete res3.data.group.teams; expect(res3.data).toEqual(runnercopy); }); }); @@ -94,6 +95,7 @@ describe('Update runner group after adding', () => { expect(res3.headers['content-type']).toContain("application/json") delete res3.data.group.key; delete res3.data.group.registrationEnabled; + delete res3.data.group.teams; expect(res3.data.group).toEqual(added_org_2); }); }); From 8dc2810c0c4097e26bf1b517bb9d0b102494f6c1 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Sat, 30 Jan 2021 16:19:20 +0100 Subject: [PATCH 7/8] Adjusted tests for the new responseType parameter (part 3) ref #132 --- src/tests/contacts/contact_add.spec.ts | 2 ++ src/tests/contacts/contact_update.spec.ts | 4 +++- src/tests/donations/donations_update.spec.ts | 1 - src/tests/runners/runner_add.spec.ts | 1 - src/tests/runners/runner_get.spec.ts | 3 +-- src/tests/scans/scans_get.spec.ts | 2 +- src/tests/trackscans/trackscans_add.spec.ts | 1 - 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/tests/contacts/contact_add.spec.ts b/src/tests/contacts/contact_add.spec.ts index c6a13e0..f9fd25e 100644 --- a/src/tests/contacts/contact_add.spec.ts +++ b/src/tests/contacts/contact_add.spec.ts @@ -136,6 +136,7 @@ describe('POST /api/contacts working (with group)', () => { expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); delete res.data.id; + delete res.data.groups[0].teams; expect(res.data).toEqual({ "firstname": "first", "middlename": null, @@ -189,6 +190,7 @@ describe('POST /api/contacts working (with group)', () => { expect(res.headers['content-type']).toContain("application/json"); added_contact = res.data delete res.data.id; + delete res.data.groups[0].teams; expect(res.data).toEqual({ "firstname": "first", "middlename": null, diff --git a/src/tests/contacts/contact_update.spec.ts b/src/tests/contacts/contact_update.spec.ts index ac7fa04..15e4b72 100644 --- a/src/tests/contacts/contact_update.spec.ts +++ b/src/tests/contacts/contact_update.spec.ts @@ -86,7 +86,8 @@ describe('Update contact group after adding (should work)', () => { }, axios_config); expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); - added_contact = res.data + added_contact = res.data; + delete res.data.groups[0].teams; expect(res.data).toEqual({ "id": res.data.id, "firstname": "first", @@ -141,6 +142,7 @@ describe('Update contact group after adding (should work)', () => { }, axios_config); expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); + delete res.data.groups[0].teams; expect(res.data).toEqual({ "id": res.data.id, "firstname": "first", diff --git a/src/tests/donations/donations_update.spec.ts b/src/tests/donations/donations_update.spec.ts index 503991e..5768ab9 100644 --- a/src/tests/donations/donations_update.spec.ts +++ b/src/tests/donations/donations_update.spec.ts @@ -323,7 +323,6 @@ describe('adding + updating distance donation valid', () => { "amountPerDistance": 69, "donor": added_donor.id }, axios_config); - delete res.data.runner; expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); expect(res.data.runner).toEqual(added_runner2); diff --git a/src/tests/runners/runner_add.spec.ts b/src/tests/runners/runner_add.spec.ts index 63bc2aa..86083d6 100644 --- a/src/tests/runners/runner_add.spec.ts +++ b/src/tests/runners/runner_add.spec.ts @@ -17,7 +17,6 @@ beforeAll(async () => { describe('GET /api/runners', () => { it('basic get should return 200', async () => { const res = await axios.get(base + '/api/runners', axios_config); - console.log(res.data) expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json") }); diff --git a/src/tests/runners/runner_get.spec.ts b/src/tests/runners/runner_get.spec.ts index 5a49711..b80afc2 100644 --- a/src/tests/runners/runner_get.spec.ts +++ b/src/tests/runners/runner_get.spec.ts @@ -129,9 +129,8 @@ describe('GET /api/teams/:id/runners after adding', () => { expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json") }); - it('check if scans was added via the orgs/runners endpoint.', async () => { + it('check if runner was added via the teams/runners endpoint.', async () => { const res = await axios.get(base + '/api/teams/' + added_team.id + "/runners", axios_config); - console.log(res.data); expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); expect(res.data).toContainEqual(added_runner); diff --git a/src/tests/scans/scans_get.spec.ts b/src/tests/scans/scans_get.spec.ts index b45b334..d2203af 100644 --- a/src/tests/scans/scans_get.spec.ts +++ b/src/tests/scans/scans_get.spec.ts @@ -72,7 +72,7 @@ describe('adding + getting scans', () => { expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); added_scan.runner.distance = 0; - added_scan.runner.group = added_org; + delete added_scan.runner.group; expect(res.data).toContainEqual(added_scan); }); }); \ No newline at end of file diff --git a/src/tests/trackscans/trackscans_add.spec.ts b/src/tests/trackscans/trackscans_add.spec.ts index 6c2d74f..a79011c 100644 --- a/src/tests/trackscans/trackscans_add.spec.ts +++ b/src/tests/trackscans/trackscans_add.spec.ts @@ -242,7 +242,6 @@ describe('POST /api/scans successfully via scan station', () => { headers: { "authorization": "Bearer " + added_station.key }, validateStatus: undefined }); - console.log(res.data) expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); expect(res.data.valid).toEqual(false); From ff7406e71a4a76670d381b415bfb66f602e1206b Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Sat, 30 Jan 2021 16:19:42 +0100 Subject: [PATCH 8/8] Cleaned up realations regarding response classes ref #132 --- src/controllers/DonationController.ts | 4 ++-- src/controllers/ScanController.ts | 14 +++++++------- src/models/entities/UserGroup.ts | 3 +-- src/models/responses/ResponseDistanceDonation.ts | 2 +- src/models/responses/ResponseGroupContact.ts | 6 ++++-- src/models/responses/ResponseRunner.ts | 6 +++--- src/models/responses/ResponseRunnerGroup.ts | 6 +++--- src/models/responses/ResponseRunnerOrganization.ts | 12 +++++++++--- src/models/responses/ResponseRunnerTeam.ts | 2 +- src/models/responses/ResponseScan.ts | 2 +- src/models/responses/ResponseScanStation.ts | 2 +- src/models/responses/ResponseStatsRunner.ts | 6 +++--- src/models/responses/ResponseStatsTeam.ts | 6 +++--- src/models/responses/ResponseTrackScan.ts | 4 ++-- src/models/responses/ResponseUser.ts | 13 ++++++++----- src/models/responses/ResponseUserGroup.ts | 10 +++++++--- 16 files changed, 56 insertions(+), 42 deletions(-) diff --git a/src/controllers/DonationController.ts b/src/controllers/DonationController.ts index 9c2696d..9401694 100644 --- a/src/controllers/DonationController.ts +++ b/src/controllers/DonationController.ts @@ -78,7 +78,7 @@ export class DonationController { async postDistance(@Body({ validate: true }) createDonation: CreateDistanceDonation) { let donation = await createDonation.toEntity(); donation = await this.distanceDonationRepository.save(donation); - return (await this.donationRepository.findOne({ id: donation.id }, { relations: ['runner', 'donor', 'runner.scans', 'runner.scans.track'] })).toResponse(); + return (await this.distanceDonationRepository.findOne({ id: donation.id }, { relations: ['runner', 'donor', 'runner.scans', 'runner.scans.track'] })).toResponse(); } @Put('/fixed/:id') @@ -124,7 +124,7 @@ export class DonationController { } await this.distanceDonationRepository.save(await donation.update(oldDonation)); - return (await this.donationRepository.findOne({ id: donation.id }, { relations: ['runner', 'donor', 'runner.scans', 'runner.scans.track'] })).toResponse(); + return (await this.distanceDonationRepository.findOne({ id: donation.id }, { relations: ['runner', 'donor', 'runner.scans', 'runner.scans.track'] })).toResponse(); } @Delete('/:id') diff --git a/src/controllers/ScanController.ts b/src/controllers/ScanController.ts index 0de844c..b223689 100644 --- a/src/controllers/ScanController.ts +++ b/src/controllers/ScanController.ts @@ -36,7 +36,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', 'track', 'runner.scans', 'runner.scans.track', 'card', 'station'] }); + const scans = await this.scanRepository.find({ relations: ['runner', 'track', 'runner.scans', 'runner.group', 'runner.scans.track', 'card', 'station'] }); scans.forEach(scan => { responseScans.push(scan.toResponse()); }); @@ -51,7 +51,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', 'track', 'runner.scans', 'runner.scans.track', 'card', 'station'] }) + let scan = await this.scanRepository.findOne({ id: id }, { relations: ['runner', 'track', 'runner.scans', 'runner.group', 'runner.scans.track', 'card', 'station'] }) if (!scan) { throw new ScanNotFoundError(); } return scan.toResponse(); } @@ -64,7 +64,7 @@ export class ScanController { async post(@Body({ validate: true }) createScan: CreateScan) { let scan = await createScan.toEntity(); scan = await this.scanRepository.save(scan); - return (await this.scanRepository.findOne({ id: scan.id }, { relations: ['runner', 'track', 'runner.scans', '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(); } @Post("/trackscans") @@ -75,7 +75,7 @@ export class ScanController { async postTrackScans(@Body({ validate: true }) createScan: CreateTrackScan) { let scan = await createScan.toEntity(); scan = await this.trackScanRepository.save(scan); - return (await this.scanRepository.findOne({ id: scan.id }, { relations: ['runner', 'track', 'runner.scans', '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(); } @Put('/:id') @@ -97,7 +97,7 @@ export class ScanController { } await this.scanRepository.save(await scan.update(oldScan)); - return (await this.scanRepository.findOne({ id: id }, { relations: ['runner', 'track', 'runner.scans', 'runner.scans.track', 'card', 'station'] })).toResponse(); + return (await this.scanRepository.findOne({ id: id }, { relations: ['runner', 'track', 'runner.scans', 'runner.group', 'runner.scans.track', 'card', 'station'] })).toResponse(); } @Put('/trackscans/:id') @@ -120,7 +120,7 @@ export class ScanController { } await this.trackScanRepository.save(await scan.update(oldScan)); - return (await this.scanRepository.findOne({ id: id }, { relations: ['runner', 'track', 'runner.scans', 'runner.scans.track', 'card', 'station'] })).toResponse(); + return (await this.scanRepository.findOne({ id: id }, { relations: ['runner', 'track', 'runner.scans', 'runner.group', 'runner.scans.track', 'card', 'station'] })).toResponse(); } @Delete('/:id') @@ -132,7 +132,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', 'track', 'runner.scans', 'runner.scans.track', 'card', 'station'] }); + const responseScan = await this.scanRepository.findOne({ id: scan.id }, { relations: ['runner', 'track', 'runner.scans', 'runner.group', 'runner.scans.track', 'card', 'station'] }); await this.scanRepository.delete(scan); return responseScan.toResponse(); diff --git a/src/models/entities/UserGroup.ts b/src/models/entities/UserGroup.ts index cd7b06c..fad8039 100644 --- a/src/models/entities/UserGroup.ts +++ b/src/models/entities/UserGroup.ts @@ -4,7 +4,6 @@ import { IsString } from "class-validator"; import { ChildEntity, Column } from "typeorm"; -import { ResponsePrincipal } from '../responses/ResponsePrincipal'; import { ResponseUserGroup } from '../responses/ResponseUserGroup'; import { Principal } from './Principal'; @@ -34,7 +33,7 @@ export class UserGroup extends Principal { /** * Turns this entity into it's response class. */ - public toResponse(): ResponsePrincipal { + public toResponse(): ResponseUserGroup { return new ResponseUserGroup(this); } } \ No newline at end of file diff --git a/src/models/responses/ResponseDistanceDonation.ts b/src/models/responses/ResponseDistanceDonation.ts index a76d122..65fea13 100644 --- a/src/models/responses/ResponseDistanceDonation.ts +++ b/src/models/responses/ResponseDistanceDonation.ts @@ -36,7 +36,7 @@ export class ResponseDistanceDonation extends ResponseDonation implements IRespo */ public constructor(donation: DistanceDonation) { super(donation); - this.runner = donation.runner.toResponse(); + if (donation.runner) { this.runner = donation.runner.toResponse(); } this.amountPerDistance = donation.amountPerDistance; } } diff --git a/src/models/responses/ResponseGroupContact.ts b/src/models/responses/ResponseGroupContact.ts index 4cd826d..e3fee94 100644 --- a/src/models/responses/ResponseGroupContact.ts +++ b/src/models/responses/ResponseGroupContact.ts @@ -77,8 +77,10 @@ export class ResponseGroupContact implements IResponse { this.email = contact.email; this.address = contact.address; this.groups = new Array(); - for (let group of contact.groups) { - this.groups.push(group.toResponse()); + if (contact.groups) { + for (let group of contact.groups) { + this.groups.push(group.toResponse()); + } } } } diff --git a/src/models/responses/ResponseRunner.ts b/src/models/responses/ResponseRunner.ts index 5820baf..8ed39e1 100644 --- a/src/models/responses/ResponseRunner.ts +++ b/src/models/responses/ResponseRunner.ts @@ -3,10 +3,10 @@ import { IsObject } from "class-validator"; import { Runner } from '../entities/Runner'; -import { RunnerGroup } from '../entities/RunnerGroup'; import { ResponseObjectType } from '../enums/ResponseObjectType'; import { IResponse } from './IResponse'; import { ResponseParticipant } from './ResponseParticipant'; +import { ResponseRunnerGroup } from './ResponseRunnerGroup'; /** * Defines the runner response. @@ -28,7 +28,7 @@ export class ResponseRunner extends ResponseParticipant implements IResponse { * The runner's group. */ @IsObject() - group: RunnerGroup; + group: ResponseRunnerGroup; /** * Creates a ResponseRunner object from a runner. @@ -38,6 +38,6 @@ export class ResponseRunner extends ResponseParticipant implements IResponse { super(runner); if (!runner.scans) { this.distance = 0 } else { this.distance = runner.validScans.reduce((sum, current) => sum + current.distance, 0); } - this.group = runner.group; + if (runner.group) { this.group = runner.group.toResponse(); } } } diff --git a/src/models/responses/ResponseRunnerGroup.ts b/src/models/responses/ResponseRunnerGroup.ts index e9f6e56..b841218 100644 --- a/src/models/responses/ResponseRunnerGroup.ts +++ b/src/models/responses/ResponseRunnerGroup.ts @@ -1,8 +1,8 @@ import { IsInt, IsNotEmpty, IsObject, IsOptional, IsString } from "class-validator"; -import { GroupContact } from '../entities/GroupContact'; import { RunnerGroup } from '../entities/RunnerGroup'; import { ResponseObjectType } from '../enums/ResponseObjectType'; import { IResponse } from './IResponse'; +import { ResponseGroupContact } from './ResponseGroupContact'; /** * Defines the runnerGroup response. @@ -34,7 +34,7 @@ export abstract class ResponseRunnerGroup implements IResponse { */ @IsObject() @IsOptional() - contact?: GroupContact; + contact?: ResponseGroupContact; /** * Creates a ResponseRunnerGroup object from a runnerGroup. @@ -43,6 +43,6 @@ export abstract class ResponseRunnerGroup implements IResponse { public constructor(group: RunnerGroup) { this.id = group.id; this.name = group.name; - this.contact = group.contact; + if (group.contact) { this.contact = group.contact.toResponse(); }; } } diff --git a/src/models/responses/ResponseRunnerOrganization.ts b/src/models/responses/ResponseRunnerOrganization.ts index 37e9af5..3a78dfc 100644 --- a/src/models/responses/ResponseRunnerOrganization.ts +++ b/src/models/responses/ResponseRunnerOrganization.ts @@ -11,10 +11,10 @@ import { } from "class-validator"; import { Address } from '../entities/Address'; import { RunnerOrganization } from '../entities/RunnerOrganization'; -import { RunnerTeam } from '../entities/RunnerTeam'; import { ResponseObjectType } from '../enums/ResponseObjectType'; import { IResponse } from './IResponse'; import { ResponseRunnerGroup } from './ResponseRunnerGroup'; +import { ResponseRunnerTeam } from './ResponseRunnerTeam'; /** * Defines the runnerOrganization response. @@ -37,7 +37,7 @@ export class ResponseRunnerOrganization extends ResponseRunnerGroup implements I * The runnerOrganization associated teams. */ @IsArray() - teams: RunnerTeam[]; + teams: ResponseRunnerTeam[]; /** * The organization's registration key. @@ -62,7 +62,13 @@ export class ResponseRunnerOrganization extends ResponseRunnerGroup implements I public constructor(org: RunnerOrganization) { super(org); this.address = org.address; - this.teams = org.teams; + this.teams = new Array(); + if (org.teams) { + for (let team of org.teams) { + this.teams.push(team.toResponse()); + } + } + if (!org.key) { this.registrationEnabled = false; } else { this.registrationKey = Buffer.from(org.key).toString('base64'); } } diff --git a/src/models/responses/ResponseRunnerTeam.ts b/src/models/responses/ResponseRunnerTeam.ts index 5d5760b..0434789 100644 --- a/src/models/responses/ResponseRunnerTeam.ts +++ b/src/models/responses/ResponseRunnerTeam.ts @@ -28,6 +28,6 @@ export class ResponseRunnerTeam extends ResponseRunnerGroup implements IResponse */ public constructor(team: RunnerTeam) { super(team); - this.parentGroup = team.parentGroup.toResponse(); + if (team.parentGroup) { this.parentGroup = team.parentGroup.toResponse(); } } } diff --git a/src/models/responses/ResponseScan.ts b/src/models/responses/ResponseScan.ts index f8f2142..864b455 100644 --- a/src/models/responses/ResponseScan.ts +++ b/src/models/responses/ResponseScan.ts @@ -47,7 +47,7 @@ export class ResponseScan implements IResponse { */ public constructor(scan: Scan) { this.id = scan.id; - this.runner = scan.runner.toResponse(); + if (scan.runner) { this.runner = scan.runner.toResponse(); } this.distance = scan.distance; this.valid = scan.valid; } diff --git a/src/models/responses/ResponseScanStation.ts b/src/models/responses/ResponseScanStation.ts index 455549b..459d132 100644 --- a/src/models/responses/ResponseScanStation.ts +++ b/src/models/responses/ResponseScanStation.ts @@ -72,7 +72,7 @@ export class ResponseScanStation implements IResponse { this.description = station.description; this.prefix = station.prefix; this.key = "Only visible on creation."; - this.track = station.track.toResponse(); + if (station.track) { this.track = station.track.toResponse(); } this.enabled = station.enabled; } } diff --git a/src/models/responses/ResponseStatsRunner.ts b/src/models/responses/ResponseStatsRunner.ts index bd0b212..3aac437 100644 --- a/src/models/responses/ResponseStatsRunner.ts +++ b/src/models/responses/ResponseStatsRunner.ts @@ -4,9 +4,9 @@ import { IsString } from "class-validator"; import { Runner } from '../entities/Runner'; -import { RunnerGroup } from '../entities/RunnerGroup'; import { ResponseObjectType } from '../enums/ResponseObjectType'; import { IResponse } from './IResponse'; +import { ResponseRunnerGroup } from './ResponseRunnerGroup'; /** * Defines the runner stats response. @@ -59,7 +59,7 @@ export class ResponseStatsRunner implements IResponse { * The runner's group. */ @IsObject() - group: RunnerGroup; + group: ResponseRunnerGroup; /** * Creates a new runner stats response from a runner @@ -72,6 +72,6 @@ export class ResponseStatsRunner implements IResponse { this.lastname = runner.lastname; this.distance = runner.distance; this.donationAmount = runner.distanceDonationAmount; - this.group = runner.group; + this.group = runner.group.toResponse(); } } diff --git a/src/models/responses/ResponseStatsTeam.ts b/src/models/responses/ResponseStatsTeam.ts index b1fbd22..82e4eb9 100644 --- a/src/models/responses/ResponseStatsTeam.ts +++ b/src/models/responses/ResponseStatsTeam.ts @@ -3,10 +3,10 @@ import { IsObject, IsString } from "class-validator"; -import { RunnerGroup } from '../entities/RunnerGroup'; import { RunnerTeam } from '../entities/RunnerTeam'; import { ResponseObjectType } from '../enums/ResponseObjectType'; import { IResponse } from './IResponse'; +import { ResponseRunnerGroup } from './ResponseRunnerGroup'; /** * Defines the team stats response. @@ -47,7 +47,7 @@ export class ResponseStatsTeam implements IResponse { * The teams's parent group. */ @IsObject() - parent: RunnerGroup; + parent: ResponseRunnerGroup; /** * Creates a new team stats response from a team @@ -56,7 +56,7 @@ export class ResponseStatsTeam implements IResponse { public constructor(team: RunnerTeam) { this.name = team.name; this.id = team.id; - this.parent = team.parentGroup; + this.parent = team.parentGroup.toResponse(); this.distance = team.distance; this.donationAmount = team.distanceDonationAmount; } diff --git a/src/models/responses/ResponseTrackScan.ts b/src/models/responses/ResponseTrackScan.ts index c92bd46..ffd9ceb 100644 --- a/src/models/responses/ResponseTrackScan.ts +++ b/src/models/responses/ResponseTrackScan.ts @@ -49,8 +49,8 @@ export class ResponseTrackScan extends ResponseScan implements IResponse { public constructor(scan: TrackScan) { super(scan); this.track = new ResponseTrack(scan.track); - this.card = scan.card.toResponse(); - this.station = scan.station.toResponse(); + if (scan.card) { scan.card.toResponse(); } + if (scan.station) { scan.station.toResponse(); } this.timestamp = scan.timestamp; this.distance = scan.distance; } diff --git a/src/models/responses/ResponseUser.ts b/src/models/responses/ResponseUser.ts index 598189f..1b55e45 100644 --- a/src/models/responses/ResponseUser.ts +++ b/src/models/responses/ResponseUser.ts @@ -6,10 +6,10 @@ import { IsString } from "class-validator"; import { User } from '../entities/User'; -import { UserGroup } from '../entities/UserGroup'; import { ResponseObjectType } from '../enums/ResponseObjectType'; import { IResponse } from './IResponse'; import { ResponsePrincipal } from './ResponsePrincipal'; +import { ResponseUserGroup } from './ResponseUserGroup'; /** * Defines the user response. @@ -74,7 +74,7 @@ export class ResponseUser extends ResponsePrincipal implements IResponse { */ @IsArray() @IsOptional() - groups: UserGroup[]; + groups: ResponseUserGroup[]; /** * The user's permissions. @@ -98,10 +98,13 @@ export class ResponseUser extends ResponsePrincipal implements IResponse { this.username = user.username; this.enabled = user.enabled; this.profilePic = user.profilePic; - this.groups = user.groups; + this.groups = new Array(); this.permissions = user.allPermissions; - if (this.groups) { - this.groups.forEach(function (g) { delete g.permissions }); + if (user.groups) { + for (let group of user.groups) { + delete group.permissions; + this.groups.push(group.toResponse()); + } } } } diff --git a/src/models/responses/ResponseUserGroup.ts b/src/models/responses/ResponseUserGroup.ts index 9d1923f..e6f00bb 100644 --- a/src/models/responses/ResponseUserGroup.ts +++ b/src/models/responses/ResponseUserGroup.ts @@ -1,8 +1,8 @@ import { IsArray, IsNotEmpty, IsOptional, IsString } from "class-validator"; -import { Permission } from '../entities/Permission'; import { UserGroup } from '../entities/UserGroup'; import { ResponseObjectType } from '../enums/ResponseObjectType'; import { IResponse } from './IResponse'; +import { ResponsePermission } from './ResponsePermission'; import { ResponsePrincipal } from './ResponsePrincipal'; /** @@ -34,7 +34,7 @@ export class ResponseUserGroup extends ResponsePrincipal implements IResponse { */ @IsArray() @IsOptional() - permissions: Permission[]; + permissions: ResponsePermission[]; /** * Creates a ResponseUserGroup object from a userGroup. @@ -44,6 +44,10 @@ export class ResponseUserGroup extends ResponsePrincipal implements IResponse { super(group); this.name = group.name; this.description = group.description; - this.permissions = group.permissions; + if (group.permissions) { + for (let permission of group.permissions) { + this.permissions.push(permission.toResponse()); + } + } } }