Compare commits
	
		
			43 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| e40017a6b8 | |||
| e843a464e7 | |||
| d0ae50d557 | |||
| 7a49e7c5c9 | |||
| 1dd64204cc | |||
| 438ff0fc3f | |||
| c1bbda51f0 | |||
| 4705a39aab | |||
| 4d721f62d9 | |||
| b0328ffdaf | |||
| 031cede542 | |||
| 3c69f8c4a8 | |||
| cc6568c381 | |||
| a3a1395a46 | |||
| b08acc6660 | |||
| 7a303c2b2c | |||
| 3f9a7049e3 | |||
| 6249419fae | |||
| f347b7ad49 | |||
| 74faec85c8 | |||
| fbdadbef1f | |||
| c87c97c90f | |||
| a6bca59ffe | |||
| 732a1b88d9 | |||
| 4c960feeb2 | |||
| 72fee96a08 | |||
| fcb43f92b0 | |||
| 5ba8f1dd44 | |||
| 3d3790c2eb | |||
| 1fa3fa75ee | |||
| c8882ae6a1 | |||
| 673e896aa3 | |||
| 0ed7f78b2c | |||
| 1d38d308ad | |||
| d709ee7479 | |||
| aae042c041 | |||
| ca7a84eb3e | |||
| 1f32ed0727 | |||
| 289f9e2196 | |||
| 937a9fad4d | |||
| 7c3a1b8fff | |||
| a8ea4fa659 | |||
| c1dd4518d1 | 
							
								
								
									
										69
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										69
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -2,8 +2,70 @@ | ||||
|  | ||||
| All notable changes to this project will be documented in this file. Dates are displayed in UTC. | ||||
|  | ||||
| #### [v0.6.1](https://git.odit.services/lfk/backend/compare/v0.5.0...v0.6.1) | ||||
| #### [v0.7.0](https://git.odit.services/lfk/backend/compare/v0.6.4...v0.7.0) | ||||
|  | ||||
| - Added bulk card creation tests [`438ff0f`](https://git.odit.services/lfk/backend/commit/438ff0fc3f246f83b1fa04cb11828f4a61dfcd1e) | ||||
| - Added new "bulk" endpoint [`c1bbda5`](https://git.odit.services/lfk/backend/commit/c1bbda51f067cbd9ac1a9a5378ae3f5d7b9f4eca) | ||||
| - 🧾New changelog file version [CI SKIP] [skip ci] [`7a49e7c`](https://git.odit.services/lfk/backend/commit/7a49e7c5c98eb23af1cd0d2084914641e9a1bf90) | ||||
| - 🚀Bumped version to v0.7.0 [`d0ae50d`](https://git.odit.services/lfk/backend/commit/d0ae50d5579e969ad33d6b9cfd66dac7fa472223) | ||||
| - Merge pull request 'Bulk card creation feature/168-runnercards_bulk' (#169) from feature/168-runnercards_bulk into dev [`1dd6420`](https://git.odit.services/lfk/backend/commit/1dd64204cc63fb1a8a4a4aa503c21da42945eafd) | ||||
| - 🧾New changelog file version [CI SKIP] [skip ci] [`4705a39`](https://git.odit.services/lfk/backend/commit/4705a39aabaad894d332a5062df03840c23c6bfa) | ||||
|  | ||||
| #### [v0.6.4](https://git.odit.services/lfk/backend/compare/v0.6.3...v0.6.4) | ||||
|  | ||||
| > 19 March 2021 | ||||
|  | ||||
| - Merge pull request 'Release 0.6.4' (#167) from dev into main [`4d721f6`](https://git.odit.services/lfk/backend/commit/4d721f62d9a5f6a1361ef2811a3a2ff63011b2ad) | ||||
| - 🧾New changelog file version [CI SKIP] [skip ci] [`b0328ff`](https://git.odit.services/lfk/backend/commit/b0328ffdaffc8ef2e6e01e808c29748f58f42cac) | ||||
| - 🧾New changelog file version [CI SKIP] [skip ci] [`cc6568c`](https://git.odit.services/lfk/backend/commit/cc6568c3810fed3ff2597df0db73a6ca9e072413) | ||||
| - 🚀Bumped version to v0.6.4 [`031cede`](https://git.odit.services/lfk/backend/commit/031cede5426742dc3c2b9dc6b049951d7c14871c) | ||||
| - Adjsuted endpoint [`3c69f8c`](https://git.odit.services/lfk/backend/commit/3c69f8c4a824e588977b06dbb45119cccb03c6bc) | ||||
|  | ||||
| #### [v0.6.3](https://git.odit.services/lfk/backend/compare/v0.6.2...v0.6.3) | ||||
|  | ||||
| > 18 March 2021 | ||||
|  | ||||
| - Merge pull request 'Release 0.6.3' (#165) from dev into main [`a3a1395`](https://git.odit.services/lfk/backend/commit/a3a1395a46d7970cff1b8cc2e84306a97791ed88) | ||||
| - The basic bugfix 🐞 [`fbdadbe`](https://git.odit.services/lfk/backend/commit/fbdadbef1f9eb835e1914e8d3770cca836b4c443) | ||||
| - The basic bugfix 🐞 [`c87c97c`](https://git.odit.services/lfk/backend/commit/c87c97c90f5e1229f92671b1f2ebe1fa0d2307cd) | ||||
| - Updated tests 🧪 [`f347b7a`](https://git.odit.services/lfk/backend/commit/f347b7ad4982ed3760117c08e11dca5c3f72d495) | ||||
| - 🧾New changelog file version [CI SKIP] [skip ci] [`3f9a704`](https://git.odit.services/lfk/backend/commit/3f9a7049e31a6948125a07e847233b804f27ba31) | ||||
| - 🧾New changelog file version [CI SKIP] [skip ci] [`b08acc6`](https://git.odit.services/lfk/backend/commit/b08acc666035ed766cc6ccfa9a410a54db4d7321) | ||||
| - 🧾New changelog file version [CI SKIP] [skip ci] [`a6bca59`](https://git.odit.services/lfk/backend/commit/a6bca59ffe06a37f03af21500c442cebeaa74c7e) | ||||
| - 🚀Bumped version to v0.6.3 [`7a303c2`](https://git.odit.services/lfk/backend/commit/7a303c2b2c267d6dd566b1470649e65bc1c1b2ee) | ||||
| - Merge pull request 'TrackScan Update bug 🐞bugfix/163-trackscan_updates' (#164) from bugfix/163-trackscan_updates into dev [`6249419`](https://git.odit.services/lfk/backend/commit/6249419fae22e0203c046c1a3cd82c07f94f510c) | ||||
|  | ||||
| #### [v0.6.2](https://git.odit.services/lfk/backend/compare/v0.6.1...v0.6.2) | ||||
|  | ||||
| > 17 March 2021 | ||||
|  | ||||
| - Merge pull request 'Release 0.6.2' (#162) from dev into main [`732a1b8`](https://git.odit.services/lfk/backend/commit/732a1b88d916720ea82cd4b192fc696640ade2aa) | ||||
| - 🧾New changelog file version [CI SKIP] [skip ci] [`fcb43f9`](https://git.odit.services/lfk/backend/commit/fcb43f92b0b7a8fa2ed3772357c3eab8e6564eef) | ||||
| - Fixed trackscan vaildation [`a8ea4fa`](https://git.odit.services/lfk/backend/commit/a8ea4fa659732ca2c922fc3c75d2238be2feb5c7) | ||||
| - Added comments✏ [`289f9e2`](https://git.odit.services/lfk/backend/commit/289f9e219692789f86c631f52c67b578216acb48) | ||||
| - Added comments✏ [`937a9fa`](https://git.odit.services/lfk/backend/commit/937a9fad4d8914b83fc6300f776c0720b756a9f4) | ||||
| - Removed duplicate openapi declarations 🗑 [`c8882ae`](https://git.odit.services/lfk/backend/commit/c8882ae6a18188a9c98a237dd594548ebac6f460) | ||||
| - Now defining security per endpoint 🔐 [`d709ee7`](https://git.odit.services/lfk/backend/commit/d709ee74795b785599cda50b4351bd566a0b8573) | ||||
| - Changed the method of getting a parameter from the headers🛠 [`1d38d30`](https://git.odit.services/lfk/backend/commit/1d38d308ad8ae00d67c2b807b584da4f00bd9a58) | ||||
| - Now auto-etting the station token🔥🔥🔥 [`aae042c`](https://git.odit.services/lfk/backend/commit/aae042c041e325626b89b146d005e900bd880453) | ||||
| - Marked station as optional (quality of life improvements incoming) [`1f32ed0`](https://git.odit.services/lfk/backend/commit/1f32ed0727cb1117e5d201b5530b2f2d7f0323d8) | ||||
| - 🧾New changelog file version [CI SKIP] [skip ci] [`4c960fe`](https://git.odit.services/lfk/backend/commit/4c960feeb22f819d1c618ced73f5799a3c7e4f00) | ||||
| - Fixed missing renameing🛠 [`0ed7f78`](https://git.odit.services/lfk/backend/commit/0ed7f78b2c284909d47fa0533424c279adef0ba3) | ||||
| - 🧾New changelog file version [CI SKIP] [skip ci] [`c1dd451`](https://git.odit.services/lfk/backend/commit/c1dd4518d128edd8b8e36981a513744471241a25) | ||||
| - 🚀Bumped version to v0.6.2 [`5ba8f1d`](https://git.odit.services/lfk/backend/commit/5ba8f1dd4451c1a1b38fdd36cf632c9e6efa829c) | ||||
| - Merge pull request 'Bugfixes for trackscans feature/160-responseTrackScan_total_distance' (#161) from feature/160-responseTrackScan_total_distance into dev [`3d3790c`](https://git.odit.services/lfk/backend/commit/3d3790c2eb6a92bb5b1d2c7e44c75aef4e1b015f) | ||||
| - Fixed wrong error type 👀👀 [`1fa3fa7`](https://git.odit.services/lfk/backend/commit/1fa3fa75ee447b9919585e02c7997e3f1de9c8a7) | ||||
| - Added missing discription [`673e896`](https://git.odit.services/lfk/backend/commit/673e896aa3dc853b301a2e560e785c464a449b6f) | ||||
|  | ||||
| #### [v0.6.1](https://git.odit.services/lfk/backend/compare/v0.6.0...v0.6.1) | ||||
|  | ||||
| > 17 March 2021 | ||||
|  | ||||
| #### [v0.6.0](https://git.odit.services/lfk/backend/compare/v0.5.0...v0.6.0) | ||||
|  | ||||
| > 17 March 2021 | ||||
|  | ||||
| - Merge pull request 'Release v0.6.0' (#159) from dev into main [`bdc7bb6`](https://git.odit.services/lfk/backend/commit/bdc7bb67e7e21769d95a762c3b6dfbf82e7e38d0) | ||||
| - 📖New license file version [CI SKIP] [skip ci] [`5f5c8a0`](https://git.odit.services/lfk/backend/commit/5f5c8a061eb94361e4cd02e9a6469194a9092513) | ||||
| - As requested by @philpp [`2cb7ec7`](https://git.odit.services/lfk/backend/commit/2cb7ec7317d8a48364261506facb2c11c7cf895f) | ||||
| - Updated ci with new kubernetes secrets 🚀🚀🚀 [`5541ae6`](https://git.odit.services/lfk/backend/commit/5541ae6ebd7f36f4482ae752f358102a18b95de0) | ||||
| @@ -17,12 +79,12 @@ All notable changes to this project will be documented in this file. Dates are d | ||||
| - Implemented the "real" errors [`e26b7d4`](https://git.odit.services/lfk/backend/commit/e26b7d4923777a3013368e29c122709de7e1d9da) | ||||
| - Runner controller now uses the Mailer functions [`a343747`](https://git.odit.services/lfk/backend/commit/a3437475caf6b435ae4bdf6d48aeb7da7d43b25f) | ||||
| - Added scanstation me endpoint [`c5178e0`](https://git.odit.services/lfk/backend/commit/c5178e01814cedaa4402773b10f24d186714c1d2) | ||||
| - 🧾New changelog file version [CI SKIP] [skip ci] [`54988ba`](https://git.odit.services/lfk/backend/commit/54988ba0fe012ce87d44c9068f7546a9be73723c) | ||||
| - Added last reset requested timestamp to runners [`66d6023`](https://git.odit.services/lfk/backend/commit/66d6023335c7a9d1a145c4189b610940ef5a525a) | ||||
| - Scanauth return objects [`46b7ace`](https://git.odit.services/lfk/backend/commit/46b7aceb0b86b03688faf0ec6661e4c9fbc6115c) | ||||
| - Revert "Switched normal images to chached registry" [`ca6fa63`](https://git.odit.services/lfk/backend/commit/ca6fa633a156a265d8f643a5f23090b6ab32260d) | ||||
| - Switched normal images to chached registry [`cba4455`](https://git.odit.services/lfk/backend/commit/cba4455d53f9a39b6f9993c36b5abd281201dfa1) | ||||
| - 🧾New changelog file version [CI SKIP] [skip ci] [`a7958ee`](https://git.odit.services/lfk/backend/commit/a7958eecd65116ab937f640cbebcae1962cb86c8) | ||||
| - 🧾New changelog file version [CI SKIP] [skip ci] [`a1a94ec`](https://git.odit.services/lfk/backend/commit/a1a94ec9dafecd9b4c453cc8cfe32c2e90acccf5) | ||||
| - 🧾New changelog file version [CI SKIP] [skip ci] [`076aa87`](https://git.odit.services/lfk/backend/commit/076aa87dba1d6fc544e76c16f99c64d37fc82ea0) | ||||
| - 🧾New changelog file version [CI SKIP] [skip ci] [`486e450`](https://git.odit.services/lfk/backend/commit/486e450a58d3671dc867ae1a99d052d9fe814c1a) | ||||
| - Updated request timeout [`ffcd45e`](https://git.odit.services/lfk/backend/commit/ffcd45e5724fccdec9b1dbc48f1320525dcd7288) | ||||
| @@ -30,16 +92,17 @@ All notable changes to this project will be documented in this file. Dates are d | ||||
| - 🚀Bumped version to v0.6.1 [`ce3ca9f`](https://git.odit.services/lfk/backend/commit/ce3ca9f1c86a6fe72e4dd77e3a0d60bf1e1bf542) | ||||
| - 🚀Bumped version to v0.6.0 [`623b5a1`](https://git.odit.services/lfk/backend/commit/623b5a1873afa73a984251543995b7da1cfdb5c9) | ||||
| - Merge pull request 'Scanstation "me" endpoint feature/157-scanstation_me' (#158) from feature/157-scanstation_me into dev [`13e8399`](https://git.odit.services/lfk/backend/commit/13e839902c063057e902fdb52b403be081d1667e) | ||||
| - 🧾New changelog file version [CI SKIP] [skip ci] [`a1a94ec`](https://git.odit.services/lfk/backend/commit/a1a94ec9dafecd9b4c453cc8cfe32c2e90acccf5) | ||||
| - 🧾New changelog file version [CI SKIP] [skip ci] [`d5930f7`](https://git.odit.services/lfk/backend/commit/d5930f7c46f4fc8ed56b6eeec9f784d435fd3b2b) | ||||
| - Changed ci pipeline type to kubernetes [`6c43872`](https://git.odit.services/lfk/backend/commit/6c43872198c3dba44b3af3a7cfc7b628d5b304a3) | ||||
| - Mailer now ignores mailing erros when env is set to test [`6bb3ae8`](https://git.odit.services/lfk/backend/commit/6bb3ae8ba992bd6c4d5809d75a264c710999cdcf) | ||||
| - 🧾New changelog file version [CI SKIP] [skip ci] [`bf71e35`](https://git.odit.services/lfk/backend/commit/bf71e35ecd333d888d63213d69b04fc681a9d0bd) | ||||
| - Changed endpoint url to avoid conflicts [`e5dab34`](https://git.odit.services/lfk/backend/commit/e5dab3469c3cef6298fc8deb1192a38f7d18406b) | ||||
| - Adjusted tests for the new testing env [`9292027`](https://git.odit.services/lfk/backend/commit/92920273bec409563d1e38ea27f4d30f893598e8) | ||||
| - Applied Docker MTU fix 🛠 [`f7af777`](https://git.odit.services/lfk/backend/commit/f7af77710421d7aae5efb048e0622cd067fc20eb) | ||||
| - Updated description [`94001a4`](https://git.odit.services/lfk/backend/commit/94001a48f1b314e91ea5ec982e5585124f9541b6) | ||||
| - Now adding station id to headers of request for scan auth [`8ba7ee1`](https://git.odit.services/lfk/backend/commit/8ba7ee1d481e44e686489e237980b21aaaf6071c) | ||||
| - Merge pull request 'selfservice forgotten mails feature/154-selfservice_forgotten' (#155) from feature/154-selfservice_forgotten into dev [`cb6e78f`](https://git.odit.services/lfk/backend/commit/cb6e78fc176ec9efe94311b64286020b3c5bf633) | ||||
| - Changed endpoint url to avoid conflicts [`e5dab34`](https://git.odit.services/lfk/backend/commit/e5dab3469c3cef6298fc8deb1192a38f7d18406b) | ||||
| - Added console logging when a testing env get's discovered [`c01233b`](https://git.odit.services/lfk/backend/commit/c01233b4d663aefece26dbb86f8b6bcd5c916325) | ||||
| - Added not found error logic [`e7f0cb4`](https://git.odit.services/lfk/backend/commit/e7f0cb45c9ac3aa06e2a57786aa1cc51c9d66598) | ||||
| - Updated to new responsetype [`08957d4`](https://git.odit.services/lfk/backend/commit/08957d4dc2951cfeec56a54680c2ae4ef1525ab2) | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|   "name": "@odit/lfk-backend", | ||||
|   "version": "0.6.1", | ||||
|   "version": "0.7.0", | ||||
|   "main": "src/app.ts", | ||||
|   "repository": "https://git.odit.services/lfk/backend", | ||||
|   "author": { | ||||
|   | ||||
| @@ -32,7 +32,7 @@ export class MeController { | ||||
| 		return new ResponseUser(user); | ||||
| 	} | ||||
|  | ||||
| 	@Get('/') | ||||
| 	@Get('/permissions') | ||||
| 	@ResponseSchema(ResponseUserPermissions) | ||||
| 	@ResponseSchema(UserNotFoundError, { statusCode: 404 }) | ||||
| 	@OnUndefined(UserNotFoundError) | ||||
|   | ||||
| @@ -47,6 +47,21 @@ export class RunnerCardController { | ||||
| 		return card.toResponse(); | ||||
| 	} | ||||
|  | ||||
| 	@Post('/bulk') | ||||
| 	@Authorized("CARD:CREATE") | ||||
| 	@ResponseSchema(ResponseEmpty, { statusCode: 200 }) | ||||
| 	@OpenAPI({ description: "Create blank cards in bulk. <br> Just provide the count as a query param and wait for the 200 response." }) | ||||
| 	async postBlancoBulk(@QueryParam("count") count: number) { | ||||
| 		let createPromises = new Array<any>(); | ||||
| 		for (let index = 0; index < count; index++) { | ||||
| 			createPromises.push(this.cardRepository.save({ runner: null, enabled: true })) | ||||
| 		} | ||||
| 		await Promise.all(createPromises); | ||||
| 		let response = new ResponseEmpty(); | ||||
| 		response.response = `Created ${count} new blanco cards.` | ||||
| 		return response; | ||||
| 	} | ||||
|  | ||||
| 	@Post() | ||||
| 	@Authorized("CARD:CREATE") | ||||
| 	@ResponseSchema(ResponseRunnerCard) | ||||
|   | ||||
| @@ -67,7 +67,7 @@ export class RunnerSelfServiceController { | ||||
| 	@ResponseSchema(ResponseScanStation) | ||||
| 	@ResponseSchema(ScanStationNotFoundError, { statusCode: 404 }) | ||||
| 	@OnUndefined(ScanStationNotFoundError) | ||||
| 	@OpenAPI({ description: 'Lists basic information about the station whose token got provided. <br> This includes it\'s associated track.', security: [{ "ScanApiToken": [] }] }) | ||||
| 	@OpenAPI({ description: 'Lists basic information about the station whose token got provided. <br> This includes it\'s associated track.', security: [{ "StationApiToken": [] }] }) | ||||
| 	async getStationMe(@Req() req: Request) { | ||||
| 		let scan = await this.stationRepository.findOne({ id: parseInt(req.headers["station_id"].toString()) }, { relations: ['track'] }) | ||||
| 		if (!scan) { throw new ScanStationNotFoundError(); } | ||||
| @@ -77,7 +77,7 @@ export class RunnerSelfServiceController { | ||||
| 	@Post('/runners/forgot') | ||||
| 	@ResponseSchema(RunnerNotFoundError, { statusCode: 404 }) | ||||
| 	@OnUndefined(ResponseEmpty) | ||||
| 	@OpenAPI({ description: 'TODO' }) | ||||
| 	@OpenAPI({ description: 'Use this endpoint to reuqest a new selfservice token/link to be sent to your mail address (rate limited to one mail every 24hrs).' }) | ||||
| 	async requestNewToken(@QueryParam('mail') mail: string) { | ||||
| 		if (!mail) { | ||||
| 			throw new RunnerNotFoundError(); | ||||
|   | ||||
| @@ -1,4 +1,5 @@ | ||||
| import { Authorized, Body, Delete, Get, JsonController, OnUndefined, Param, Post, Put, QueryParam, UseBefore } from 'routing-controllers'; | ||||
| import { Request } from "express"; | ||||
| import { Authorized, Body, Delete, Get, JsonController, OnUndefined, Param, Post, Put, QueryParam, Req, UseBefore } from 'routing-controllers'; | ||||
| import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi'; | ||||
| import { getConnectionManager, Repository } from 'typeorm'; | ||||
| import { RunnerNotFoundError } from '../errors/RunnerErrors'; | ||||
| @@ -14,7 +15,6 @@ import { TrackScan } from '../models/entities/TrackScan'; | ||||
| import { ResponseEmpty } from '../models/responses/ResponseEmpty'; | ||||
| import { ResponseScan } from '../models/responses/ResponseScan'; | ||||
| import { ResponseTrackScan } from '../models/responses/ResponseTrackScan'; | ||||
|  | ||||
| @JsonController('/scans') | ||||
| @OpenAPI({ security: [{ "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) | ||||
| export class ScanController { | ||||
| @@ -60,7 +60,7 @@ export class ScanController { | ||||
| 	@UseBefore(ScanAuth) | ||||
| 	@ResponseSchema(ResponseScan) | ||||
| 	@ResponseSchema(RunnerNotFoundError, { statusCode: 404 }) | ||||
| 	@OpenAPI({ description: 'Create a new scan (not track scan - use /scans/trackscans instead). <br> Please rmemember to provide the scan\'s runner\'s id and distance.', security: [{ "ScanApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) | ||||
| 	@OpenAPI({ description: 'Create a new scan (not track scan - use /scans/trackscans instead). <br> Please rmemember to provide the scan\'s runner\'s id and distance.', security: [{ "StationApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) | ||||
| 	async post(@Body({ validate: true }) createScan: CreateScan) { | ||||
| 		let scan = await createScan.toEntity(); | ||||
| 		scan = await this.scanRepository.save(scan); | ||||
| @@ -71,8 +71,12 @@ export class ScanController { | ||||
| 	@UseBefore(ScanAuth) | ||||
| 	@ResponseSchema(ResponseTrackScan) | ||||
| 	@ResponseSchema(RunnerNotFoundError, { statusCode: 404 }) | ||||
| 	@OpenAPI({ description: 'Create a new track scan (for "normal" scans use /scans instead). <br> Please remember that to provide the scan\'s card\'s station\'s id.', security: [{ "ScanApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) | ||||
| 	async postTrackScans(@Body({ validate: true }) createScan: CreateTrackScan) { | ||||
| 	@OpenAPI({ description: 'Create a new track scan (for "normal" scans use /scans instead). <br> Please remember that to provide the scan\'s card\'s station\'s id.', security: [{ "StationApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) | ||||
| 	async postTrackScans(@Body({ validate: true }) createScan: CreateTrackScan, @Req() req: Request) { | ||||
| 		const station_id = req.headers["station_id"]; | ||||
| 		if (station_id) { | ||||
| 			createScan.station = parseInt(station_id.toString()); | ||||
| 		} | ||||
| 		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.group', 'runner.scans.track', 'card', 'station'] })).toResponse(); | ||||
|   | ||||
| @@ -1,4 +1,5 @@ | ||||
| import { IsInt, IsPositive } from 'class-validator'; | ||||
| import { IsInt, IsOptional, IsPositive } from 'class-validator'; | ||||
| import { BadRequestError } from 'routing-controllers'; | ||||
| import { getConnection } from 'typeorm'; | ||||
| import { RunnerCardNotFoundError } from '../../../errors/RunnerCardErrors'; | ||||
| import { RunnerNotFoundError } from '../../../errors/RunnerErrors'; | ||||
| @@ -22,10 +23,12 @@ export class CreateTrackScan { | ||||
|     /** | ||||
|      * The scanning station's id that created the scan. | ||||
|      * Mainly used for logging and traceing back scans (or errors). | ||||
|      * You don't have to provide the station if you're authenticateing via a scanstation token (The server takes care of it for you). | ||||
|      */ | ||||
|     @IsInt() | ||||
|     @IsPositive() | ||||
|     station: number; | ||||
|     @IsOptional() | ||||
|     station?: number; | ||||
|  | ||||
|     /** | ||||
|      * Creates a new Track entity from this. | ||||
| @@ -44,12 +47,15 @@ export class CreateTrackScan { | ||||
|         } | ||||
|  | ||||
|         newScan.timestamp = Math.round(new Date().getTime() / 1000); | ||||
|         newScan.lapTime = await this.getLaptime(newScan) | ||||
|         newScan.valid = await this.validateScan(newScan); | ||||
|         newScan = await this.validateScan(newScan); | ||||
|  | ||||
|         return newScan; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get's a runnerCard entity via the provided id. | ||||
|      * @returns The runnerCard whom's id you provided. | ||||
|      */ | ||||
|     public async getCard(): Promise<RunnerCard> { | ||||
|         const track = await getConnection().getRepository(RunnerCard).findOne({ id: this.card }, { relations: ["runner"] }); | ||||
|         if (!track) { | ||||
| @@ -58,7 +64,14 @@ export class CreateTrackScan { | ||||
|         return track; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get's a scanstation entity via the provided id. | ||||
|      * @returns The scanstation whom's id you provided. | ||||
|      */ | ||||
|     public async getStation(): Promise<ScanStation> { | ||||
|         if (!this.station) { | ||||
|             throw new BadRequestError("You are missing the station's id!") | ||||
|         } | ||||
|         const station = await getConnection().getRepository(ScanStation).findOne({ id: this.station }, { relations: ["track"] }); | ||||
|         if (!station) { | ||||
|             throw new ScanStationNotFoundError(); | ||||
| @@ -66,15 +79,22 @@ export class CreateTrackScan { | ||||
|         return station; | ||||
|     } | ||||
|  | ||||
|     public validateScan(scan: TrackScan): boolean { | ||||
|         return (scan.lapTime > scan.track.minimumLapTime); | ||||
|     } | ||||
|  | ||||
|     public async getLaptime(scan: TrackScan): Promise<number> { | ||||
|     /** | ||||
|      * Validates the scan and sets it's lap time; | ||||
|      * @param scan The scan you want to validate | ||||
|      * @returns The validated scan with it's laptime set. | ||||
|      */ | ||||
|     public async validateScan(scan: TrackScan): Promise<TrackScan> { | ||||
|         const scans = await getConnection().getRepository(TrackScan).find({ where: { runner: scan.runner, valid: true }, relations: ["track"] }); | ||||
|         if (scans.length == 0) { return 0; } | ||||
|  | ||||
|         const newestScan = scans[scans.length - 1]; | ||||
|         return (scan.timestamp - newestScan.timestamp); | ||||
|         if (scans.length == 0) { | ||||
|             scan.lapTime = 0; | ||||
|             scan.valid = true; | ||||
|         } | ||||
|         else { | ||||
|             const newestScan = scans[scans.length - 1]; | ||||
|             scan.lapTime = scan.timestamp - newestScan.timestamp; | ||||
|             scan.valid = (scan.lapTime > scan.track.minimumLapTime); | ||||
|         } | ||||
|         return scan; | ||||
|     } | ||||
| } | ||||
| @@ -1,9 +1,9 @@ | ||||
| import { IsBoolean, IsInt, IsOptional, IsPositive } from 'class-validator'; | ||||
| import { getConnection } from 'typeorm'; | ||||
| import { RunnerNotFoundError } from '../../../errors/RunnerErrors'; | ||||
| import { ScanStationNotFoundError } from '../../../errors/ScanStationErrors'; | ||||
| import { TrackNotFoundError } from '../../../errors/TrackErrors'; | ||||
| import { Runner } from '../../entities/Runner'; | ||||
| import { ScanStation } from '../../entities/ScanStation'; | ||||
| import { Track } from '../../entities/Track'; | ||||
| import { TrackScan } from '../../entities/TrackScan'; | ||||
|  | ||||
| /** | ||||
| @@ -38,7 +38,7 @@ export abstract class UpdateTrackScan { | ||||
|      */ | ||||
|     @IsInt() | ||||
|     @IsPositive() | ||||
|     public station: number; | ||||
|     public track: number; | ||||
|  | ||||
|     /** | ||||
|      * Update a TrackScan entity based on this. | ||||
| @@ -47,8 +47,7 @@ export abstract class UpdateTrackScan { | ||||
|     public async update(scan: TrackScan): Promise<TrackScan> { | ||||
|         scan.valid = this.valid; | ||||
|         scan.runner = await this.getRunner(); | ||||
|         scan.station = await this.getStation(); | ||||
|         scan.track = scan.station.track; | ||||
|         scan.track = await this.getTrack(); | ||||
|  | ||||
|         return scan; | ||||
|     } | ||||
| @@ -67,11 +66,11 @@ export abstract class UpdateTrackScan { | ||||
|     /** | ||||
|      * Gets a runner based on the runner id provided via this.runner. | ||||
|      */ | ||||
|     public async getStation(): Promise<ScanStation> { | ||||
|         const station = await getConnection().getRepository(ScanStation).findOne({ id: this.station }, { relations: ['track'] }); | ||||
|         if (!station) { | ||||
|             throw new ScanStationNotFoundError(); | ||||
|     public async getTrack(): Promise<Track> { | ||||
|         const track = await getConnection().getRepository(Track).findOne({ id: this.track }); | ||||
|         if (!track) { | ||||
|             throw new TrackNotFoundError(); | ||||
|         } | ||||
|         return station; | ||||
|         return track; | ||||
|     } | ||||
| } | ||||
| @@ -148,4 +148,27 @@ describe('POST /api/cards successfully (with runner)', () => { | ||||
| 			"responseType": "RUNNERCARD" | ||||
| 		}); | ||||
| 	}); | ||||
| }); | ||||
| // --------------- | ||||
| describe('POST /api/cards/bulk successfully', () => { | ||||
| 	it('creating a single new bulk card should return 200', async () => { | ||||
| 		const res = await axios.post(base + '/api/cards/bulk?count=1', {}, axios_config); | ||||
| 		expect(res.status).toEqual(200); | ||||
| 		expect(res.headers['content-type']).toContain("application/json"); | ||||
| 	}); | ||||
| 	it('creating 50 new bulk card should return 200', async () => { | ||||
| 		const res = await axios.post(base + '/api/cards/bulk?count=50', {}, axios_config); | ||||
| 		expect(res.status).toEqual(200); | ||||
| 		expect(res.headers['content-type']).toContain("application/json"); | ||||
| 	}); | ||||
| 	it('creating 250 new bulk card should return 200', async () => { | ||||
| 		const res = await axios.post(base + '/api/cards/bulk?count=250', {}, axios_config); | ||||
| 		expect(res.status).toEqual(200); | ||||
| 		expect(res.headers['content-type']).toContain("application/json"); | ||||
| 	}); | ||||
| 	it('creating 2000 new bulk card should return 200', async () => { | ||||
| 		const res = await axios.post(base + '/api/cards/bulk?count=2000', {}, axios_config); | ||||
| 		expect(res.status).toEqual(200); | ||||
| 		expect(res.headers['content-type']).toContain("application/json"); | ||||
| 	}); | ||||
| }); | ||||
| @@ -86,7 +86,7 @@ describe('adding + updating illegally', () => { | ||||
| 	it('updating with wrong id should return 406', async () => { | ||||
| 		const res2 = await axios.put(base + '/api/scans/trackscans/' + added_scan.id, { | ||||
| 			"id": added_scan.id + 1, | ||||
| 			"station": added_station.id, | ||||
| 			"track": added_track.id, | ||||
| 			"runner": added_runner.id | ||||
| 		}, axios_config); | ||||
| 		expect(res2.status).toEqual(406); | ||||
| @@ -95,7 +95,7 @@ describe('adding + updating illegally', () => { | ||||
| 	it('updating with invalid station should return 404', async () => { | ||||
| 		const res2 = await axios.put(base + '/api/scans/trackscans/' + added_scan.id, { | ||||
| 			"id": added_scan.id, | ||||
| 			"station": 9999999999999999, | ||||
| 			"track": 9999999999999999, | ||||
| 			"runner": added_runner.id | ||||
| 		}, axios_config); | ||||
| 		expect(res2.status).toEqual(404); | ||||
| @@ -104,7 +104,7 @@ describe('adding + updating illegally', () => { | ||||
| 	it('updating with invalid runner should return 404', async () => { | ||||
| 		const res2 = await axios.put(base + '/api/scans/trackscans/' + added_scan.id, { | ||||
| 			"id": added_scan.id, | ||||
| 			"station": added_station.id, | ||||
| 			"track": added_station.id, | ||||
| 			"runner": 9999999999999999999 | ||||
| 		}, axios_config); | ||||
| 		expect(res2.status).toEqual(404); | ||||
| @@ -211,7 +211,7 @@ describe('adding + updating successfilly', () => { | ||||
| 	it('updating with new runner should return 200', async () => { | ||||
| 		const res2 = await axios.put(base + '/api/scans/trackscans/' + added_scan.id, { | ||||
| 			"id": added_scan.id, | ||||
| 			"station": added_station.id, | ||||
| 			"track": added_track.id, | ||||
| 			"runner": added_runner2.id | ||||
| 		}, axios_config); | ||||
| 		expect(res2.status).toEqual(200); | ||||
| @@ -220,7 +220,7 @@ describe('adding + updating successfilly', () => { | ||||
| 	it('updating with new station should return 200', async () => { | ||||
| 		const res2 = await axios.put(base + '/api/scans/trackscans/' + added_scan.id, { | ||||
| 			"id": added_scan.id, | ||||
| 			"station": added_station2.id, | ||||
| 			"track": added_track2.id, | ||||
| 			"runner": added_runner.id | ||||
| 		}, axios_config); | ||||
| 		expect(res2.status).toEqual(200); | ||||
| @@ -229,7 +229,7 @@ describe('adding + updating successfilly', () => { | ||||
| 	it('updating with valid=false should return 200', async () => { | ||||
| 		const res2 = await axios.put(base + '/api/scans/trackscans/' + added_scan.id, { | ||||
| 			"id": added_scan.id, | ||||
| 			"station": added_station2.id, | ||||
| 			"track": added_track2.id, | ||||
| 			"runner": added_runner.id, | ||||
| 			"valid": false | ||||
| 		}, axios_config); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user