Merge pull request 'Alpha Release 0.4.1' (#134) from dev into main
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details

Reviewed-on: #134
Reviewed-by: Philipp Dormann <philipp@philippdormann.de>
This commit is contained in:
Nicolai Ort 2021-01-30 15:59:51 +00:00
commit 71cab4e836
56 changed files with 519 additions and 5537 deletions

View File

@ -2,20 +2,34 @@
All notable changes to this project will be documented in this file. Dates are displayed in UTC. All notable changes to this project will be documented in this file. Dates are displayed in UTC.
#### [v0.4.1](https://git.odit.services/lfk/backend/compare/v0.4.0...v0.4.1)
- Deleted useless file [ci skip] [`94dd796`](https://git.odit.services/lfk/backend/commit/94dd7963b73d98089f086175ed79002f59195c26)
- Implemented the interface in all responses [`9d5e486`](https://git.odit.services/lfk/backend/commit/9d5e486c6ddb4db87d36409fbd8bca1bf9659e9f)
- Adjusted tests for the new responseType parameter (part 1) [`bcc15e4`](https://git.odit.services/lfk/backend/commit/bcc15e42863b641b97cd03440f141332e112c889)
- Cleaned up realations regarding response classes [`ff7406e`](https://git.odit.services/lfk/backend/commit/ff7406e71a4a76670d381b415bfb66f602e1206b)
- Added Responseobjecttype enum [`581ca5f`](https://git.odit.services/lfk/backend/commit/581ca5ff6c67ed1c701c06532671441293ee0706)
- 🧾New changelog file version [CI SKIP] [skip ci] [`0229534`](https://git.odit.services/lfk/backend/commit/02295346dad109745faa492dc968abbc98522804)
- Dependency bump🔝 [skip ci] [`3d1baae`](https://git.odit.services/lfk/backend/commit/3d1baae0cce26b0c1f6948778b15f4b0097a77a9)
- 🧾New changelog file version [CI SKIP] [skip ci] [`7ba67b9`](https://git.odit.services/lfk/backend/commit/7ba67b9dcab7692c8c1e548ccbc3895eb084eedd)
- Adjusted tests for the new responseType parameter (part 3) [`8dc2810`](https://git.odit.services/lfk/backend/commit/8dc2810c0c4097e26bf1b517bb9d0b102494f6c1)
- Added a Response interface [`e44cc4c`](https://git.odit.services/lfk/backend/commit/e44cc4c4cbecdf7c8d90f0af73fffd8b01eba61e)
- Adjusted tests for the new responseType parameter (part 2) [`ff8af09`](https://git.odit.services/lfk/backend/commit/ff8af090e3ea1760fb6110284cff870a0b4cbf84)
- 🚀Bumped version to v0.4.1 [`c32fa93`](https://git.odit.services/lfk/backend/commit/c32fa93673010ab18e009ab24fc139ed4f67310e)
- Merge pull request 'Response object types feature/132-object_types' (#133) from feature/132-object_types into dev [`6e5f1bd`](https://git.odit.services/lfk/backend/commit/6e5f1bd5ff217a88ec2dfaf154e5e26dee588e12)
- Fixed typos and missing types [`2a87819`](https://git.odit.services/lfk/backend/commit/2a878194865d406123805659c011c329c955f669)
#### [v0.4.0](https://git.odit.services/lfk/backend/compare/v0.3.1...v0.4.0) #### [v0.4.0](https://git.odit.services/lfk/backend/compare/v0.3.1...v0.4.0)
> 30 January 2021
- Merge pull request 'Alpha Release 0.4.0' (#131) from dev into main [`c4ea808`](https://git.odit.services/lfk/backend/commit/c4ea808e06bdc68add5636346f99a7d292852ab0)
- Added pw reset template provided by @philipp [`c116338`](https://git.odit.services/lfk/backend/commit/c116338cd74cf726362f8fa0ae5eea7ec9fabac4)
- Added test mail templates [`8270029`](https://git.odit.services/lfk/backend/commit/827002989ee6e3f0d776b5b55b8fb6d65f10c898) - Added test mail templates [`8270029`](https://git.odit.services/lfk/backend/commit/827002989ee6e3f0d776b5b55b8fb6d65f10c898)
- 🧾New changelog file version [CI SKIP] [skip ci] [`09b24aa`](https://git.odit.services/lfk/backend/commit/09b24aa6094a980debf4428a1c32583cdb7b606f) - 🧾New changelog file version [CI SKIP] [skip ci] [`09b24aa`](https://git.odit.services/lfk/backend/commit/09b24aa6094a980debf4428a1c32583cdb7b606f)
- Table fix [`1f0c842`](https://git.odit.services/lfk/backend/commit/1f0c842d9e086456f1ae0f6908e474258a04beb4)
- 🧾New changelog file version [CI SKIP] [skip ci] [`fea4857`](https://git.odit.services/lfk/backend/commit/fea485768570eb5de2bbd2783e339794a67db2de)
- 🧾New changelog file version [CI SKIP] [skip ci] [`e07f258`](https://git.odit.services/lfk/backend/commit/e07f258a315898d1183c311e7fcd8f65a415504c)
- 🚀Bumped version to v0.4.0 [`e5f4f6e`](https://git.odit.services/lfk/backend/commit/e5f4f6ee590e0885d6eef9151ce7eb76578b70ca)
- Merge pull request 'Implemented testmail endpoint feature/124-testmail' (#130) from feature/124-testmail into dev [`f9e75d0`](https://git.odit.services/lfk/backend/commit/f9e75d06b8ee8ff79f60fb384cb2c35ccf19811d)
- Merge pull request 'Email Basics feature/118-emails' (#128) from feature/118-emails into dev [`348e6cd`](https://git.odit.services/lfk/backend/commit/348e6cdec7411345953243edfb5322a17ad7614d)
- Merge pull request 'Mail+Env documentation feature/123-mail_documentation' (#129) from feature/123-mail_documentation into dev [`61bbeb0`](https://git.odit.services/lfk/backend/commit/61bbeb0d8f3fd6bfafb65bd11eb4c076a27b4a53)
- Added pw reset template provided by @philipp [`c116338`](https://git.odit.services/lfk/backend/commit/c116338cd74cf726362f8fa0ae5eea7ec9fabac4)
- Implemented automatic ci env generation [`536de2a`](https://git.odit.services/lfk/backend/commit/536de2a3199b1befed54b6fe520a2e3fcefe0d90) - Implemented automatic ci env generation [`536de2a`](https://git.odit.services/lfk/backend/commit/536de2a3199b1befed54b6fe520a2e3fcefe0d90)
- Implemented a basic mailer with reset link sending [`6379753`](https://git.odit.services/lfk/backend/commit/637975305f1adf9bf505507790638cf1e229cfb1) - Implemented a basic mailer with reset link sending [`6379753`](https://git.odit.services/lfk/backend/commit/637975305f1adf9bf505507790638cf1e229cfb1)
- Table fix [`1f0c842`](https://git.odit.services/lfk/backend/commit/1f0c842d9e086456f1ae0f6908e474258a04beb4)
- Implemented the test-mail endpoint via a new mailcontroller [`54ed313`](https://git.odit.services/lfk/backend/commit/54ed313342a72b029b9545bc5ea193e3f0c2166d) - Implemented the test-mail endpoint via a new mailcontroller [`54ed313`](https://git.odit.services/lfk/backend/commit/54ed313342a72b029b9545bc5ea193e3f0c2166d)
- Added documentation for the env vars [`13ccab5`](https://git.odit.services/lfk/backend/commit/13ccab5e289d0a629cefb7fe281a85a46058ae97) - Added documentation for the env vars [`13ccab5`](https://git.odit.services/lfk/backend/commit/13ccab5e289d0a629cefb7fe281a85a46058ae97)
- Added comments [`9bd7636`](https://git.odit.services/lfk/backend/commit/9bd7636a23b5a9662ea2b965d2a2407727a188fb) - Added comments [`9bd7636`](https://git.odit.services/lfk/backend/commit/9bd7636a23b5a9662ea2b965d2a2407727a188fb)
@ -24,8 +38,15 @@ All notable changes to this project will be documented in this file. Dates are d
- Implementes mail sending on pw reset request [`e26744b`](https://git.odit.services/lfk/backend/commit/e26744b7925d32d65ef4cc3911651758cfc9274f) - Implementes mail sending on pw reset request [`e26744b`](https://git.odit.services/lfk/backend/commit/e26744b7925d32d65ef4cc3911651758cfc9274f)
- Added a txt variant of the pw-reset mail [`d3647e3`](https://git.odit.services/lfk/backend/commit/d3647e339990d989dbca4d91aa8c3fe5789dd24a) - Added a txt variant of the pw-reset mail [`d3647e3`](https://git.odit.services/lfk/backend/commit/d3647e339990d989dbca4d91aa8c3fe5789dd24a)
- Changed order [`583a4bc`](https://git.odit.services/lfk/backend/commit/583a4bc0dd0de8026bb2eb6a9b0c31f59344e813) - Changed order [`583a4bc`](https://git.odit.services/lfk/backend/commit/583a4bc0dd0de8026bb2eb6a9b0c31f59344e813)
- 🧾New changelog file version [CI SKIP] [skip ci] [`fea4857`](https://git.odit.services/lfk/backend/commit/fea485768570eb5de2bbd2783e339794a67db2de)
- Translated the pw reset mail to english [`5cade25`](https://git.odit.services/lfk/backend/commit/5cade25eeb137eb5890b3fd450646acfbdff2e8b) - Translated the pw reset mail to english [`5cade25`](https://git.odit.services/lfk/backend/commit/5cade25eeb137eb5890b3fd450646acfbdff2e8b)
- The auth tests now use mail to identify the user [`c43334b`](https://git.odit.services/lfk/backend/commit/c43334bf96901bfd5116301ff7cf4b2ae1dfcbd3) - The auth tests now use mail to identify the user [`c43334b`](https://git.odit.services/lfk/backend/commit/c43334bf96901bfd5116301ff7cf4b2ae1dfcbd3)
- 🧾New changelog file version [CI SKIP] [skip ci] [`e07f258`](https://git.odit.services/lfk/backend/commit/e07f258a315898d1183c311e7fcd8f65a415504c)
- 🧾New changelog file version [CI SKIP] [skip ci] [`b972395`](https://git.odit.services/lfk/backend/commit/b972395ae8bb06184baa56296a3b8bfc16ae96a7)
- 🚀Bumped version to v0.4.0 [`e5f4f6e`](https://git.odit.services/lfk/backend/commit/e5f4f6ee590e0885d6eef9151ce7eb76578b70ca)
- Merge pull request 'Implemented testmail endpoint feature/124-testmail' (#130) from feature/124-testmail into dev [`f9e75d0`](https://git.odit.services/lfk/backend/commit/f9e75d06b8ee8ff79f60fb384cb2c35ccf19811d)
- Merge pull request 'Email Basics feature/118-emails' (#128) from feature/118-emails into dev [`348e6cd`](https://git.odit.services/lfk/backend/commit/348e6cdec7411345953243edfb5322a17ad7614d)
- Merge pull request 'Mail+Env documentation feature/123-mail_documentation' (#129) from feature/123-mail_documentation into dev [`61bbeb0`](https://git.odit.services/lfk/backend/commit/61bbeb0d8f3fd6bfafb65bd11eb4c076a27b4a53)
- Added a test mail sending function [`b94179e`](https://git.odit.services/lfk/backend/commit/b94179e3caaf4be0654ca3372f57a490fb32e208) - Added a test mail sending function [`b94179e`](https://git.odit.services/lfk/backend/commit/b94179e3caaf4be0654ca3372f57a490fb32e208)
- Added the first mail error [`c418603`](https://git.odit.services/lfk/backend/commit/c4186034233a296b5971fbef16e7ef6809fbac51) - Added the first mail error [`c418603`](https://git.odit.services/lfk/backend/commit/c4186034233a296b5971fbef16e7ef6809fbac51)
- Now also sending txt mail body [`b92f633`](https://git.odit.services/lfk/backend/commit/b92f633d68604636cecc5e9fdd0d6990b9cb83fe) - Now also sending txt mail body [`b92f633`](https://git.odit.services/lfk/backend/commit/b92f633d68604636cecc5e9fdd0d6990b9cb83fe)

View File

@ -1,6 +1,6 @@
{ {
"name": "@odit/lfk-backend", "name": "@odit/lfk-backend",
"version": "0.4.0", "version": "0.4.1",
"main": "src/app.ts", "main": "src/app.ts",
"repository": "https://git.odit.services/lfk/backend", "repository": "https://git.odit.services/lfk/backend",
"author": { "author": {
@ -35,7 +35,7 @@
"dotenv": "^8.2.0", "dotenv": "^8.2.0",
"express": "^4.17.1", "express": "^4.17.1",
"jsonwebtoken": "^8.5.1", "jsonwebtoken": "^8.5.1",
"libphonenumber-js": "^1.9.7", "libphonenumber-js": "^1.9.9",
"mysql": "^2.18.1", "mysql": "^2.18.1",
"nodemailer": "^6.4.17", "nodemailer": "^6.4.17",
"pg": "^8.5.1", "pg": "^8.5.1",
@ -43,7 +43,7 @@
"routing-controllers": "^0.9.0-alpha.6", "routing-controllers": "^0.9.0-alpha.6",
"routing-controllers-openapi": "^2.2.0", "routing-controllers-openapi": "^2.2.0",
"sqlite3": "5.0.0", "sqlite3": "5.0.0",
"typeorm": "^0.2.29", "typeorm": "^0.2.30",
"typeorm-routing-controllers-extensions": "^0.2.0", "typeorm-routing-controllers-extensions": "^0.2.0",
"typeorm-seeding": "^1.6.1", "typeorm-seeding": "^1.6.1",
"uuid": "^8.3.2", "uuid": "^8.3.2",
@ -53,10 +53,10 @@
"@odit/license-exporter": "^0.0.9", "@odit/license-exporter": "^0.0.9",
"@types/cors": "^2.8.9", "@types/cors": "^2.8.9",
"@types/csvtojson": "^1.1.5", "@types/csvtojson": "^1.1.5",
"@types/express": "^4.17.9", "@types/express": "^4.17.11",
"@types/jest": "^26.0.16", "@types/jest": "^26.0.20",
"@types/jsonwebtoken": "^8.5.0", "@types/jsonwebtoken": "^8.5.0",
"@types/node": "^14.14.20", "@types/node": "^14.14.22",
"@types/nodemailer": "^6.4.0", "@types/nodemailer": "^6.4.0",
"@types/uuid": "^8.3.0", "@types/uuid": "^8.3.0",
"axios": "^0.21.1", "axios": "^0.21.1",
@ -66,9 +66,9 @@
"release-it": "^14.2.2", "release-it": "^14.2.2",
"rimraf": "^3.0.2", "rimraf": "^3.0.2",
"start-server-and-test": "^1.11.7", "start-server-and-test": "^1.11.7",
"ts-jest": "^26.4.4", "ts-jest": "^26.5.0",
"ts-node": "^9.1.1", "ts-node": "^9.1.1",
"typedoc": "^0.20.14", "typedoc": "^0.20.19",
"typescript": "^4.1.3" "typescript": "^4.1.3"
}, },
"scripts": { "scripts": {

View File

@ -78,7 +78,7 @@ export class DonationController {
async postDistance(@Body({ validate: true }) createDonation: CreateDistanceDonation) { async postDistance(@Body({ validate: true }) createDonation: CreateDistanceDonation) {
let donation = await createDonation.toEntity(); let donation = await createDonation.toEntity();
donation = await this.distanceDonationRepository.save(donation); 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') @Put('/fixed/:id')
@ -124,7 +124,7 @@ export class DonationController {
} }
await this.distanceDonationRepository.save(await donation.update(oldDonation)); 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') @Delete('/:id')

View File

@ -36,7 +36,7 @@ export class ScanController {
@OpenAPI({ description: 'Lists all scans (normal or track) from all runners. <br> This includes the scan\'s runner\'s distance ran.' }) @OpenAPI({ description: 'Lists all scans (normal or track) from all runners. <br> This includes the scan\'s runner\'s distance ran.' })
async getAll() { async getAll() {
let responseScans: ResponseScan[] = new Array<ResponseScan>(); let responseScans: ResponseScan[] = new Array<ResponseScan>();
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 => { scans.forEach(scan => {
responseScans.push(scan.toResponse()); responseScans.push(scan.toResponse());
}); });
@ -51,7 +51,7 @@ export class ScanController {
@OnUndefined(ScanNotFoundError) @OnUndefined(ScanNotFoundError)
@OpenAPI({ description: 'Lists all information about the scan whose id got provided. This includes the scan\'s runner\'s distance ran.' }) @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) { 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(); } if (!scan) { throw new ScanNotFoundError(); }
return scan.toResponse(); return scan.toResponse();
} }
@ -64,7 +64,7 @@ export class ScanController {
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);
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") @Post("/trackscans")
@ -75,7 +75,7 @@ export class ScanController {
async postTrackScans(@Body({ validate: true }) createScan: CreateTrackScan) { async postTrackScans(@Body({ validate: true }) createScan: CreateTrackScan) {
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.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') @Put('/:id')
@ -97,7 +97,7 @@ export class ScanController {
} }
await this.scanRepository.save(await scan.update(oldScan)); 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') @Put('/trackscans/:id')
@ -120,7 +120,7 @@ export class ScanController {
} }
await this.trackScanRepository.save(await scan.update(oldScan)); 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') @Delete('/:id')
@ -132,7 +132,7 @@ export class ScanController {
async remove(@Param("id") id: number, @QueryParam("force") force: boolean) { async remove(@Param("id") id: number, @QueryParam("force") force: boolean) {
let scan = await this.scanRepository.findOne({ id: id }); let scan = await this.scanRepository.findOne({ id: id });
if (!scan) { return null; } 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); await this.scanRepository.delete(scan);
return responseScan.toResponse(); return responseScan.toResponse();

View File

@ -4,7 +4,6 @@ import {
IsString IsString
} from "class-validator"; } from "class-validator";
import { ChildEntity, Column } from "typeorm"; import { ChildEntity, Column } from "typeorm";
import { ResponsePrincipal } from '../responses/ResponsePrincipal';
import { ResponseUserGroup } from '../responses/ResponseUserGroup'; import { ResponseUserGroup } from '../responses/ResponseUserGroup';
import { Principal } from './Principal'; import { Principal } from './Principal';
@ -34,7 +33,7 @@ export class UserGroup extends Principal {
/** /**
* Turns this entity into it's response class. * Turns this entity into it's response class.
*/ */
public toResponse(): ResponsePrincipal { public toResponse(): ResponseUserGroup {
return new ResponseUserGroup(this); return new ResponseUserGroup(this);
} }
} }

View File

@ -0,0 +1,34 @@
/**
* 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',
SELFSERVICERUNNER = 'SELFSERVICRUNNER',
STATS = 'STATS',
STATSCLIENT = 'STATSCLIENT',
STATSORGANIZATION = 'STATSORGANIZATION',
STATSRUNNER = 'STATSRUNNER',
STATSTEAM = 'STATSTEAM',
TRACK = 'TRACK',
TRACKSCAN = 'TRACKSCAN',
USER = 'USER',
USERGROUP = 'USERGROUP',
USERPERMISSIONS = 'USERPERMISSIONS',
}

View File

@ -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;
}

View File

@ -1,9 +1,18 @@
import { IsInt, IsString } from 'class-validator'; import { IsInt, IsString } from 'class-validator';
import { ResponseObjectType } from '../enums/ResponseObjectType';
import { IResponse } from './IResponse';
/** /**
* Defines the repsonse auth. * 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. * The access_token - JWT shortterm access token.
*/ */

View File

@ -1,12 +1,19 @@
import { IsInt, IsObject, IsPositive } from 'class-validator'; import { IsInt, IsObject, IsPositive } from 'class-validator';
import { DistanceDonation } from '../entities/DistanceDonation'; import { DistanceDonation } from '../entities/DistanceDonation';
import { ResponseObjectType } from '../enums/ResponseObjectType';
import { IResponse } from './IResponse';
import { ResponseDonation } from './ResponseDonation'; import { ResponseDonation } from './ResponseDonation';
import { ResponseRunner } from './ResponseRunner'; import { ResponseRunner } from './ResponseRunner';
/** /**
* Defines the distance donation response. * 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. * The donation's associated runner.
@ -29,7 +36,7 @@ export class ResponseDistanceDonation extends ResponseDonation {
*/ */
public constructor(donation: DistanceDonation) { public constructor(donation: DistanceDonation) {
super(donation); super(donation);
this.runner = donation.runner.toResponse(); if (donation.runner) { this.runner = donation.runner.toResponse(); }
this.amountPerDistance = donation.amountPerDistance; this.amountPerDistance = donation.amountPerDistance;
} }
} }

View File

@ -1,11 +1,20 @@
import { IsInt, IsNotEmpty, IsPositive } from "class-validator"; import { IsInt, IsNotEmpty, IsPositive } from "class-validator";
import { Donation } from '../entities/Donation'; import { Donation } from '../entities/Donation';
import { ResponseObjectType } from '../enums/ResponseObjectType';
import { IResponse } from './IResponse';
import { ResponseDonor } from './ResponseDonor'; import { ResponseDonor } from './ResponseDonor';
/** /**
* Defines the donation response. * 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. * The donation's id.
*/ */

View File

@ -2,12 +2,19 @@ import {
IsBoolean, IsInt IsBoolean, IsInt
} from "class-validator"; } from "class-validator";
import { Donor } from '../entities/Donor'; import { Donor } from '../entities/Donor';
import { ResponseObjectType } from '../enums/ResponseObjectType';
import { IResponse } from './IResponse';
import { ResponseParticipant } from './ResponseParticipant'; import { ResponseParticipant } from './ResponseParticipant';
/** /**
* Defines the donor response. * 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? * Does this donor need a receipt?

View File

@ -1,9 +1,17 @@
import { IsString } from 'class-validator'; import { IsString } from 'class-validator';
import { ResponseObjectType } from '../enums/ResponseObjectType';
import { IResponse } from './IResponse';
/** /**
* Defines a empty response object. * 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() @IsString()
response: string = "nothing here" response: string = "nothing here"
} }

View File

@ -1,12 +1,20 @@
import { IsInt, IsObject, IsString } from "class-validator"; import { IsInt, IsObject, IsString } from "class-validator";
import { Address } from '../entities/Address'; import { Address } from '../entities/Address';
import { GroupContact } from '../entities/GroupContact'; import { GroupContact } from '../entities/GroupContact';
import { ResponseObjectType } from '../enums/ResponseObjectType';
import { IResponse } from './IResponse';
import { ResponseRunnerGroup } from './ResponseRunnerGroup'; import { ResponseRunnerGroup } from './ResponseRunnerGroup';
/** /**
* Defines the group contact response. * 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. * The contact's id.
*/ */
@ -69,8 +77,10 @@ export class ResponseGroupContact {
this.email = contact.email; this.email = contact.email;
this.address = contact.address; this.address = contact.address;
this.groups = new Array<ResponseRunnerGroup>(); this.groups = new Array<ResponseRunnerGroup>();
for (let group of contact.groups) { if (contact.groups) {
this.groups.push(group.toResponse()); for (let group of contact.groups) {
this.groups.push(group.toResponse());
}
} }
} }
} }

View File

@ -1,9 +1,17 @@
import { IsString } from 'class-validator'; import { IsString } from 'class-validator';
import { ResponseObjectType } from '../enums/ResponseObjectType';
import { IResponse } from './IResponse';
/** /**
* Defines the logout response. * 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. * The logout's timestamp.
*/ */

View File

@ -1,11 +1,19 @@
import { IsInt, IsObject, IsOptional, IsString } from "class-validator"; import { IsInt, IsObject, IsOptional, IsString } from "class-validator";
import { Address } from '../entities/Address'; import { Address } from '../entities/Address';
import { Participant } from '../entities/Participant'; import { Participant } from '../entities/Participant';
import { ResponseObjectType } from '../enums/ResponseObjectType';
import { IResponse } from './IResponse';
/** /**
* Defines the participant response. * 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. * The participant's id.
*/ */

View File

@ -7,12 +7,20 @@ import {
import { Permission } from '../entities/Permission'; import { Permission } from '../entities/Permission';
import { PermissionAction } from '../enums/PermissionAction'; import { PermissionAction } from '../enums/PermissionAction';
import { PermissionTarget } from '../enums/PermissionTargets'; import { PermissionTarget } from '../enums/PermissionTargets';
import { ResponseObjectType } from '../enums/ResponseObjectType';
import { IResponse } from './IResponse';
import { ResponsePrincipal } from './ResponsePrincipal'; import { ResponsePrincipal } from './ResponsePrincipal';
/** /**
* Defines the permission response. * 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. * The permission's id.
*/ */

View File

@ -2,11 +2,19 @@ import {
IsInt IsInt
} from "class-validator"; } from "class-validator";
import { Principal } from '../entities/Principal'; import { Principal } from '../entities/Principal';
import { ResponseObjectType } from '../enums/ResponseObjectType';
import { IResponse } from './IResponse';
/** /**
* Defines the principal response. * 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. * The principal's id.

View File

@ -3,13 +3,20 @@ import {
IsObject IsObject
} from "class-validator"; } from "class-validator";
import { Runner } from '../entities/Runner'; import { Runner } from '../entities/Runner';
import { RunnerGroup } from '../entities/RunnerGroup'; import { ResponseObjectType } from '../enums/ResponseObjectType';
import { IResponse } from './IResponse';
import { ResponseParticipant } from './ResponseParticipant'; import { ResponseParticipant } from './ResponseParticipant';
import { ResponseRunnerGroup } from './ResponseRunnerGroup';
/** /**
* Defines the runner response. * 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. * The runner's currently ran distance in meters.
@ -21,7 +28,7 @@ export class ResponseRunner extends ResponseParticipant {
* The runner's group. * The runner's group.
*/ */
@IsObject() @IsObject()
group: RunnerGroup; group: ResponseRunnerGroup;
/** /**
* Creates a ResponseRunner object from a runner. * Creates a ResponseRunner object from a runner.
@ -31,6 +38,6 @@ export class ResponseRunner extends ResponseParticipant {
super(runner); super(runner);
if (!runner.scans) { this.distance = 0 } if (!runner.scans) { this.distance = 0 }
else { this.distance = runner.validScans.reduce((sum, current) => sum + current.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(); }
} }
} }

View File

@ -1,11 +1,19 @@
import { IsBoolean, IsEAN, IsInt, IsNotEmpty, IsObject, IsString } from "class-validator"; import { IsBoolean, IsEAN, IsInt, IsNotEmpty, IsObject, IsString } from "class-validator";
import { RunnerCard } from '../entities/RunnerCard'; import { RunnerCard } from '../entities/RunnerCard';
import { ResponseObjectType } from '../enums/ResponseObjectType';
import { IResponse } from './IResponse';
import { ResponseRunner } from './ResponseRunner'; import { ResponseRunner } from './ResponseRunner';
/** /**
* Defines the runner card response. * 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. * The card's id.
*/ */

View File

@ -1,11 +1,19 @@
import { IsInt, IsNotEmpty, IsObject, IsOptional, IsString } from "class-validator"; import { IsInt, IsNotEmpty, IsObject, IsOptional, IsString } from "class-validator";
import { GroupContact } from '../entities/GroupContact';
import { RunnerGroup } from '../entities/RunnerGroup'; import { RunnerGroup } from '../entities/RunnerGroup';
import { ResponseObjectType } from '../enums/ResponseObjectType';
import { IResponse } from './IResponse';
import { ResponseGroupContact } from './ResponseGroupContact';
/** /**
* Defines the runnerGroup response. * 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. * The runnerGroup's id.
*/ */
@ -26,7 +34,7 @@ export abstract class ResponseRunnerGroup {
*/ */
@IsObject() @IsObject()
@IsOptional() @IsOptional()
contact?: GroupContact; contact?: ResponseGroupContact;
/** /**
* Creates a ResponseRunnerGroup object from a runnerGroup. * Creates a ResponseRunnerGroup object from a runnerGroup.
@ -35,6 +43,6 @@ export abstract class ResponseRunnerGroup {
public constructor(group: RunnerGroup) { public constructor(group: RunnerGroup) {
this.id = group.id; this.id = group.id;
this.name = group.name; this.name = group.name;
this.contact = group.contact; if (group.contact) { this.contact = group.contact.toResponse(); };
} }
} }

View File

@ -11,13 +11,20 @@ import {
} from "class-validator"; } from "class-validator";
import { Address } from '../entities/Address'; import { Address } from '../entities/Address';
import { RunnerOrganization } from '../entities/RunnerOrganization'; import { RunnerOrganization } from '../entities/RunnerOrganization';
import { RunnerTeam } from '../entities/RunnerTeam'; import { ResponseObjectType } from '../enums/ResponseObjectType';
import { IResponse } from './IResponse';
import { ResponseRunnerGroup } from './ResponseRunnerGroup'; import { ResponseRunnerGroup } from './ResponseRunnerGroup';
import { ResponseRunnerTeam } from './ResponseRunnerTeam';
/** /**
* Defines the runnerOrganization response. * 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. * The runnerOrganization's address.
@ -30,7 +37,7 @@ export class ResponseRunnerOrganization extends ResponseRunnerGroup {
* The runnerOrganization associated teams. * The runnerOrganization associated teams.
*/ */
@IsArray() @IsArray()
teams: RunnerTeam[]; teams: ResponseRunnerTeam[];
/** /**
* The organization's registration key. * The organization's registration key.
@ -55,7 +62,13 @@ export class ResponseRunnerOrganization extends ResponseRunnerGroup {
public constructor(org: RunnerOrganization) { public constructor(org: RunnerOrganization) {
super(org); super(org);
this.address = org.address; this.address = org.address;
this.teams = org.teams; this.teams = new Array<ResponseRunnerTeam>();
if (org.teams) {
for (let team of org.teams) {
this.teams.push(team.toResponse());
}
}
if (!org.key) { this.registrationEnabled = false; } if (!org.key) { this.registrationEnabled = false; }
else { this.registrationKey = Buffer.from(org.key).toString('base64'); } else { this.registrationKey = Buffer.from(org.key).toString('base64'); }
} }

View File

@ -1,12 +1,19 @@
import { IsNotEmpty, IsObject } from "class-validator"; import { IsNotEmpty, IsObject } from "class-validator";
import { RunnerTeam } from '../entities/RunnerTeam'; import { RunnerTeam } from '../entities/RunnerTeam';
import { ResponseObjectType } from '../enums/ResponseObjectType';
import { IResponse } from './IResponse';
import { ResponseRunnerGroup } from './ResponseRunnerGroup'; import { ResponseRunnerGroup } from './ResponseRunnerGroup';
import { ResponseRunnerOrganization } from './ResponseRunnerOrganization'; import { ResponseRunnerOrganization } from './ResponseRunnerOrganization';
/** /**
* Defines the runnerTeam response. * 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). * The runnerTeam's parent group (organization).
@ -21,6 +28,6 @@ export class ResponseRunnerTeam extends ResponseRunnerGroup {
*/ */
public constructor(team: RunnerTeam) { public constructor(team: RunnerTeam) {
super(team); super(team);
this.parentGroup = team.parentGroup.toResponse(); if (team.parentGroup) { this.parentGroup = team.parentGroup.toResponse(); }
} }
} }

View File

@ -1,11 +1,19 @@
import { IsBoolean, IsInt, IsNotEmpty, IsPositive } from "class-validator"; import { IsBoolean, IsInt, IsNotEmpty, IsPositive } from "class-validator";
import { Scan } from '../entities/Scan'; import { Scan } from '../entities/Scan';
import { ResponseObjectType } from '../enums/ResponseObjectType';
import { IResponse } from './IResponse';
import { ResponseRunner } from './ResponseRunner'; import { ResponseRunner } from './ResponseRunner';
/** /**
* Defines the scan response. * 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. * The scans's id.
*/ */
@ -39,7 +47,7 @@ export class ResponseScan {
*/ */
public constructor(scan: Scan) { public constructor(scan: Scan) {
this.id = scan.id; this.id = scan.id;
this.runner = scan.runner.toResponse(); if (scan.runner) { this.runner = scan.runner.toResponse(); }
this.distance = scan.distance; this.distance = scan.distance;
this.valid = scan.valid; this.valid = scan.valid;
} }

View File

@ -11,12 +11,20 @@ import {
IsString IsString
} from "class-validator"; } from "class-validator";
import { ScanStation } from '../entities/ScanStation'; import { ScanStation } from '../entities/ScanStation';
import { ResponseObjectType } from '../enums/ResponseObjectType';
import { IResponse } from './IResponse';
import { ResponseTrack } from './ResponseTrack'; import { ResponseTrack } from './ResponseTrack';
/** /**
* Defines the statsClient response. * 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. * The client's id.
*/ */
@ -64,7 +72,7 @@ export class ResponseScanStation {
this.description = station.description; this.description = station.description;
this.prefix = station.prefix; this.prefix = station.prefix;
this.key = "Only visible on creation."; this.key = "Only visible on creation.";
this.track = station.track; if (station.track) { this.track = station.track.toResponse(); }
this.enabled = station.enabled; this.enabled = station.enabled;
} }
} }

View File

@ -1,11 +1,19 @@
import { IsInt, IsNotEmpty, IsPositive } from 'class-validator'; import { IsInt, IsNotEmpty, IsPositive } from 'class-validator';
import { DistanceDonation } from '../entities/DistanceDonation'; import { DistanceDonation } from '../entities/DistanceDonation';
import { ResponseObjectType } from '../enums/ResponseObjectType';
import { IResponse } from './IResponse';
/** /**
* Defines the runner selfservice donation response. * Defines the runner selfservice donation response.
* Why? B/C runner's are not allowed to view all information available to admin users. * 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. * The donation's donor.
*/ */

View File

@ -3,6 +3,8 @@ import { DistanceDonation } from '../entities/DistanceDonation';
import { Runner } from '../entities/Runner'; import { Runner } from '../entities/Runner';
import { RunnerGroup } from '../entities/RunnerGroup'; import { RunnerGroup } from '../entities/RunnerGroup';
import { RunnerTeam } from '../entities/RunnerTeam'; import { RunnerTeam } from '../entities/RunnerTeam';
import { ResponseObjectType } from '../enums/ResponseObjectType';
import { IResponse } from './IResponse';
import { ResponseParticipant } from './ResponseParticipant'; import { ResponseParticipant } from './ResponseParticipant';
import { ResponseSelfServiceDonation } from './ResponseSelfServiceDonation'; import { ResponseSelfServiceDonation } from './ResponseSelfServiceDonation';
@ -10,7 +12,12 @@ import { ResponseSelfServiceDonation } from './ResponseSelfServiceDonation';
* Defines the runner selfservice response. * Defines the runner selfservice response.
* Why? B/C runner's are not allowed to view all information available to admin users. * 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. * The runner's currently ran distance in meters.

View File

@ -7,12 +7,20 @@ import { RunnerOrganization } from '../entities/RunnerOrganization';
import { RunnerTeam } from '../entities/RunnerTeam'; import { RunnerTeam } from '../entities/RunnerTeam';
import { Scan } from '../entities/Scan'; import { Scan } from '../entities/Scan';
import { User } from '../entities/User'; import { User } from '../entities/User';
import { ResponseObjectType } from '../enums/ResponseObjectType';
import { IResponse } from './IResponse';
/** /**
* Defines the stats response. * Defines the stats response.
* The stats response calculates some basic stats for a dashboard or public display. * 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. * The amount of runners registered in the system.
*/ */

View File

@ -8,11 +8,19 @@ import {
IsString IsString
} from "class-validator"; } from "class-validator";
import { StatsClient } from '../entities/StatsClient'; import { StatsClient } from '../entities/StatsClient';
import { ResponseObjectType } from '../enums/ResponseObjectType';
import { IResponse } from './IResponse';
/** /**
* Defines the statsClient response. * 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. * The client's id.
*/ */

View File

@ -4,12 +4,20 @@ import {
IsString IsString
} from "class-validator"; } from "class-validator";
import { RunnerOrganization } from '../entities/RunnerOrganization'; import { RunnerOrganization } from '../entities/RunnerOrganization';
import { ResponseObjectType } from '../enums/ResponseObjectType';
import { IResponse } from './IResponse';
/** /**
* Defines the org stats response. * Defines the org stats response.
* This differs from the normal org responce. * 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. * The orgs's id.
*/ */

View File

@ -4,13 +4,21 @@ import {
IsString IsString
} from "class-validator"; } from "class-validator";
import { Runner } from '../entities/Runner'; 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. * Defines the runner stats response.
* This differs from the normal runner responce. * 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. * The runner's id.
*/ */
@ -51,7 +59,7 @@ export class ResponseStatsRunner {
* The runner's group. * The runner's group.
*/ */
@IsObject() @IsObject()
group: RunnerGroup; group: ResponseRunnerGroup;
/** /**
* Creates a new runner stats response from a runner * Creates a new runner stats response from a runner
@ -64,6 +72,6 @@ export class ResponseStatsRunner {
this.lastname = runner.lastname; this.lastname = runner.lastname;
this.distance = runner.distance; this.distance = runner.distance;
this.donationAmount = runner.distanceDonationAmount; this.donationAmount = runner.distanceDonationAmount;
this.group = runner.group; this.group = runner.group.toResponse();
} }
} }

View File

@ -3,14 +3,22 @@ import {
IsObject, IsObject,
IsString IsString
} from "class-validator"; } from "class-validator";
import { RunnerGroup } from '../entities/RunnerGroup';
import { RunnerTeam } from '../entities/RunnerTeam'; import { RunnerTeam } from '../entities/RunnerTeam';
import { ResponseObjectType } from '../enums/ResponseObjectType';
import { IResponse } from './IResponse';
import { ResponseRunnerGroup } from './ResponseRunnerGroup';
/** /**
* Defines the team stats response. * Defines the team stats response.
* This differs from the normal team responce. * 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. * The team's id.
*/ */
@ -39,7 +47,7 @@ export class ResponseStatsTeam {
* The teams's parent group. * The teams's parent group.
*/ */
@IsObject() @IsObject()
parent: RunnerGroup; parent: ResponseRunnerGroup;
/** /**
* Creates a new team stats response from a team * Creates a new team stats response from a team
@ -48,7 +56,7 @@ export class ResponseStatsTeam {
public constructor(team: RunnerTeam) { public constructor(team: RunnerTeam) {
this.name = team.name; this.name = team.name;
this.id = team.id; this.id = team.id;
this.parent = team.parentGroup; this.parent = team.parentGroup.toResponse();
this.distance = team.distance; this.distance = team.distance;
this.donationAmount = team.distanceDonationAmount; this.donationAmount = team.distanceDonationAmount;
} }

View File

@ -1,11 +1,19 @@
import { IsInt, IsOptional, IsString } from "class-validator"; import { IsInt, IsOptional, IsString } from "class-validator";
import { TrackLapTimeCantBeNegativeError } from '../../errors/TrackErrors'; import { TrackLapTimeCantBeNegativeError } from '../../errors/TrackErrors';
import { Track } from '../entities/Track'; import { Track } from '../entities/Track';
import { ResponseObjectType } from '../enums/ResponseObjectType';
import { IResponse } from './IResponse';
/** /**
* Defines the track response. * 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. * The track's id.
*/ */

View File

@ -1,5 +1,7 @@
import { IsDateString, IsNotEmpty } from "class-validator"; import { IsDateString, IsNotEmpty } from "class-validator";
import { TrackScan } from '../entities/TrackScan'; import { TrackScan } from '../entities/TrackScan';
import { ResponseObjectType } from '../enums/ResponseObjectType';
import { IResponse } from './IResponse';
import { ResponseRunnerCard } from './ResponseRunnerCard'; import { ResponseRunnerCard } from './ResponseRunnerCard';
import { ResponseScan } from './ResponseScan'; import { ResponseScan } from './ResponseScan';
import { ResponseScanStation } from './ResponseScanStation'; import { ResponseScanStation } from './ResponseScanStation';
@ -8,10 +10,16 @@ import { ResponseTrack } from './ResponseTrack';
/** /**
* Defines the trackScan response. * 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() @IsNotEmpty()
track: ResponseTrack; track: ResponseTrack;
@ -41,8 +49,8 @@ export class ResponseTrackScan extends ResponseScan {
public constructor(scan: TrackScan) { public constructor(scan: TrackScan) {
super(scan); super(scan);
this.track = new ResponseTrack(scan.track); this.track = new ResponseTrack(scan.track);
this.card = scan.card.toResponse(); if (scan.card) { scan.card.toResponse(); }
this.station = scan.station.toResponse(); if (scan.station) { scan.station.toResponse(); }
this.timestamp = scan.timestamp; this.timestamp = scan.timestamp;
this.distance = scan.distance; this.distance = scan.distance;
} }

View File

@ -6,13 +6,21 @@ import {
IsString IsString
} from "class-validator"; } from "class-validator";
import { User } from '../entities/User'; import { User } from '../entities/User';
import { UserGroup } from '../entities/UserGroup'; import { ResponseObjectType } from '../enums/ResponseObjectType';
import { IResponse } from './IResponse';
import { ResponsePrincipal } from './ResponsePrincipal'; import { ResponsePrincipal } from './ResponsePrincipal';
import { ResponseUserGroup } from './ResponseUserGroup';
/** /**
* Defines the user response. * 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. * The user's first name.
*/ */
@ -66,7 +74,7 @@ export class ResponseUser extends ResponsePrincipal {
*/ */
@IsArray() @IsArray()
@IsOptional() @IsOptional()
groups: UserGroup[]; groups: ResponseUserGroup[];
/** /**
* The user's permissions. * The user's permissions.
@ -90,10 +98,13 @@ export class ResponseUser extends ResponsePrincipal {
this.username = user.username; this.username = user.username;
this.enabled = user.enabled; this.enabled = user.enabled;
this.profilePic = user.profilePic; this.profilePic = user.profilePic;
this.groups = user.groups; this.groups = new Array<ResponseUserGroup>();
this.permissions = user.allPermissions; this.permissions = user.allPermissions;
if (this.groups) { if (user.groups) {
this.groups.forEach(function (g) { delete g.permissions }); for (let group of user.groups) {
delete group.permissions;
this.groups.push(group.toResponse());
}
} }
} }
} }

View File

@ -1,12 +1,20 @@
import { IsArray, IsNotEmpty, IsOptional, IsString } from "class-validator"; import { IsArray, IsNotEmpty, IsOptional, IsString } from "class-validator";
import { Permission } from '../entities/Permission';
import { UserGroup } from '../entities/UserGroup'; import { UserGroup } from '../entities/UserGroup';
import { ResponseObjectType } from '../enums/ResponseObjectType';
import { IResponse } from './IResponse';
import { ResponsePermission } from './ResponsePermission';
import { ResponsePrincipal } from './ResponsePrincipal'; import { ResponsePrincipal } from './ResponsePrincipal';
/** /**
* Defines the userGroup response. * 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. * The userGroup's name.
*/ */
@ -26,7 +34,7 @@ export class ResponseUserGroup extends ResponsePrincipal {
*/ */
@IsArray() @IsArray()
@IsOptional() @IsOptional()
permissions: Permission[]; permissions: ResponsePermission[];
/** /**
* Creates a ResponseUserGroup object from a userGroup. * Creates a ResponseUserGroup object from a userGroup.
@ -36,6 +44,10 @@ export class ResponseUserGroup extends ResponsePrincipal {
super(group); super(group);
this.name = group.name; this.name = group.name;
this.description = group.description; this.description = group.description;
this.permissions = group.permissions; if (group.permissions) {
for (let permission of group.permissions) {
this.permissions.push(permission.toResponse());
}
}
} }
} }

View File

@ -5,12 +5,20 @@ import {
IsOptional IsOptional
} from "class-validator"; } from "class-validator";
import { User } from '../entities/User'; import { User } from '../entities/User';
import { ResponseObjectType } from '../enums/ResponseObjectType';
import { IResponse } from './IResponse';
import { ResponsePermission } from './ResponsePermission'; import { ResponsePermission } from './ResponsePermission';
/** /**
* Defines the user permission response (get /api/users/:id/permissions). * 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. * The permissions directly granted to the user.
*/ */

View File

@ -34,7 +34,8 @@ describe('POST /api/cards successfully (without runner)', () => {
delete res.data.code; delete res.data.code;
expect(res.data).toEqual({ expect(res.data).toEqual({
"runner": null, "runner": null,
"enabled": true "enabled": true,
"responseType": "RUNNERCARD"
}); });
}); });
it('creating a disabled card should return 200', async () => { it('creating a disabled card should return 200', async () => {
@ -47,7 +48,8 @@ describe('POST /api/cards successfully (without runner)', () => {
delete res.data.code; delete res.data.code;
expect(res.data).toEqual({ expect(res.data).toEqual({
"runner": null, "runner": null,
"enabled": false "enabled": false,
"responseType": "RUNNERCARD"
}); });
}); });
it('creating a enabled card should return 200', async () => { it('creating a enabled card should return 200', async () => {
@ -60,7 +62,8 @@ describe('POST /api/cards successfully (without runner)', () => {
delete res.data.code; delete res.data.code;
expect(res.data).toEqual({ expect(res.data).toEqual({
"runner": null, "runner": null,
"enabled": true "enabled": true,
"responseType": "RUNNERCARD"
}); });
}); });
}); });
@ -97,7 +100,8 @@ describe('POST /api/cards successfully (with runner)', () => {
delete res.data.code; delete res.data.code;
expect(res.data).toEqual({ expect(res.data).toEqual({
"runner": added_runner, "runner": added_runner,
"enabled": true "enabled": true,
"responseType": "RUNNERCARD"
}); });
}); });
it('creating a card with runner (no optional params) should return 200', async () => { 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; delete res.data.code;
expect(res.data).toEqual({ expect(res.data).toEqual({
"runner": added_runner, "runner": added_runner,
"enabled": true "enabled": true,
"responseType": "RUNNERCARD"
}); });
}); });
it('creating a enabled card with runner should return 200', async () => { 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; delete res.data.code;
expect(res.data).toEqual({ expect(res.data).toEqual({
"runner": added_runner, "runner": added_runner,
"enabled": true "enabled": true,
"responseType": "RUNNERCARD"
}); });
}); });
it('creating a disabled card with runner should return 200', async () => { 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; delete res.data.code;
expect(res.data).toEqual({ expect(res.data).toEqual({
"runner": added_runner, "runner": added_runner,
"enabled": false "enabled": false,
"responseType": "RUNNERCARD"
}); });
}); });
}); });

View File

@ -96,7 +96,8 @@ describe('adding + updating card.runner successfully', () => {
"id": added_card.id, "id": added_card.id,
"runner": added_runner, "runner": added_runner,
"enabled": true, "enabled": true,
"code": added_card.code "code": added_card.code,
"responseType": "RUNNERCARD"
}); });
}); });
it('valid runner update (change runner) should return 200', async () => { it('valid runner update (change runner) should return 200', async () => {
@ -110,7 +111,8 @@ describe('adding + updating card.runner successfully', () => {
"id": added_card.id, "id": added_card.id,
"runner": added_runner2, "runner": added_runner2,
"enabled": true, "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, "id": added_card.id,
"runner": null, "runner": null,
"enabled": false, "enabled": false,
"code": added_card.code "code": added_card.code,
"responseType": "RUNNERCARD"
}); });
}); });
it('valid enable update should return 200', async () => { it('valid enable update should return 200', async () => {
@ -156,7 +159,8 @@ describe('adding + updating other values successfully', () => {
"id": added_card.id, "id": added_card.id,
"runner": null, "runner": null,
"enabled": true, "enabled": true,
"code": added_card.code "code": added_card.code,
"responseType": "RUNNERCARD"
}); });
}); });
}); });

View File

@ -136,6 +136,7 @@ describe('POST /api/contacts working (with group)', () => {
expect(res.status).toEqual(200); expect(res.status).toEqual(200);
expect(res.headers['content-type']).toContain("application/json"); expect(res.headers['content-type']).toContain("application/json");
delete res.data.id; delete res.data.id;
delete res.data.groups[0].teams;
expect(res.data).toEqual({ expect(res.data).toEqual({
"firstname": "first", "firstname": "first",
"middlename": null, "middlename": null,
@ -149,7 +150,8 @@ describe('POST /api/contacts working (with group)', () => {
"city": null, "city": null,
"country": null "country": null
}, },
"groups": [added_org] "groups": [added_org],
"responseType": "GROUPCONTACT"
}); });
}); });
it('creating a new contact with a valid team should return 200', async () => { it('creating a new contact with a valid team should return 200', async () => {
@ -174,7 +176,8 @@ describe('POST /api/contacts working (with group)', () => {
"city": null, "city": null,
"country": 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 () => { it('creating a new contact with a valid org and team should return 200', async () => {
@ -187,6 +190,7 @@ describe('POST /api/contacts working (with group)', () => {
expect(res.headers['content-type']).toContain("application/json"); expect(res.headers['content-type']).toContain("application/json");
added_contact = res.data added_contact = res.data
delete res.data.id; delete res.data.id;
delete res.data.groups[0].teams;
expect(res.data).toEqual({ expect(res.data).toEqual({
"firstname": "first", "firstname": "first",
"middlename": null, "middlename": null,
@ -200,7 +204,8 @@ describe('POST /api/contacts working (with group)', () => {
"city": null, "city": null,
"country": 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 () => { it('checking if the added team\'s contact is the new contact should return 200', async () => {

View File

@ -86,7 +86,8 @@ describe('Update contact group after adding (should work)', () => {
}, axios_config); }, axios_config);
expect(res.status).toEqual(200); expect(res.status).toEqual(200);
expect(res.headers['content-type']).toContain("application/json"); 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({ expect(res.data).toEqual({
"id": res.data.id, "id": res.data.id,
"firstname": "first", "firstname": "first",
@ -101,7 +102,8 @@ describe('Update contact group after adding (should work)', () => {
"city": null, "city": null,
"country": null "country": null
}, },
"groups": [added_org] "groups": [added_org],
"responseType": "GROUPCONTACT"
}); });
}); });
it('valid group update to single team should return 200', async () => { it('valid group update to single team should return 200', async () => {
@ -127,7 +129,8 @@ describe('Update contact group after adding (should work)', () => {
"city": null, "city": null,
"country": null "country": null
}, },
"groups": [added_team] "groups": [added_team],
"responseType": "GROUPCONTACT"
}); });
}); });
it('valid group update to org and team should return 200', async () => { it('valid group update to org and team should return 200', async () => {
@ -139,6 +142,7 @@ describe('Update contact group after adding (should work)', () => {
}, axios_config); }, axios_config);
expect(res.status).toEqual(200); expect(res.status).toEqual(200);
expect(res.headers['content-type']).toContain("application/json"); expect(res.headers['content-type']).toContain("application/json");
delete res.data.groups[0].teams;
expect(res.data).toEqual({ expect(res.data).toEqual({
"id": res.data.id, "id": res.data.id,
"firstname": "first", "firstname": "first",
@ -153,7 +157,8 @@ describe('Update contact group after adding (should work)', () => {
"city": null, "city": null,
"country": 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 () => { it('valid group update to none should return 200', async () => {
@ -179,7 +184,8 @@ describe('Update contact group after adding (should work)', () => {
"city": null, "city": null,
"country": null "country": null
}, },
"groups": [] "groups": [],
"responseType": "GROUPCONTACT"
}); });
}); });
}); });
@ -206,6 +212,7 @@ describe('Update contact group invalid after adding (should fail)', () => {
expect(res.status).toEqual(200); expect(res.status).toEqual(200);
expect(res.headers['content-type']).toContain("application/json"); 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({ expect(res.data).toEqual({
"id": res.data.id, "id": res.data.id,
"firstname": "first", "firstname": "first",
@ -220,7 +227,8 @@ describe('Update contact group invalid after adding (should fail)', () => {
"city": null, "city": null,
"country": null "country": null
}, },
"groups": [added_org] "groups": [added_org],
"responseType": "GROUPCONTACT"
}); });
}); });
it('invalid group update to single team should return 404', async () => { it('invalid group update to single team should return 404', async () => {

View File

@ -179,7 +179,8 @@ describe('POST /api/donations/fixed successfully', () => {
expect(res.headers['content-type']).toContain("application/json"); expect(res.headers['content-type']).toContain("application/json");
expect(res.data).toEqual({ expect(res.data).toEqual({
"donor": added_donor, "donor": added_donor,
"amount": 1000 "amount": 1000,
"responseType": "DONATION"
}); });
}); });
}); });
@ -230,7 +231,8 @@ describe('POST /api/donations/distance successfully', () => {
"donor": added_donor, "donor": added_donor,
"amountPerDistance": 100, "amountPerDistance": 100,
"runner": added_runner, "runner": added_runner,
"amount": 0 "amount": 0,
"responseType": "DISTANCEDONATION"
}) })
}); });
}); });

View File

@ -323,7 +323,6 @@ describe('adding + updating distance donation valid', () => {
"amountPerDistance": 69, "amountPerDistance": 69,
"donor": added_donor.id "donor": added_donor.id
}, axios_config); }, axios_config);
delete res.data.runner.group;
expect(res.status).toEqual(200); expect(res.status).toEqual(200);
expect(res.headers['content-type']).toContain("application/json"); expect(res.headers['content-type']).toContain("application/json");
expect(res.data.runner).toEqual(added_runner2); expect(res.data.runner).toEqual(added_runner2);

View File

@ -55,7 +55,6 @@ describe('adding + getting from all orgs', () => {
delete added_org.id delete added_org.id
expect(added_org).toEqual({ expect(added_org).toEqual({
"name": "test123", "name": "test123",
"contact": null,
"address": { "address": {
"address1": null, "address1": null,
"address2": null, "address2": null,
@ -64,7 +63,8 @@ describe('adding + getting from all orgs', () => {
"postalcode": null, "postalcode": null,
}, },
"registrationEnabled": false, "registrationEnabled": false,
"teams": [] "teams": [],
"responseType": "RUNNERORGANIZATION"
}) })
}); });
}); });
@ -89,7 +89,6 @@ describe('adding + getting explicitly', () => {
delete added_org2.id delete added_org2.id
expect(added_org2).toEqual({ expect(added_org2).toEqual({
"name": "test123", "name": "test123",
"contact": null,
"address": { "address": {
"address1": null, "address1": null,
"address2": null, "address2": null,
@ -98,7 +97,8 @@ describe('adding + getting explicitly', () => {
"postalcode": null, "postalcode": null,
}, },
"registrationEnabled": false, "registrationEnabled": false,
"teams": [] "teams": [],
"responseType": "RUNNERORGANIZATION"
}) })
}); });
}); });

View File

@ -43,7 +43,6 @@ describe('adding + deletion (successfull)', () => {
delete added_org2.id delete added_org2.id
expect(added_org2).toEqual({ expect(added_org2).toEqual({
"name": "test123", "name": "test123",
"contact": null,
"address": { "address": {
"address1": null, "address1": null,
"address2": null, "address2": null,
@ -52,7 +51,8 @@ describe('adding + deletion (successfull)', () => {
"postalcode": null, "postalcode": null,
}, },
"registrationEnabled": false, "registrationEnabled": false,
"teams": [] "teams": [],
"responseType": "RUNNERORGANIZATION"
}); });
}); });
it('check if org really was deleted', async () => { 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; delete added_org2.teams;
expect(added_org2).toEqual({ expect(added_org2).toEqual({
"name": "test123", "name": "test123",
"contact": null,
"address": { "address": {
"address1": null, "address1": null,
"address2": null, "address2": null,
@ -136,6 +135,7 @@ describe('adding + deletion with teams still existing (with force)', () => {
"postalcode": null, "postalcode": null,
}, },
"registrationEnabled": false, "registrationEnabled": false,
"responseType": "RUNNERORGANIZATION"
}); });
}); });
it('check if org really was deleted', async () => { it('check if org really was deleted', async () => {

View File

@ -41,7 +41,6 @@ describe('adding + updating name', () => {
delete added_org2.id delete added_org2.id
expect(added_org2).toEqual({ expect(added_org2).toEqual({
"name": "testlelele", "name": "testlelele",
"contact": null,
"address": { "address": {
"address1": null, "address1": null,
"address2": null, "address2": null,
@ -50,7 +49,8 @@ describe('adding + updating name', () => {
"postalcode": null, "postalcode": null,
}, },
"registrationEnabled": false, "registrationEnabled": false,
"teams": [] "teams": [],
"responseType": "RUNNERORGANIZATION"
}) })
}); });
}); });
@ -109,7 +109,6 @@ describe('adding + updateing address valid)', () => {
expect(res.data).toEqual({ expect(res.data).toEqual({
"id": added_org_id, "id": added_org_id,
"name": "testlelele", "name": "testlelele",
"contact": null,
"address": { "address": {
"address1": "Test1", "address1": "Test1",
"address2": null, "address2": null,
@ -118,7 +117,8 @@ describe('adding + updateing address valid)', () => {
"postalcode": "90174" "postalcode": "90174"
}, },
"registrationEnabled": false, "registrationEnabled": false,
"teams": [] "teams": [],
"responseType": "RUNNERORGANIZATION"
}); });
}); });
it('updateing address\'s first line should return 200', async () => { it('updateing address\'s first line should return 200', async () => {
@ -139,7 +139,6 @@ describe('adding + updateing address valid)', () => {
expect(res.data).toEqual({ expect(res.data).toEqual({
"id": added_org_id, "id": added_org_id,
"name": "testlelele", "name": "testlelele",
"contact": null,
"address": { "address": {
"address1": "Test2", "address1": "Test2",
"address2": null, "address2": null,
@ -148,7 +147,8 @@ describe('adding + updateing address valid)', () => {
"postalcode": "90174" "postalcode": "90174"
}, },
"registrationEnabled": false, "registrationEnabled": false,
"teams": [] "teams": [],
"responseType": "RUNNERORGANIZATION"
}); });
}); });
it('updateing address\'s second line should return 200', async () => { it('updateing address\'s second line should return 200', async () => {
@ -169,7 +169,6 @@ describe('adding + updateing address valid)', () => {
expect(res.data).toEqual({ expect(res.data).toEqual({
"id": added_org_id, "id": added_org_id,
"name": "testlelele", "name": "testlelele",
"contact": null,
"address": { "address": {
"address1": "Test2", "address1": "Test2",
"address2": "Test3", "address2": "Test3",
@ -178,7 +177,8 @@ describe('adding + updateing address valid)', () => {
"postalcode": "90174" "postalcode": "90174"
}, },
"registrationEnabled": false, "registrationEnabled": false,
"teams": [] "teams": [],
"responseType": "RUNNERORGANIZATION"
}); });
}); });
it('updateing address\'s city should return 200', async () => { it('updateing address\'s city should return 200', async () => {
@ -199,7 +199,6 @@ describe('adding + updateing address valid)', () => {
expect(res.data).toEqual({ expect(res.data).toEqual({
"id": added_org_id, "id": added_org_id,
"name": "testlelele", "name": "testlelele",
"contact": null,
"address": { "address": {
"address1": "Test2", "address1": "Test2",
"address2": "Test3", "address2": "Test3",
@ -208,7 +207,8 @@ describe('adding + updateing address valid)', () => {
"postalcode": "90174" "postalcode": "90174"
}, },
"registrationEnabled": false, "registrationEnabled": false,
"teams": [] "teams": [],
"responseType": "RUNNERORGANIZATION"
}); });
}); });
it('updateing address\'s country should return 200', async () => { it('updateing address\'s country should return 200', async () => {
@ -229,7 +229,6 @@ describe('adding + updateing address valid)', () => {
expect(res.data).toEqual({ expect(res.data).toEqual({
"id": added_org_id, "id": added_org_id,
"name": "testlelele", "name": "testlelele",
"contact": null,
"address": { "address": {
"address1": "Test2", "address1": "Test2",
"address2": "Test3", "address2": "Test3",
@ -238,7 +237,8 @@ describe('adding + updateing address valid)', () => {
"postalcode": "90174" "postalcode": "90174"
}, },
"registrationEnabled": false, "registrationEnabled": false,
"teams": [] "teams": [],
"responseType": "RUNNERORGANIZATION"
}); });
}); });
it('updateing address\'s postal code should return 200', async () => { it('updateing address\'s postal code should return 200', async () => {
@ -259,7 +259,6 @@ describe('adding + updateing address valid)', () => {
expect(res.data).toEqual({ expect(res.data).toEqual({
"id": added_org_id, "id": added_org_id,
"name": "testlelele", "name": "testlelele",
"contact": null,
"address": { "address": {
"address1": "Test2", "address1": "Test2",
"address2": "Test3", "address2": "Test3",
@ -268,7 +267,8 @@ describe('adding + updateing address valid)', () => {
"postalcode": "91065" "postalcode": "91065"
}, },
"registrationEnabled": false, "registrationEnabled": false,
"teams": [] "teams": [],
"responseType": "RUNNERORGANIZATION"
}); });
}); });
it('removing org\'s address should return 200', async () => { it('removing org\'s address should return 200', async () => {
@ -282,7 +282,6 @@ describe('adding + updateing address valid)', () => {
expect(res.data).toEqual({ expect(res.data).toEqual({
"id": added_org_id, "id": added_org_id,
"name": "testlelele", "name": "testlelele",
"contact": null,
"address": { "address": {
"address1": null, "address1": null,
"address2": null, "address2": null,
@ -291,7 +290,8 @@ describe('adding + updateing address valid)', () => {
"postalcode": null "postalcode": null
}, },
"registrationEnabled": false, "registrationEnabled": false,
"teams": [] "teams": [],
"responseType": "RUNNERORGANIZATION"
}); });
}); });
}); });

View File

@ -48,7 +48,7 @@ describe('adding org', () => {
delete deleted_team.parentGroup; delete deleted_team.parentGroup;
expect(deleted_team).toEqual({ expect(deleted_team).toEqual({
"name": "test123", "name": "test123",
"contact": null "responseType": "RUNNERTEAM"
}); });
}); });
it('check if team really was deleted', async () => { it('check if team really was deleted', async () => {

View File

@ -127,6 +127,7 @@ describe('add+update parent org (valid)', () => {
delete added_org2.registrationEnabled; delete added_org2.registrationEnabled;
delete res4.data.parentGroup.key; delete res4.data.parentGroup.key;
delete res4.data.parentGroup.registrationEnabled; delete res4.data.parentGroup.registrationEnabled;
delete res4.data.parentGroup.teams;
expect(res4.data.parentGroup).toEqual(added_org2) expect(res4.data.parentGroup).toEqual(added_org2)
}); });
}); });

View File

@ -129,7 +129,7 @@ describe('GET /api/teams/:id/runners after adding', () => {
expect(res.status).toEqual(200); expect(res.status).toEqual(200);
expect(res.headers['content-type']).toContain("application/json") 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); const res = await axios.get(base + '/api/teams/' + added_team.id + "/runners", axios_config);
expect(res.status).toEqual(200); expect(res.status).toEqual(200);
expect(res.headers['content-type']).toContain("application/json"); expect(res.headers['content-type']).toContain("application/json");

View File

@ -49,6 +49,7 @@ describe('Update runner name after adding', () => {
delete res3.data.group.key; delete res3.data.group.key;
delete res3.data.group.registrationEnabled; delete res3.data.group.registrationEnabled;
delete runnercopy.group.registrationEnabled; delete runnercopy.group.registrationEnabled;
delete res3.data.group.teams;
expect(res3.data).toEqual(runnercopy); expect(res3.data).toEqual(runnercopy);
}); });
}); });
@ -94,6 +95,7 @@ describe('Update runner group after adding', () => {
expect(res3.headers['content-type']).toContain("application/json") expect(res3.headers['content-type']).toContain("application/json")
delete res3.data.group.key; delete res3.data.group.key;
delete res3.data.group.registrationEnabled; delete res3.data.group.registrationEnabled;
delete res3.data.group.teams;
expect(res3.data.group).toEqual(added_org_2); expect(res3.data.group).toEqual(added_org_2);
}); });
}); });

View File

@ -98,10 +98,12 @@ describe('POST /api/scans successfully', () => {
expect(res.headers['content-type']).toContain("application/json"); expect(res.headers['content-type']).toContain("application/json");
delete res.data.id; delete res.data.id;
delete res.data.runner.distance; delete res.data.runner.distance;
delete res.data.runner.group;
expect(res.data).toEqual({ expect(res.data).toEqual({
"runner": added_runner, "runner": added_runner,
"distance": 200, "distance": 200,
"valid": true "valid": true,
"responseType": "SCAN"
}); });
}); });
it('creating a valid scan should return 200', async () => { 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"); expect(res.headers['content-type']).toContain("application/json");
delete res.data.id; delete res.data.id;
delete res.data.runner.distance; delete res.data.runner.distance;
delete res.data.runner.group;
expect(res.data).toEqual({ expect(res.data).toEqual({
"runner": added_runner, "runner": added_runner,
"distance": 200, "distance": 200,
"valid": true "valid": true,
"responseType": "SCAN"
}); });
}); });
it('creating a invalid scan should return 200', async () => { 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"); expect(res.headers['content-type']).toContain("application/json");
delete res.data.id; delete res.data.id;
delete res.data.runner.distance; delete res.data.runner.distance;
delete res.data.runner.group;
expect(res.data).toEqual({ expect(res.data).toEqual({
"runner": added_runner, "runner": added_runner,
"distance": 200, "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"); expect(res.headers['content-type']).toContain("application/json");
delete res.data.id; delete res.data.id;
delete res.data.runner.distance; delete res.data.runner.distance;
delete res.data.runner.group;
expect(res.data).toEqual({ expect(res.data).toEqual({
"runner": added_runner, "runner": added_runner,
"distance": 200, "distance": 200,
"valid": true "valid": true,
"responseType": "SCAN",
}); });
}); });
it('creating a valid scan should return 200', async () => { 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"); expect(res.headers['content-type']).toContain("application/json");
delete res.data.id; delete res.data.id;
delete res.data.runner.distance; delete res.data.runner.distance;
delete res.data.runner.group;
expect(res.data).toEqual({ expect(res.data).toEqual({
"runner": added_runner, "runner": added_runner,
"distance": 200, "distance": 200,
"valid": true "valid": true,
"responseType": "SCAN"
}); });
}); });
it('creating a invalid scan should return 200', async () => { 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"); expect(res.headers['content-type']).toContain("application/json");
delete res.data.id; delete res.data.id;
delete res.data.runner.distance; delete res.data.runner.distance;
delete res.data.runner.group;
expect(res.data).toEqual({ expect(res.data).toEqual({
"runner": added_runner, "runner": added_runner,
"distance": 200, "distance": 200,
"valid": false "valid": false,
"responseType": "SCAN",
}); });
}); });
}); });

View File

@ -72,6 +72,7 @@ describe('adding + getting scans', () => {
expect(res.status).toEqual(200); expect(res.status).toEqual(200);
expect(res.headers['content-type']).toContain("application/json"); expect(res.headers['content-type']).toContain("application/json");
added_scan.runner.distance = 0; added_scan.runner.distance = 0;
delete added_scan.runner.group;
expect(res.data).toContainEqual(added_scan); expect(res.data).toContainEqual(added_scan);
}); });
}); });

View File

@ -123,12 +123,13 @@ describe('adding + updating successfilly', () => {
expect(res2.status).toEqual(200); expect(res2.status).toEqual(200);
expect(res2.headers['content-type']).toContain("application/json") expect(res2.headers['content-type']).toContain("application/json")
delete res2.data.runner.distance; delete res2.data.runner.distance;
delete res2.data.runner.group;
expect(res2.data).toEqual({ expect(res2.data).toEqual({
"id": added_scan.id, "id": added_scan.id,
"runner": added_runner, "runner": added_runner,
"distance": 100, "distance": 100,
"valid": true "valid": true,
"responseType": "SCAN"
}); });
}); });
it('valid valid update should return 200', async () => { it('valid valid update should return 200', async () => {
@ -141,11 +142,13 @@ describe('adding + updating successfilly', () => {
expect(res2.status).toEqual(200); expect(res2.status).toEqual(200);
expect(res2.headers['content-type']).toContain("application/json"); expect(res2.headers['content-type']).toContain("application/json");
delete res2.data.runner.distance; delete res2.data.runner.distance;
delete res2.data.runner.group;
expect(res2.data).toEqual({ expect(res2.data).toEqual({
"id": added_scan.id, "id": added_scan.id,
"runner": added_runner, "runner": added_runner,
"distance": 100, "distance": 100,
"valid": false "valid": false,
"responseType": "SCAN"
}); });
}); });
it('creating a new runner with only needed params should return 200', async () => { 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.status).toEqual(200);
expect(res2.headers['content-type']).toContain("application/json"); expect(res2.headers['content-type']).toContain("application/json");
delete res2.data.runner.distance; delete res2.data.runner.distance;
delete res2.data.runner.group;
expect(res2.data).toEqual({ expect(res2.data).toEqual({
"id": added_scan.id, "id": added_scan.id,
"runner": added_runner2, "runner": added_runner2,
"distance": added_scan.distance, "distance": added_scan.distance,
"valid": added_scan.valid "valid": added_scan.valid,
"responseType": "SCAN"
}); });
}); });
}); });

View File

@ -56,7 +56,8 @@ describe('POST /api/stations successfully', () => {
expect(res.data).toEqual({ expect(res.data).toEqual({
"track": added_track, "track": added_track,
"description": null, "description": null,
"enabled": true "enabled": true,
"responseType": "SCANSTATION"
}); });
}); });
it('creating a station with all parameters (optional set to true/empty) should return 200', async () => { 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({ expect(res.data).toEqual({
"track": added_track, "track": added_track,
"description": null, "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 () => { 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({ expect(res.data).toEqual({
"track": added_track, "track": added_track,
"description": null, "description": null,
"enabled": false "enabled": false,
"responseType": "SCANSTATION"
}); });
}); });
it('creating a station with all parameters (optional set) should return 200', async () => { 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({ expect(res.data).toEqual({
"track": added_track, "track": added_track,
"description": "test station for testing", "description": "test station for testing",
"enabled": true "enabled": true,
"responseType": "SCANSTATION"
}); });
}); });
}); });

View File

@ -54,7 +54,8 @@ describe('POST /api/tracks successfully', () => {
expect(res.data).toEqual({ expect(res.data).toEqual({
"name": "testtrack", "name": "testtrack",
"distance": 200, "distance": 200,
"minimumLapTime": null "minimumLapTime": null,
"responseType": "TRACK"
}) })
}); });
it('creating a track with all parameters (optional set to null) should return 200', async () => { 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({ expect(res.data).toEqual({
"name": "testtrack", "name": "testtrack",
"distance": 200, "distance": 200,
"minimumLapTime": null "minimumLapTime": null,
"responseType": "TRACK"
}) })
}); });
it('creating a track with all parameters should return 200', async () => { it('creating a track with all parameters should return 200', async () => {
@ -84,7 +86,8 @@ describe('POST /api/tracks successfully', () => {
expect(res.data).toEqual({ expect(res.data).toEqual({
"name": "testtrack", "name": "testtrack",
"distance": 200, "distance": 200,
"minimumLapTime": 123 "minimumLapTime": 123,
"responseType": "TRACK"
}) })
}); });
}); });

View File

@ -35,7 +35,8 @@ describe('DETELE track', () => {
expect(res2.data).toEqual({ expect(res2.data).toEqual({
"name": "testtrack", "name": "testtrack",
"distance": 200, "distance": 200,
"minimumLapTime": null "minimumLapTime": null,
"responseType": "TRACK"
}); });
}); });
it('check if track really was deleted', async () => { it('check if track really was deleted', async () => {

5382
tmp.json

File diff suppressed because it is too large Load Diff