Compare commits
	
		
			27 Commits
		
	
	
		
			0b07a53ed2
			...
			v0.10.2
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 1d82f65b0d | |||
| 610988ec16 | |||
| 6e236ede14 | |||
| b7ad5d3a31 | |||
| a694ad225c | |||
| 5633e85f41 | |||
| 95e1eec313 | |||
| 377d5dadb2 | |||
| 4a294b1e17 | |||
| 720774fcf4 | |||
| dcdbdd15ac | |||
| 132b48cf2a | |||
| 23bd432c5f | |||
| 71b33ab05b | |||
| 87f444c30d | |||
| 4a73eab134 | |||
| f8baca5ab2 | |||
| 10221b9f2e | |||
| 1d8c8c8e9c | |||
| 4603a84f16 | |||
| 2cd8f3f7f3 | |||
| 107eeeae7f | |||
| b8767b8bd4 | |||
| bf686e89e0 | |||
| 6163f0a90b | |||
| 8f0f795a70 | |||
| 22cae39bd3 | 
							
								
								
									
										15
									
								
								.drone.yml
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								.drone.yml
									
									
									
									
									
								
							| @@ -19,10 +19,17 @@ get: | |||||||
|   path: odit-git-bot |   path: odit-git-bot | ||||||
|   name: sshkey |   name: sshkey | ||||||
|  |  | ||||||
|  | --- | ||||||
|  | kind: secret | ||||||
|  | name: ci_token | ||||||
|  | get: | ||||||
|  |   path: odit-ci-bot | ||||||
|  |   name: apikey | ||||||
|  |  | ||||||
| --- | --- | ||||||
| kind: pipeline | kind: pipeline | ||||||
| type: kubernetes | type: kubernetes | ||||||
| name: tests:node_latest | name: tests:node_14.15.1-alpine3.12 | ||||||
| clone: | clone: | ||||||
|   disable: true |   disable: true | ||||||
| steps: | steps: | ||||||
| @@ -32,7 +39,7 @@ steps: | |||||||
|       - git clone $DRONE_REMOTE_URL . |       - git clone $DRONE_REMOTE_URL . | ||||||
|       - git checkout $DRONE_SOURCE_BRANCH |       - git checkout $DRONE_SOURCE_BRANCH | ||||||
|   - name: run tests |   - name: run tests | ||||||
|     image: node:latest |     image: node:14.15.1-alpine3.12 | ||||||
|     commands: |     commands: | ||||||
|       - yarn |       - yarn | ||||||
|       - yarn test:ci |       - yarn test:ci | ||||||
| @@ -176,13 +183,13 @@ steps: | |||||||
|     settings: |     settings: | ||||||
|       urls: https://ci.odit.services/api/repos/lfk/lfk-client-node/builds?SOURCE_TAG=${DRONE_TAG} |       urls: https://ci.odit.services/api/repos/lfk/lfk-client-node/builds?SOURCE_TAG=${DRONE_TAG} | ||||||
|       bearer: |       bearer: | ||||||
|         from_secret: BOT_DRONE_KEY |         from_secret: ci_token | ||||||
|   - name: trigger js lib build |   - name: trigger js lib build | ||||||
|     image: idcooldi/drone-webhook |     image: idcooldi/drone-webhook | ||||||
|     settings: |     settings: | ||||||
|       urls: https://ci.odit.services/api/repos/lfk/lfk-client-js/builds?SOURCE_TAG=${DRONE_TAG} |       urls: https://ci.odit.services/api/repos/lfk/lfk-client-js/builds?SOURCE_TAG=${DRONE_TAG} | ||||||
|       bearer: |       bearer: | ||||||
|         from_secret: BOT_DRONE_KEY |         from_secret: ci_token | ||||||
| trigger: | trigger: | ||||||
|   event: |   event: | ||||||
|   - tag |   - tag | ||||||
							
								
								
									
										42
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -2,8 +2,50 @@ | |||||||
|  |  | ||||||
| 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.10.2](https://git.odit.services/lfk/backend/compare/v0.10.1...v0.10.2) | ||||||
|  |  | ||||||
|  | - Added first selfservice test [`057ae0d`](https://git.odit.services/lfk/backend/commit/057ae0d79758cd627d6d128406a0d201b6b7ad9b) | ||||||
|  | - 🧾New changelog file version [CI SKIP] [skip ci] [`b7ad5d3`](https://git.odit.services/lfk/backend/commit/b7ad5d3a31b8b4f5960852d3ac38af133719ebcd) | ||||||
|  | - First try of the laptime sort [`4471e57`](https://git.odit.services/lfk/backend/commit/4471e57438582d55ff846fd69c2cfcc26b40df2a) | ||||||
|  | - Potential fix for all remaining errors [`377d5da`](https://git.odit.services/lfk/backend/commit/377d5dadb2a14cb2d70e0b2dc77026f51b3fb51c) | ||||||
|  | - At least one fewer test should fail now [`87f444c`](https://git.odit.services/lfk/backend/commit/87f444c30d69d65a9f918c63631a859a389eeee3) | ||||||
|  | - Tried workaround for no availdable stats [`8f0f795`](https://git.odit.services/lfk/backend/commit/8f0f795a709db216396998b68b8bbd64ff4d44ff) | ||||||
|  | - Reverted temp bugfix [`4603a84`](https://git.odit.services/lfk/backend/commit/4603a84f16fb53a14d1792447100f5b470969dd0) | ||||||
|  | - Fixed sorting algo [`988f17a`](https://git.odit.services/lfk/backend/commit/988f17a795bb2d867e9d1d8e78051dff1a14ec30) | ||||||
|  | - Added runners stats tests [`7111068`](https://git.odit.services/lfk/backend/commit/7111068361e00cc1308664a3ae650a56e28c015c) | ||||||
|  | - Added basic laptime endpoint [`cb71fcd`](https://git.odit.services/lfk/backend/commit/cb71fcd13bc61e6214e2fd7b70e72094749463d3) | ||||||
|  | - Added orgs by donations stats tests [`d4a02e7`](https://git.odit.services/lfk/backend/commit/d4a02e7db2ff4976be21605e31aac2f3c82a49c0) | ||||||
|  | - Added teams stats endpoint tests [`b9a7dc8`](https://git.odit.services/lfk/backend/commit/b9a7dc84f05441445453193974b2a793b5197fa5) | ||||||
|  | - Now resolving all missing relations [`257f320`](https://git.odit.services/lfk/backend/commit/257f320ee3bf6429c4314c64023520366f9f730b) | ||||||
|  | - Added min laptime to StatsRunner [`51daf96`](https://git.odit.services/lfk/backend/commit/51daf969cf74792b2c2f2f16ce4359d9fca47bc8) | ||||||
|  | - Fixed sorting [`7b15c2d`](https://git.odit.services/lfk/backend/commit/7b15c2d88b14e7279aad97b0c950202ddb5acaaa) | ||||||
|  | - Fixed top-ten bein top 9 [`a6a526d`](https://git.odit.services/lfk/backend/commit/a6a526dc5d8b1613ea34e82e477081349e764aec) | ||||||
|  | - added new ci secret [`5633e85`](https://git.odit.services/lfk/backend/commit/5633e85f41cb69b10fd8a86f57f1bd2f50848f7b) | ||||||
|  | - Added temp console log for test [`22cae39`](https://git.odit.services/lfk/backend/commit/22cae39bd351ca285880e50187ea0d46a7a26437) | ||||||
|  | - Added temp console log for ci debugging [`4a73eab`](https://git.odit.services/lfk/backend/commit/4a73eab134c3a9f58771be996bc8811b62cf378e) | ||||||
|  | - Temp disabled runners by donations test [`0b07a53`](https://git.odit.services/lfk/backend/commit/0b07a53ed209c6193ead3c4d199545e22333ab32) | ||||||
|  | - Updated default docker-compose [`f8baca5`](https://git.odit.services/lfk/backend/commit/f8baca5ab2c56b906751bc7edd71477456ad91f3) | ||||||
|  | - Removed all useless console.logs [`95e1eec`](https://git.odit.services/lfk/backend/commit/95e1eec313a79458dd75307a9d0f8319af0d0904) | ||||||
|  | - Resolved missing parentgroup relation [`23bd432`](https://git.odit.services/lfk/backend/commit/23bd432c5f33a0863217120d97e2e4ea52a08baf) | ||||||
|  | - Removed console logs for now working tests [`71b33ab`](https://git.odit.services/lfk/backend/commit/71b33ab05b53b62c8b271bd2995c94b2fc212dfd) | ||||||
|  | - Fixed typo in test [`cbcb829`](https://git.odit.services/lfk/backend/commit/cbcb829fbde3a4a5e7f94de5dcf24d854c5fc257) | ||||||
|  | - Ptotential fix for stats failing [`dcdbdd1`](https://git.odit.services/lfk/backend/commit/dcdbdd15acfe6eef4220b7ed66db60d78107d1f9) | ||||||
|  | - 🚀Bumped version to v0.10.2 [`6e236ed`](https://git.odit.services/lfk/backend/commit/6e236ede145e164ee84543fb62404b4776550973) | ||||||
|  | - Merge pull request 'stats/runners/laptime feature/190-runners_laptime' (#191) from feature/190-runners_laptime into dev [`a694ad2`](https://git.odit.services/lfk/backend/commit/a694ad225c68fa23152402acba871c857433cc70) | ||||||
|  | - 🧾New changelog file version [CI SKIP] [skip ci] [`dd6d799`](https://git.odit.services/lfk/backend/commit/dd6d799c847fc96aec1be8f2667ad371890076fb) | ||||||
|  | - Pinned testing container tag to prod container tag [`10221b9`](https://git.odit.services/lfk/backend/commit/10221b9f2e4493080f3ff095d9772bcfd0ac50eb) | ||||||
|  | - Now resolving all relations for orgs by distance [`4a294b1`](https://git.odit.services/lfk/backend/commit/4a294b1e17c44294274b06748ec8141812c2d217) | ||||||
|  | - Added temp console log [`720774f`](https://git.odit.services/lfk/backend/commit/720774fcf47c38601ab88d5d74cfcd0e47b21acf) | ||||||
|  | - Removed console log for passing tests [`132b48c`](https://git.odit.services/lfk/backend/commit/132b48cf2a9e990a5e830c744ed8244bd25e8b3a) | ||||||
|  | - Removed console log [`1d8c8c8`](https://git.odit.services/lfk/backend/commit/1d8c8c8e9cefa58449f7abb2481d9396fe37ba20) | ||||||
|  | - Temp test logging workaround [`bf686e8`](https://git.odit.services/lfk/backend/commit/bf686e89e02998ccc80c838ef890c736c252634c) | ||||||
|  | - Temp test logging workaround [`6163f0a`](https://git.odit.services/lfk/backend/commit/6163f0a90b3721d3a1488f89cbb39ddff7152241) | ||||||
|  | - Removed test for content type [`63964fb`](https://git.odit.services/lfk/backend/commit/63964fbf2c41d9b90f995f056e9db65ab07d54a8) | ||||||
|  |  | ||||||
| #### [v0.10.1](https://git.odit.services/lfk/backend/compare/v0.10.0...v0.10.1) | #### [v0.10.1](https://git.odit.services/lfk/backend/compare/v0.10.0...v0.10.1) | ||||||
|  |  | ||||||
|  | > 3 April 2021 | ||||||
|  |  | ||||||
| - Merge pull request 'Release 0.10.1' (#189) from dev into main [`e89e07d`](https://git.odit.services/lfk/backend/commit/e89e07d0fc99f14148b01204fb8ed39e2da77e38) | - Merge pull request 'Release 0.10.1' (#189) from dev into main [`e89e07d`](https://git.odit.services/lfk/backend/commit/e89e07d0fc99f14148b01204fb8ed39e2da77e38) | ||||||
| - 🧾New changelog file version [CI SKIP] [skip ci] [`69afd4d`](https://git.odit.services/lfk/backend/commit/69afd4d5877401eb46df430f43a7feb273abda1e) | - 🧾New changelog file version [CI SKIP] [skip ci] [`69afd4d`](https://git.odit.services/lfk/backend/commit/69afd4d5877401eb46df430f43a7feb273abda1e) | ||||||
| - 🚀Bumped version to v0.10.1 [`24d152f`](https://git.odit.services/lfk/backend/commit/24d152fdc8fe17fffa2f2a718d7145ba8a91d79c) | - 🚀Bumped version to v0.10.1 [`24d152f`](https://git.odit.services/lfk/backend/commit/24d152fdc8fe17fffa2f2a718d7145ba8a91d79c) | ||||||
|   | |||||||
| @@ -11,8 +11,12 @@ services: | |||||||
|       DB_PORT: bla |       DB_PORT: bla | ||||||
|       DB_USER: bla |       DB_USER: bla | ||||||
|       DB_PASSWORD: bla |       DB_PASSWORD: bla | ||||||
|       DB_NAME: dev.sqlite |       DB_NAME: ./db.sqlite | ||||||
|       NODE_ENV: production |       NODE_ENV: production | ||||||
|  |       POSTALCODE_COUNTRYCODE: DE | ||||||
|  |       SEED_TEST_DATA: "false" | ||||||
|  |       MAILER_URL: https://dev.lauf-fuer-kaya.de/mailer | ||||||
|  |       MAILER_KEY: asdasd | ||||||
|       # APP_PORT: 4010 |       # APP_PORT: 4010 | ||||||
|       # DB_TYPE: postgres |       # DB_TYPE: postgres | ||||||
|       # DB_HOST: backend_db |       # DB_HOST: backend_db | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|   "name": "@odit/lfk-backend", |   "name": "@odit/lfk-backend", | ||||||
|   "version": "0.10.1", |   "version": "0.10.2", | ||||||
|   "main": "src/app.ts", |   "main": "src/app.ts", | ||||||
|   "repository": "https://git.odit.services/lfk/backend", |   "repository": "https://git.odit.services/lfk/backend", | ||||||
|   "author": { |   "author": { | ||||||
|   | |||||||
| @@ -37,6 +37,9 @@ export class StatsController { | |||||||
|     @OpenAPI({ description: "Returns the top ten runners by distance.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) |     @OpenAPI({ description: "Returns the top ten runners by distance.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) | ||||||
|     async getTopRunnersByDistance() { |     async getTopRunnersByDistance() { | ||||||
|         let runners = await getConnection().getRepository(Runner).find({ relations: ['scans', 'group', 'distanceDonations', 'scans.track'] }); |         let runners = await getConnection().getRepository(Runner).find({ relations: ['scans', 'group', 'distanceDonations', 'scans.track'] }); | ||||||
|  |         if (!runners || runners.length == 0) { | ||||||
|  |             return []; | ||||||
|  |         } | ||||||
|         let topRunners = runners.sort((runner1, runner2) => runner2.distance - runner1.distance).slice(0, 10); |         let topRunners = runners.sort((runner1, runner2) => runner2.distance - runner1.distance).slice(0, 10); | ||||||
|         let responseRunners: ResponseStatsRunner[] = new Array<ResponseStatsRunner>(); |         let responseRunners: ResponseStatsRunner[] = new Array<ResponseStatsRunner>(); | ||||||
|         topRunners.forEach(runner => { |         topRunners.forEach(runner => { | ||||||
| @@ -50,7 +53,10 @@ export class StatsController { | |||||||
|     @ResponseSchema(ResponseStatsRunner, { isArray: true }) |     @ResponseSchema(ResponseStatsRunner, { isArray: true }) | ||||||
|     @OpenAPI({ description: "Returns the top ten runners by donations.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) |     @OpenAPI({ description: "Returns the top ten runners by donations.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) | ||||||
|     async getTopRunnersByDonations() { |     async getTopRunnersByDonations() { | ||||||
|         let runners = await getConnection().getRepository(Runner).find({ relations: ['scans', 'group', 'distanceDonations', 'scans.track'] }); |         let runners = await getConnection().getRepository(Runner).find({ relations: ['group', 'distanceDonations', 'distanceDonations.runner', 'distanceDonations.runner.scans', 'distanceDonations.runner.scans.track'] }); | ||||||
|  |         if (!runners || runners.length == 0) { | ||||||
|  |             return []; | ||||||
|  |         } | ||||||
|         let topRunners = runners.sort((runner1, runner2) => runner2.distanceDonationAmount - runner1.distanceDonationAmount).slice(0, 10); |         let topRunners = runners.sort((runner1, runner2) => runner2.distanceDonationAmount - runner1.distanceDonationAmount).slice(0, 10); | ||||||
|         let responseRunners: ResponseStatsRunner[] = new Array<ResponseStatsRunner>(); |         let responseRunners: ResponseStatsRunner[] = new Array<ResponseStatsRunner>(); | ||||||
|         topRunners.forEach(runner => { |         topRunners.forEach(runner => { | ||||||
| @@ -65,6 +71,9 @@ export class StatsController { | |||||||
|     @OpenAPI({ description: "Returns the top ten runners by fastest laptime on your selected track (track by id).", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) |     @OpenAPI({ description: "Returns the top ten runners by fastest laptime on your selected track (track by id).", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) | ||||||
|     async getTopRunnersByLaptime(@QueryParam("track") track: number) { |     async getTopRunnersByLaptime(@QueryParam("track") track: number) { | ||||||
|         let scans = await getConnection().getRepository(TrackScan).find({ relations: ['track', 'runner', 'runner.group', 'runner.scans', 'runner.scans.track', 'runner.distanceDonations'] }); |         let scans = await getConnection().getRepository(TrackScan).find({ relations: ['track', 'runner', 'runner.group', 'runner.scans', 'runner.scans.track', 'runner.distanceDonations'] }); | ||||||
|  |         if (!scans || scans.length == 0) { | ||||||
|  |             return []; | ||||||
|  |         } | ||||||
|         scans = scans.filter((s) => { return s.track.id == track && s.valid == true && s.lapTime != 0 }).sort((scan1, scan2) => scan1.lapTime - scan2.lapTime); |         scans = scans.filter((s) => { return s.track.id == track && s.valid == true && s.lapTime != 0 }).sort((scan1, scan2) => scan1.lapTime - scan2.lapTime); | ||||||
|  |  | ||||||
|         let topScans = new Array<TrackScan>(); |         let topScans = new Array<TrackScan>(); | ||||||
| @@ -97,7 +106,10 @@ export class StatsController { | |||||||
|     @ResponseSchema(ResponseStatsTeam, { isArray: true }) |     @ResponseSchema(ResponseStatsTeam, { isArray: true }) | ||||||
|     @OpenAPI({ description: "Returns the top ten teams by distance.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) |     @OpenAPI({ description: "Returns the top ten teams by distance.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) | ||||||
|     async getTopTeamsByDistance() { |     async getTopTeamsByDistance() { | ||||||
|         let teams = await getConnection().getRepository(RunnerTeam).find({ relations: ['runners', 'runners.scans', 'runners.distanceDonations', 'runners.scans.track'] }); |         let teams = await getConnection().getRepository(RunnerTeam).find({ relations: ['parentGroup', 'runners', 'runners.scans', 'runners.scans.track'] }); | ||||||
|  |         if (!teams || teams.length == 0) { | ||||||
|  |             return []; | ||||||
|  |         } | ||||||
|         let topTeams = teams.sort((team1, team2) => team2.distance - team1.distance).slice(0, 10); |         let topTeams = teams.sort((team1, team2) => team2.distance - team1.distance).slice(0, 10); | ||||||
|         let responseTeams: ResponseStatsTeam[] = new Array<ResponseStatsTeam>(); |         let responseTeams: ResponseStatsTeam[] = new Array<ResponseStatsTeam>(); | ||||||
|         topTeams.forEach(team => { |         topTeams.forEach(team => { | ||||||
| @@ -111,7 +123,10 @@ export class StatsController { | |||||||
|     @ResponseSchema(ResponseStatsTeam, { isArray: true }) |     @ResponseSchema(ResponseStatsTeam, { isArray: true }) | ||||||
|     @OpenAPI({ description: "Returns the top ten teams by donations.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) |     @OpenAPI({ description: "Returns the top ten teams by donations.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) | ||||||
|     async getTopTeamsByDonations() { |     async getTopTeamsByDonations() { | ||||||
|         let teams = await getConnection().getRepository(RunnerTeam).find({ relations: ['runners', 'runners.scans', 'runners.distanceDonations', 'runners.scans.track'] }); |         let teams = await getConnection().getRepository(RunnerTeam).find({ relations: ['parentGroup', 'runners', 'runners.scans', 'runners.distanceDonations', 'runners.scans.track'] }); | ||||||
|  |         if (!teams || teams.length == 0) { | ||||||
|  |             return []; | ||||||
|  |         } | ||||||
|         let topTeams = teams.sort((team1, team2) => team2.distanceDonationAmount - team1.distanceDonationAmount).slice(0, 10); |         let topTeams = teams.sort((team1, team2) => team2.distanceDonationAmount - team1.distanceDonationAmount).slice(0, 10); | ||||||
|         let responseTeams: ResponseStatsTeam[] = new Array<ResponseStatsTeam>(); |         let responseTeams: ResponseStatsTeam[] = new Array<ResponseStatsTeam>(); | ||||||
|         topTeams.forEach(team => { |         topTeams.forEach(team => { | ||||||
| @@ -126,6 +141,9 @@ export class StatsController { | |||||||
|     @OpenAPI({ description: "Returns the top ten organizations by distance.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) |     @OpenAPI({ description: "Returns the top ten organizations by distance.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) | ||||||
|     async getTopOrgsByDistance() { |     async getTopOrgsByDistance() { | ||||||
|         let orgs = await getConnection().getRepository(RunnerOrganization).find({ relations: ['runners', 'runners.scans', 'runners.distanceDonations', 'runners.scans.track', 'teams', 'teams.runners', 'teams.runners.scans', 'teams.runners.distanceDonations', 'teams.runners.scans.track'] }); |         let orgs = await getConnection().getRepository(RunnerOrganization).find({ relations: ['runners', 'runners.scans', 'runners.distanceDonations', 'runners.scans.track', 'teams', 'teams.runners', 'teams.runners.scans', 'teams.runners.distanceDonations', 'teams.runners.scans.track'] }); | ||||||
|  |         if (!orgs || orgs.length == 0) { | ||||||
|  |             return []; | ||||||
|  |         } | ||||||
|         let topOrgs = orgs.sort((org1, org2) => org2.distance - org1.distance).slice(0, 10); |         let topOrgs = orgs.sort((org1, org2) => org2.distance - org1.distance).slice(0, 10); | ||||||
|         let responseOrgs: ResponseStatsOrgnisation[] = new Array<ResponseStatsOrgnisation>(); |         let responseOrgs: ResponseStatsOrgnisation[] = new Array<ResponseStatsOrgnisation>(); | ||||||
|         topOrgs.forEach(org => { |         topOrgs.forEach(org => { | ||||||
| @@ -139,7 +157,10 @@ export class StatsController { | |||||||
|     @ResponseSchema(ResponseStatsOrgnisation, { isArray: true }) |     @ResponseSchema(ResponseStatsOrgnisation, { isArray: true }) | ||||||
|     @OpenAPI({ description: "Returns the top ten organizations by donations.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) |     @OpenAPI({ description: "Returns the top ten organizations by donations.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) | ||||||
|     async getTopOrgsByDonations() { |     async getTopOrgsByDonations() { | ||||||
|         let orgs = await getConnection().getRepository(RunnerOrganization).find({ relations: ['runners', 'runners.scans', 'runners.distanceDonations', 'runners.scans.track', 'teams', 'teams.runners', 'teams.runners.scans', 'teams.runners.distanceDonations', 'teams.runners.scans.track'] }); |         let orgs = await getConnection().getRepository(RunnerOrganization).find({ relations: ['runners', 'runners.distanceDonations', 'runners.distanceDonations.runner', 'runners.distanceDonations.runner.scans', 'runners.distanceDonations.runner.scans.track', 'teams', 'teams.runners', 'teams.runners.distanceDonations', 'teams.runners.distanceDonations.runner', 'teams.runners.distanceDonations.runner.scans', 'teams.runners.distanceDonations.runner.scans.track'] }); | ||||||
|  |         if (!orgs || orgs.length == 0) { | ||||||
|  |             return []; | ||||||
|  |         } | ||||||
|         let topOrgs = orgs.sort((org1, org2) => org2.distanceDonationAmount - org1.distanceDonationAmount).slice(0, 10); |         let topOrgs = orgs.sort((org1, org2) => org2.distanceDonationAmount - org1.distanceDonationAmount).slice(0, 10); | ||||||
|         let responseOrgs: ResponseStatsOrgnisation[] = new Array<ResponseStatsOrgnisation>(); |         let responseOrgs: ResponseStatsOrgnisation[] = new Array<ResponseStatsOrgnisation>(); | ||||||
|         topOrgs.forEach(org => { |         topOrgs.forEach(org => { | ||||||
|   | |||||||
| @@ -51,6 +51,9 @@ export abstract class RunnerGroup { | |||||||
|   */ |   */ | ||||||
|   @IsInt() |   @IsInt() | ||||||
|   public get distance(): number { |   public get distance(): number { | ||||||
|  |     if (!this.runners || this.runners.length == 0) { | ||||||
|  |       return 0; | ||||||
|  |     } | ||||||
|     return this.runners.reduce((sum, current) => sum + current.distance, 0); |     return this.runners.reduce((sum, current) => sum + current.distance, 0); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -49,7 +49,15 @@ export class ResponseStatsOrgnisation implements IResponse { | |||||||
|     public constructor(org: RunnerOrganization) { |     public constructor(org: RunnerOrganization) { | ||||||
|         this.name = org.name; |         this.name = org.name; | ||||||
|         this.id = org.id; |         this.id = org.id; | ||||||
|  |         try { | ||||||
|             this.distance = org.distance; |             this.distance = org.distance; | ||||||
|  |         } catch { | ||||||
|  |             this.distance = -1; | ||||||
|  |         } | ||||||
|  |         try { | ||||||
|             this.donationAmount = org.distanceDonationAmount; |             this.donationAmount = org.distanceDonationAmount; | ||||||
|  |         } catch { | ||||||
|  |             this.donationAmount = -1; | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -76,10 +76,22 @@ export class ResponseStatsRunner implements IResponse { | |||||||
|     public constructor(runner: Runner, laptime?: number) { |     public constructor(runner: Runner, laptime?: number) { | ||||||
|         this.id = runner.id; |         this.id = runner.id; | ||||||
|         this.firstname = runner.firstname; |         this.firstname = runner.firstname; | ||||||
|  |         if (runner.firstname) { | ||||||
|             this.middlename = runner.middlename; |             this.middlename = runner.middlename; | ||||||
|  |         } | ||||||
|         this.lastname = runner.lastname; |         this.lastname = runner.lastname; | ||||||
|  |         try { | ||||||
|             this.distance = runner.distance; |             this.distance = runner.distance; | ||||||
|  |         } | ||||||
|  |         catch { | ||||||
|  |             this.distance = -1; | ||||||
|  |         } | ||||||
|  |         try { | ||||||
|             this.donationAmount = runner.distanceDonationAmount; |             this.donationAmount = runner.distanceDonationAmount; | ||||||
|  |         } | ||||||
|  |         catch { | ||||||
|  |             this.donationAmount = -1; | ||||||
|  |         } | ||||||
|         if (laptime) { |         if (laptime) { | ||||||
|             this.minLaptime = laptime; |             this.minLaptime = laptime; | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -57,7 +57,15 @@ export class ResponseStatsTeam implements IResponse { | |||||||
|         this.name = team.name; |         this.name = team.name; | ||||||
|         this.id = team.id; |         this.id = team.id; | ||||||
|         this.parent = team.parentGroup.toResponse(); |         this.parent = team.parentGroup.toResponse(); | ||||||
|  |         try { | ||||||
|             this.distance = team.distance; |             this.distance = team.distance; | ||||||
|  |         } catch { | ||||||
|  |             this.distance = -1; | ||||||
|  |         } | ||||||
|  |         try { | ||||||
|             this.donationAmount = team.distanceDonationAmount; |             this.donationAmount = team.distanceDonationAmount; | ||||||
|  |         } catch { | ||||||
|  |             this.donationAmount = -1; | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -50,11 +50,11 @@ describe('GET /api/stats/runners/* should return 200', () => { | |||||||
|         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('get by donations w/ auth should return 200', async () => { |     it('get by donations w/ auth should return 200', async () => { | ||||||
|     //     const res = await axios.get(base + '/api/stats/runners/donations', axios_config_stats); |         const res = await axios.get(base + '/api/stats/runners/donations', axios_config_stats); | ||||||
|     //     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('get by laptime w/ auth should return 200', async () => { |     it('get by laptime w/ auth should return 200', async () => { | ||||||
|         const res = await axios.get(base + '/api/stats/runners/laptime', axios_config_stats); |         const res = await axios.get(base + '/api/stats/runners/laptime', axios_config_stats); | ||||||
|         expect(res.status).toEqual(200); |         expect(res.status).toEqual(200); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user