From dd6d799c847fc96aec1be8f2667ad371890076fb Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Sat, 3 Apr 2021 16:25:14 +0000 Subject: [PATCH 01/37] =?UTF-8?q?=F0=9F=A7=BENew=20changelog=20file=20vers?= =?UTF-8?q?ion=20[CI=20SKIP]=20[skip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9bca9f8..db9d355 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,15 +4,17 @@ All notable changes to this project will be documented in this file. Dates are d #### [v0.10.1](https://git.odit.services/lfk/backend/compare/v0.10.0...v0.10.1) +- 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) - 🚀Bumped version to v0.10.1 [`24d152f`](https://git.odit.services/lfk/backend/commit/24d152fdc8fe17fffa2f2a718d7145ba8a91d79c) +- New class: ResponseSelfServiceDonor [`d70c5b1`](https://git.odit.services/lfk/backend/commit/d70c5b1bbc9f02782f8755b6929e2d3458e10221) - 🧾New changelog file version [CI SKIP] [skip ci] [`4279e43`](https://git.odit.services/lfk/backend/commit/4279e4374304887e8db40eab77763b20bbce91a1) - Removed duplicate openapi statement [`4834a66`](https://git.odit.services/lfk/backend/commit/4834a6698b0958602421c1478a95fec7edda910b) -- Merge pull request 'Selfservice donations reformatting feature/187-selfservice_donation' (#188) from feature/187-selfservice_donation into dev [`d837654`](https://git.odit.services/lfk/backend/commit/d837654617f7de5d055ffb06c65e2cd52f65c604) -- New class: ResponseSelfServiceDonor [`d70c5b1`](https://git.odit.services/lfk/backend/commit/d70c5b1bbc9f02782f8755b6929e2d3458e10221) - Switched selfservice donation.donor from string to object [`0767943`](https://git.odit.services/lfk/backend/commit/0767943721b6964d542f580c541e744f86444ac6) - Adjusted runner property names [`ca87774`](https://git.odit.services/lfk/backend/commit/ca87774767807a2c4bc869b0de95cc73832a8405) - 🧾New changelog file version [CI SKIP] [skip ci] [`71e3d0e`](https://git.odit.services/lfk/backend/commit/71e3d0efe2cbde47aea0f26cb5a8b5cd3312707d) +- 🧾New changelog file version [CI SKIP] [skip ci] [`c28843c`](https://git.odit.services/lfk/backend/commit/c28843c405dc4fd06a10f0fb85814acede15a769) +- Merge pull request 'Selfservice donations reformatting feature/187-selfservice_donation' (#188) from feature/187-selfservice_donation into dev [`d837654`](https://git.odit.services/lfk/backend/commit/d837654617f7de5d055ffb06c65e2cd52f65c604) - Added new responsetype for new class [`f693f2c`](https://git.odit.services/lfk/backend/commit/f693f2cde9a04147155aea4de5d52e1d19d722ca) #### [v0.10.0](https://git.odit.services/lfk/backend/compare/v0.9.2...v0.10.0) From a6a526dc5d8b1613ea34e82e477081349e764aec Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Mon, 5 Apr 2021 17:47:51 +0200 Subject: [PATCH 02/37] Fixed top-ten bein top 9 ref #190 --- src/controllers/StatsController.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/controllers/StatsController.ts b/src/controllers/StatsController.ts index ccc9527..416f907 100644 --- a/src/controllers/StatsController.ts +++ b/src/controllers/StatsController.ts @@ -36,7 +36,7 @@ export class StatsController { @OpenAPI({ description: "Returns the top ten runners by distance.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) async getTopRunnersByDistance() { let runners = await getConnection().getRepository(Runner).find({ relations: ['scans', 'group', 'distanceDonations', 'scans.track'] }); - let topRunners = runners.sort((runner1, runner2) => runner1.distance - runner2.distance).slice(0, 9); + let topRunners = runners.sort((runner1, runner2) => runner1.distance - runner2.distance).slice(0, 10); let responseRunners: ResponseStatsRunner[] = new Array(); topRunners.forEach(runner => { responseRunners.push(new ResponseStatsRunner(runner)); @@ -50,7 +50,7 @@ export class StatsController { @OpenAPI({ description: "Returns the top ten runners by donations.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) async getTopRunnersByDonations() { let runners = await getConnection().getRepository(Runner).find({ relations: ['scans', 'group', 'distanceDonations', 'scans.track'] }); - let topRunners = runners.sort((runner1, runner2) => runner1.distanceDonationAmount - runner2.distanceDonationAmount).slice(0, 9); + let topRunners = runners.sort((runner1, runner2) => runner1.distanceDonationAmount - runner2.distanceDonationAmount).slice(0, 10); let responseRunners: ResponseStatsRunner[] = new Array(); topRunners.forEach(runner => { responseRunners.push(new ResponseStatsRunner(runner)); @@ -72,7 +72,7 @@ export class StatsController { @OpenAPI({ description: "Returns the top ten teams by distance.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) async getTopTeamsByDistance() { let teams = await getConnection().getRepository(RunnerTeam).find({ relations: ['runners', 'runners.scans', 'runners.distanceDonations', 'runners.scans.track'] }); - let topTeams = teams.sort((team1, team2) => team1.distance - team2.distance).slice(0, 9); + let topTeams = teams.sort((team1, team2) => team1.distance - team2.distance).slice(0, 10); let responseTeams: ResponseStatsTeam[] = new Array(); topTeams.forEach(team => { responseTeams.push(new ResponseStatsTeam(team)); @@ -86,7 +86,7 @@ export class StatsController { @OpenAPI({ description: "Returns the top ten teams by donations.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) async getTopTeamsByDonations() { let teams = await getConnection().getRepository(RunnerTeam).find({ relations: ['runners', 'runners.scans', 'runners.distanceDonations', 'runners.scans.track'] }); - let topTeams = teams.sort((team1, team2) => team1.distanceDonationAmount - team2.distanceDonationAmount).slice(0, 9); + let topTeams = teams.sort((team1, team2) => team1.distanceDonationAmount - team2.distanceDonationAmount).slice(0, 10); let responseTeams: ResponseStatsTeam[] = new Array(); topTeams.forEach(team => { responseTeams.push(new ResponseStatsTeam(team)); @@ -100,7 +100,7 @@ export class StatsController { @OpenAPI({ description: "Returns the top ten organizations by distance.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) 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 topOrgs = orgs.sort((org1, org2) => org1.distance - org2.distance).slice(0, 9); + let topOrgs = orgs.sort((org1, org2) => org1.distance - org2.distance).slice(0, 10); let responseOrgs: ResponseStatsOrgnisation[] = new Array(); topOrgs.forEach(org => { responseOrgs.push(new ResponseStatsOrgnisation(org)); @@ -114,7 +114,7 @@ export class StatsController { @OpenAPI({ description: "Returns the top ten organizations by donations.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) 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 topOrgs = orgs.sort((org1, org2) => org1.distanceDonationAmount - org2.distanceDonationAmount).slice(0, 9); + let topOrgs = orgs.sort((org1, org2) => org1.distanceDonationAmount - org2.distanceDonationAmount).slice(0, 10); let responseOrgs: ResponseStatsOrgnisation[] = new Array(); topOrgs.forEach(org => { responseOrgs.push(new ResponseStatsOrgnisation(org)); From cb71fcd13bc61e6214e2fd7b70e72094749463d3 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Tue, 6 Apr 2021 08:13:43 +0200 Subject: [PATCH 03/37] Added basic laptime endpoint ref #190 --- src/controllers/StatsController.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/controllers/StatsController.ts b/src/controllers/StatsController.ts index 416f907..8658ba6 100644 --- a/src/controllers/StatsController.ts +++ b/src/controllers/StatsController.ts @@ -58,6 +58,20 @@ export class StatsController { return responseRunners; } + @Get("/runners/laptime") + @UseBefore(StatsAuth) + @ResponseSchema(ResponseStatsRunner, { isArray: true }) + @OpenAPI({ description: "Returns the top ten runners by fastest laptime.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) + async getTopRunnersByLaptime() { + let runners = await getConnection().getRepository(Runner).find({ relations: ['scans', 'group', 'scans.track'] }); + let topRunners = runners.sort((runner1, runner2) => runner1.distanceDonationAmount - runner2.distanceDonationAmount).slice(0, 10); + let responseRunners: ResponseStatsRunner[] = new Array(); + topRunners.forEach(runner => { + responseRunners.push(new ResponseStatsRunner(runner)); + }); + return responseRunners; + } + @Get("/scans") @UseBefore(StatsAuth) @ResponseSchema(ResponseStatsRunner, { isArray: true }) From 51daf969cf74792b2c2f2f16ce4359d9fca47bc8 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Tue, 6 Apr 2021 08:14:02 +0200 Subject: [PATCH 04/37] Added min laptime to StatsRunner ref #190 --- src/models/responses/ResponseStatsRunner.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/models/responses/ResponseStatsRunner.ts b/src/models/responses/ResponseStatsRunner.ts index 3aac437..a8d66e6 100644 --- a/src/models/responses/ResponseStatsRunner.ts +++ b/src/models/responses/ResponseStatsRunner.ts @@ -1,6 +1,7 @@ import { IsInt, IsObject, + IsOptional, IsString } from "class-validator"; import { Runner } from '../entities/Runner'; @@ -55,6 +56,13 @@ export class ResponseStatsRunner implements IResponse { @IsInt() donationAmount: number; + /** + * The runner's fastest laptime in seconds. + */ + @IsInt() + @IsOptional() + minLaptime?: number; + /** * The runner's group. */ @@ -65,13 +73,16 @@ export class ResponseStatsRunner implements IResponse { * Creates a new runner stats response from a runner * @param runner The runner whoes response shall be generated - the following relations have to be resolved: scans, group, distanceDonations, scans.track */ - public constructor(runner: Runner) { + public constructor(runner: Runner, laptime?: number) { this.id = runner.id; this.firstname = runner.firstname; this.middlename = runner.middlename; this.lastname = runner.lastname; this.distance = runner.distance; this.donationAmount = runner.distanceDonationAmount; + if (laptime) { + this.minLaptime = laptime; + } this.group = runner.group.toResponse(); } } From 4471e57438582d55ff846fd69c2cfcc26b40df2a Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Tue, 6 Apr 2021 08:44:14 +0200 Subject: [PATCH 05/37] First try of the laptime sort ref #190 --- src/controllers/StatsController.ts | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/controllers/StatsController.ts b/src/controllers/StatsController.ts index 8658ba6..829358a 100644 --- a/src/controllers/StatsController.ts +++ b/src/controllers/StatsController.ts @@ -1,4 +1,4 @@ -import { Get, JsonController, UseBefore } from 'routing-controllers'; +import { Get, JsonController, QueryParam, UseBefore } from 'routing-controllers'; import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi'; import { getConnection } from 'typeorm'; import StatsAuth from '../middlewares/StatsAuth'; @@ -7,6 +7,7 @@ import { Runner } from '../models/entities/Runner'; import { RunnerOrganization } from '../models/entities/RunnerOrganization'; import { RunnerTeam } from '../models/entities/RunnerTeam'; import { Scan } from '../models/entities/Scan'; +import { TrackScan } from '../models/entities/TrackScan'; import { User } from '../models/entities/User'; import { ResponseStats } from '../models/responses/ResponseStats'; import { ResponseStatsOrgnisation } from '../models/responses/ResponseStatsOrganization'; @@ -61,13 +62,24 @@ export class StatsController { @Get("/runners/laptime") @UseBefore(StatsAuth) @ResponseSchema(ResponseStatsRunner, { isArray: true }) - @OpenAPI({ description: "Returns the top ten runners by fastest laptime.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) - async getTopRunnersByLaptime() { - let runners = await getConnection().getRepository(Runner).find({ relations: ['scans', 'group', 'scans.track'] }); - let topRunners = runners.sort((runner1, runner2) => runner1.distanceDonationAmount - runner2.distanceDonationAmount).slice(0, 10); + @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) { + let scans = await getConnection().getRepository(TrackScan).find({ relations: ['runner', 'runner.group', 'track'] }); + scans = scans.filter((s) => { s.track.id == track && s.valid == true }) + console.log(scans) + let topScans = new Array(); + let knownRunners = new Array(); + for (let i = 0; i < scans.length && topScans.length < 10; i++) { + const element = scans[i]; + if (!knownRunners.includes(element.runner)) { + topScans.push(element); + knownRunners.push(element.runner); + } + } + let responseRunners: ResponseStatsRunner[] = new Array(); - topRunners.forEach(runner => { - responseRunners.push(new ResponseStatsRunner(runner)); + topScans.forEach(scan => { + responseRunners.push(new ResponseStatsRunner(scan.runner, scan.lapTime)); }); return responseRunners; } From 988f17a795bb2d867e9d1d8e78051dff1a14ec30 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Tue, 6 Apr 2021 08:56:34 +0200 Subject: [PATCH 06/37] Fixed sorting algo ref #190 --- src/controllers/StatsController.ts | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/controllers/StatsController.ts b/src/controllers/StatsController.ts index 829358a..09c6efc 100644 --- a/src/controllers/StatsController.ts +++ b/src/controllers/StatsController.ts @@ -65,23 +65,22 @@ export class StatsController { @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) { let scans = await getConnection().getRepository(TrackScan).find({ relations: ['runner', 'runner.group', 'track'] }); - scans = scans.filter((s) => { s.track.id == track && s.valid == true }) - console.log(scans) + 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(); - let knownRunners = new Array(); + let knownRunners = new Array(); for (let i = 0; i < scans.length && topScans.length < 10; i++) { const element = scans[i]; - if (!knownRunners.includes(element.runner)) { + if (!knownRunners.includes(element.runner.id)) { topScans.push(element); - knownRunners.push(element.runner); + knownRunners.push(element.runner.id); } } - let responseRunners: ResponseStatsRunner[] = new Array(); - topScans.forEach(scan => { - responseRunners.push(new ResponseStatsRunner(scan.runner, scan.lapTime)); - }); - return responseRunners; + // let responseRunners: ResponseStatsRunner[] = new Array(); + // topScans.forEach(scan => { + // responseRunners.push(new ResponseStatsRunner(scan.runner, scan.lapTime)); + // }); + return topScans; } @Get("/scans") From 7b15c2d88b14e7279aad97b0c950202ddb5acaaa Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Tue, 6 Apr 2021 08:58:22 +0200 Subject: [PATCH 07/37] Fixed sorting ref #190 --- src/controllers/StatsController.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/controllers/StatsController.ts b/src/controllers/StatsController.ts index 09c6efc..3294281 100644 --- a/src/controllers/StatsController.ts +++ b/src/controllers/StatsController.ts @@ -37,7 +37,7 @@ export class StatsController { @OpenAPI({ description: "Returns the top ten runners by distance.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) async getTopRunnersByDistance() { let runners = await getConnection().getRepository(Runner).find({ relations: ['scans', 'group', 'distanceDonations', 'scans.track'] }); - let topRunners = runners.sort((runner1, runner2) => runner1.distance - runner2.distance).slice(0, 10); + let topRunners = runners.sort((runner1, runner2) => runner2.distance - runner1.distance).slice(0, 10); let responseRunners: ResponseStatsRunner[] = new Array(); topRunners.forEach(runner => { responseRunners.push(new ResponseStatsRunner(runner)); @@ -51,7 +51,7 @@ export class StatsController { @OpenAPI({ description: "Returns the top ten runners by donations.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) async getTopRunnersByDonations() { let runners = await getConnection().getRepository(Runner).find({ relations: ['scans', 'group', 'distanceDonations', 'scans.track'] }); - let topRunners = runners.sort((runner1, runner2) => runner1.distanceDonationAmount - runner2.distanceDonationAmount).slice(0, 10); + let topRunners = runners.sort((runner1, runner2) => runner2.distanceDonationAmount - runner1.distanceDonationAmount).slice(0, 10); let responseRunners: ResponseStatsRunner[] = new Array(); topRunners.forEach(runner => { responseRunners.push(new ResponseStatsRunner(runner)); @@ -97,7 +97,7 @@ export class StatsController { @OpenAPI({ description: "Returns the top ten teams by distance.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) async getTopTeamsByDistance() { let teams = await getConnection().getRepository(RunnerTeam).find({ relations: ['runners', 'runners.scans', 'runners.distanceDonations', 'runners.scans.track'] }); - let topTeams = teams.sort((team1, team2) => team1.distance - team2.distance).slice(0, 10); + let topTeams = teams.sort((team1, team2) => team2.distance - team1.distance).slice(0, 10); let responseTeams: ResponseStatsTeam[] = new Array(); topTeams.forEach(team => { responseTeams.push(new ResponseStatsTeam(team)); @@ -111,7 +111,7 @@ export class StatsController { @OpenAPI({ description: "Returns the top ten teams by donations.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) async getTopTeamsByDonations() { let teams = await getConnection().getRepository(RunnerTeam).find({ relations: ['runners', 'runners.scans', 'runners.distanceDonations', 'runners.scans.track'] }); - let topTeams = teams.sort((team1, team2) => team1.distanceDonationAmount - team2.distanceDonationAmount).slice(0, 10); + let topTeams = teams.sort((team1, team2) => team2.distanceDonationAmount - team1.distanceDonationAmount).slice(0, 10); let responseTeams: ResponseStatsTeam[] = new Array(); topTeams.forEach(team => { responseTeams.push(new ResponseStatsTeam(team)); @@ -125,7 +125,7 @@ export class StatsController { @OpenAPI({ description: "Returns the top ten organizations by distance.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) 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 topOrgs = orgs.sort((org1, org2) => org1.distance - org2.distance).slice(0, 10); + let topOrgs = orgs.sort((org1, org2) => org2.distance - org1.distance).slice(0, 10); let responseOrgs: ResponseStatsOrgnisation[] = new Array(); topOrgs.forEach(org => { responseOrgs.push(new ResponseStatsOrgnisation(org)); @@ -139,7 +139,7 @@ export class StatsController { @OpenAPI({ description: "Returns the top ten organizations by donations.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) 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 topOrgs = orgs.sort((org1, org2) => org1.distanceDonationAmount - org2.distanceDonationAmount).slice(0, 10); + let topOrgs = orgs.sort((org1, org2) => org2.distanceDonationAmount - org1.distanceDonationAmount).slice(0, 10); let responseOrgs: ResponseStatsOrgnisation[] = new Array(); topOrgs.forEach(org => { responseOrgs.push(new ResponseStatsOrgnisation(org)); From 257f320ee3bf6429c4314c64023520366f9f730b Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Tue, 6 Apr 2021 09:02:07 +0200 Subject: [PATCH 08/37] Now resolving all missing relations ref #190 --- src/controllers/StatsController.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/controllers/StatsController.ts b/src/controllers/StatsController.ts index 3294281..6e9c108 100644 --- a/src/controllers/StatsController.ts +++ b/src/controllers/StatsController.ts @@ -64,8 +64,9 @@ export class StatsController { @ResponseSchema(ResponseStatsRunner, { isArray: true }) @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) { - let scans = await getConnection().getRepository(TrackScan).find({ relations: ['runner', 'runner.group', 'track'] }); + let scans = await getConnection().getRepository(TrackScan).find({ relations: ['track', 'runner', 'runner.group', 'runner.scans', 'runner.scans.track', 'runner.distanceDonations'] }); 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(); let knownRunners = new Array(); for (let i = 0; i < scans.length && topScans.length < 10; i++) { @@ -76,11 +77,11 @@ export class StatsController { } } - // let responseRunners: ResponseStatsRunner[] = new Array(); - // topScans.forEach(scan => { - // responseRunners.push(new ResponseStatsRunner(scan.runner, scan.lapTime)); - // }); - return topScans; + let responseRunners: ResponseStatsRunner[] = new Array(); + topScans.forEach(scan => { + responseRunners.push(new ResponseStatsRunner(scan.runner, scan.lapTime)); + }); + return responseRunners; } @Get("/scans") From 057ae0d79758cd627d6d128406a0d201b6b7ad9b Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Tue, 6 Apr 2021 09:09:01 +0200 Subject: [PATCH 09/37] Added first selfservice test ref #190 --- src/tests/stats/stats_get.spec.ts | 46 +++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/tests/stats/stats_get.spec.ts diff --git a/src/tests/stats/stats_get.spec.ts b/src/tests/stats/stats_get.spec.ts new file mode 100644 index 0000000..422fe07 --- /dev/null +++ b/src/tests/stats/stats_get.spec.ts @@ -0,0 +1,46 @@ +import axios from 'axios'; +import { config } from '../../config'; +const base = "http://localhost:" + config.internal_port + +let axios_config_full; +let axios_config_stats; + +beforeAll(async () => { + jest.setTimeout(20000); + const res = await axios.post(base + '/api/auth/login', { username: "demo", password: "demo" }); + let access_token = res.data["access_token"]; + axios_config_full = { + headers: { "authorization": "Bearer " + access_token }, + validateStatus: undefined + }; + const res2 = await axios.post(base + '/api/statsclients', { username: "demo", password: "demo" }, axios_config_full); + access_token = res2.data["key"]; + axios_config_stats = { + headers: { "authorization": "Bearer " + access_token }, + validateStatus: undefined + }; +}); + +describe('GET /api/stats/distance w/o auth should return 200', () => { + it('get with invalid token should return 401', async () => { + const res = await axios.get(base + '/api/stats/distance', { + headers: { "authorization": "Bearer 123123123123123123" }, + validateStatus: undefined + }); + expect(res.status).toEqual(401); + expect(res.headers['content-type']).toContain("application/json"); + }); +}); +// --------------- +describe('GET /api/stats should return 200', () => { + it('get w/o auth should return 200', async () => { + const res = await axios.get(base + '/api/stats', { validateStatus: undefined }); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + }); + it('get w/ auth should return 200', async () => { + const res = await axios.get(base + '/api/stats', axios_config_stats); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + }); +}); \ No newline at end of file From cbcb829fbde3a4a5e7f94de5dcf24d854c5fc257 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Tue, 6 Apr 2021 09:12:03 +0200 Subject: [PATCH 10/37] Fixed typo in test ref #190 --- src/tests/stats/stats_get.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tests/stats/stats_get.spec.ts b/src/tests/stats/stats_get.spec.ts index 422fe07..262cf93 100644 --- a/src/tests/stats/stats_get.spec.ts +++ b/src/tests/stats/stats_get.spec.ts @@ -21,9 +21,9 @@ beforeAll(async () => { }; }); -describe('GET /api/stats/distance w/o auth should return 200', () => { +describe('GET /api/stats/runners/distance w/o auth should return 200', () => { it('get with invalid token should return 401', async () => { - const res = await axios.get(base + '/api/stats/distance', { + const res = await axios.get(base + '/api/stats/runners/distance', { headers: { "authorization": "Bearer 123123123123123123" }, validateStatus: undefined }); From 63964fbf2c41d9b90f995f056e9db65ab07d54a8 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Tue, 6 Apr 2021 09:14:45 +0200 Subject: [PATCH 11/37] Removed test for content type ref #190 --- src/tests/stats/stats_get.spec.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/tests/stats/stats_get.spec.ts b/src/tests/stats/stats_get.spec.ts index 262cf93..92b898a 100644 --- a/src/tests/stats/stats_get.spec.ts +++ b/src/tests/stats/stats_get.spec.ts @@ -28,7 +28,6 @@ describe('GET /api/stats/runners/distance w/o auth should return 200', () => { validateStatus: undefined }); expect(res.status).toEqual(401); - expect(res.headers['content-type']).toContain("application/json"); }); }); // --------------- From 7111068361e00cc1308664a3ae650a56e28c015c Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Tue, 6 Apr 2021 09:20:09 +0200 Subject: [PATCH 12/37] Added runners stats tests ref #190 --- src/tests/stats/stats_get.spec.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/tests/stats/stats_get.spec.ts b/src/tests/stats/stats_get.spec.ts index 92b898a..488ad13 100644 --- a/src/tests/stats/stats_get.spec.ts +++ b/src/tests/stats/stats_get.spec.ts @@ -42,4 +42,22 @@ describe('GET /api/stats should return 200', () => { expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); }); +}); +// --------------- +describe('GET /api/stats/runners/* should return 200', () => { + it('get by distance w/ auth should return 200', async () => { + const res = await axios.get(base + '/api/stats/runners/distance', axios_config_stats); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + }); + it('get by donations w/ auth should return 200', async () => { + const res = await axios.get(base + '/api/stats/runners/donations', axios_config_stats); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + }); + it('get by laptime w/ auth should return 200', async () => { + const res = await axios.get(base + '/api/stats/runners/laptime', axios_config_stats); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + }); }); \ No newline at end of file From b9a7dc84f05441445453193974b2a793b5197fa5 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Tue, 6 Apr 2021 09:21:23 +0200 Subject: [PATCH 13/37] Added teams stats endpoint tests ref #190 --- src/tests/stats/stats_get.spec.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/tests/stats/stats_get.spec.ts b/src/tests/stats/stats_get.spec.ts index 488ad13..dc787a9 100644 --- a/src/tests/stats/stats_get.spec.ts +++ b/src/tests/stats/stats_get.spec.ts @@ -60,4 +60,17 @@ describe('GET /api/stats/runners/* should return 200', () => { expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); }); +}); +// --------------- +describe('GET /api/stats/teams/* should return 200', () => { + it('get by distance w/ auth should return 200', async () => { + const res = await axios.get(base + '/api/stats/teams/distance', axios_config_stats); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + }); + it('get by donations w/ auth should return 200', async () => { + const res = await axios.get(base + '/api/stats/teams/donations', axios_config_stats); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + }); }); \ No newline at end of file From d4a02e7db2ff4976be21605e31aac2f3c82a49c0 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Tue, 6 Apr 2021 09:26:19 +0200 Subject: [PATCH 14/37] Added orgs by donations stats tests ref #190 --- src/tests/stats/stats_get.spec.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/tests/stats/stats_get.spec.ts b/src/tests/stats/stats_get.spec.ts index dc787a9..2425f4a 100644 --- a/src/tests/stats/stats_get.spec.ts +++ b/src/tests/stats/stats_get.spec.ts @@ -73,4 +73,17 @@ describe('GET /api/stats/teams/* should return 200', () => { expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); }); +}); +// --------------- +describe('GET /api/stats/organizations/* should return 200', () => { + it('get by distance w/ auth should return 200', async () => { + const res = await axios.get(base + '/api/stats/organizations/distance', axios_config_stats); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + }); + it('get by donations w/ auth should return 200', async () => { + const res = await axios.get(base + '/api/stats/organizations/donations', axios_config_stats); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + }); }); \ No newline at end of file From 0b07a53ed209c6193ead3c4d199545e22333ab32 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Tue, 6 Apr 2021 09:27:22 +0200 Subject: [PATCH 15/37] Temp disabled runners by donations test ref #190 --- src/tests/stats/stats_get.spec.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/tests/stats/stats_get.spec.ts b/src/tests/stats/stats_get.spec.ts index 2425f4a..460f79d 100644 --- a/src/tests/stats/stats_get.spec.ts +++ b/src/tests/stats/stats_get.spec.ts @@ -50,11 +50,11 @@ describe('GET /api/stats/runners/* should return 200', () => { expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); }); - it('get by donations w/ auth should return 200', async () => { - const res = await axios.get(base + '/api/stats/runners/donations', axios_config_stats); - expect(res.status).toEqual(200); - expect(res.headers['content-type']).toContain("application/json"); - }); + // it('get by donations w/ auth should return 200', async () => { + // const res = await axios.get(base + '/api/stats/runners/donations', axios_config_stats); + // expect(res.status).toEqual(200); + // expect(res.headers['content-type']).toContain("application/json"); + // }); it('get by laptime w/ auth should return 200', async () => { const res = await axios.get(base + '/api/stats/runners/laptime', axios_config_stats); expect(res.status).toEqual(200); From 22cae39bd351ca285880e50187ea0d46a7a26437 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Tue, 6 Apr 2021 09:29:23 +0200 Subject: [PATCH 16/37] Added temp console log for test ref #190 --- src/tests/stats/stats_get.spec.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/tests/stats/stats_get.spec.ts b/src/tests/stats/stats_get.spec.ts index 460f79d..8dbe095 100644 --- a/src/tests/stats/stats_get.spec.ts +++ b/src/tests/stats/stats_get.spec.ts @@ -50,11 +50,12 @@ describe('GET /api/stats/runners/* should return 200', () => { expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); }); - // it('get by donations w/ auth should return 200', async () => { - // const res = await axios.get(base + '/api/stats/runners/donations', axios_config_stats); - // expect(res.status).toEqual(200); - // expect(res.headers['content-type']).toContain("application/json"); - // }); + it('get by donations w/ auth should return 200', async () => { + const res = await axios.get(base + '/api/stats/runners/donations', axios_config_stats); + console.log(res.data) + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + }); it('get by laptime w/ auth should return 200', async () => { const res = await axios.get(base + '/api/stats/runners/laptime', axios_config_stats); expect(res.status).toEqual(200); From 8f0f795a709db216396998b68b8bbd64ff4d44ff Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Tue, 6 Apr 2021 09:34:12 +0200 Subject: [PATCH 17/37] Tried workaround for no availdable stats ref #190 --- src/controllers/StatsController.ts | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/controllers/StatsController.ts b/src/controllers/StatsController.ts index 6e9c108..ab51f95 100644 --- a/src/controllers/StatsController.ts +++ b/src/controllers/StatsController.ts @@ -37,6 +37,9 @@ export class StatsController { @OpenAPI({ description: "Returns the top ten runners by distance.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) async getTopRunnersByDistance() { 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 responseRunners: ResponseStatsRunner[] = new Array(); topRunners.forEach(runner => { @@ -51,6 +54,9 @@ export class StatsController { @OpenAPI({ description: "Returns the top ten runners by donations.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) async getTopRunnersByDonations() { 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.distanceDonationAmount - runner1.distanceDonationAmount).slice(0, 10); let responseRunners: ResponseStatsRunner[] = new Array(); 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": [] }] }) 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'] }); + 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); let topScans = new Array(); @@ -98,6 +107,9 @@ export class StatsController { @OpenAPI({ description: "Returns the top ten teams by distance.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) async getTopTeamsByDistance() { let teams = await getConnection().getRepository(RunnerTeam).find({ relations: ['runners', 'runners.scans', 'runners.distanceDonations', 'runners.scans.track'] }); + if (!teams || teams.length == 0) { + return []; + } let topTeams = teams.sort((team1, team2) => team2.distance - team1.distance).slice(0, 10); let responseTeams: ResponseStatsTeam[] = new Array(); topTeams.forEach(team => { @@ -112,6 +124,9 @@ export class StatsController { @OpenAPI({ description: "Returns the top ten teams by donations.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) async getTopTeamsByDonations() { let teams = await getConnection().getRepository(RunnerTeam).find({ relations: ['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 responseTeams: ResponseStatsTeam[] = new Array(); topTeams.forEach(team => { @@ -126,6 +141,9 @@ export class StatsController { @OpenAPI({ description: "Returns the top ten organizations by distance.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) 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'] }); + if (!orgs || orgs.length == 0) { + return []; + } let topOrgs = orgs.sort((org1, org2) => org2.distance - org1.distance).slice(0, 10); let responseOrgs: ResponseStatsOrgnisation[] = new Array(); topOrgs.forEach(org => { @@ -140,6 +158,9 @@ export class StatsController { @OpenAPI({ description: "Returns the top ten organizations by donations.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) 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'] }); + if (!orgs || orgs.length == 0) { + return []; + } let topOrgs = orgs.sort((org1, org2) => org2.distanceDonationAmount - org1.distanceDonationAmount).slice(0, 10); let responseOrgs: ResponseStatsOrgnisation[] = new Array(); topOrgs.forEach(org => { From 6163f0a90b3721d3a1488f89cbb39ddff7152241 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Tue, 6 Apr 2021 10:05:05 +0200 Subject: [PATCH 18/37] Temp test logging workaround ref #190 --- src/controllers/StatsController.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/controllers/StatsController.ts b/src/controllers/StatsController.ts index ab51f95..70b9c79 100644 --- a/src/controllers/StatsController.ts +++ b/src/controllers/StatsController.ts @@ -41,6 +41,7 @@ export class StatsController { return []; } let topRunners = runners.sort((runner1, runner2) => runner2.distance - runner1.distance).slice(0, 10); + return runners; let responseRunners: ResponseStatsRunner[] = new Array(); topRunners.forEach(runner => { responseRunners.push(new ResponseStatsRunner(runner)); From bf686e89e02998ccc80c838ef890c736c252634c Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Tue, 6 Apr 2021 10:05:05 +0200 Subject: [PATCH 19/37] Temp test logging workaround ref #190 --- src/controllers/StatsController.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/controllers/StatsController.ts b/src/controllers/StatsController.ts index ab51f95..c59dfef 100644 --- a/src/controllers/StatsController.ts +++ b/src/controllers/StatsController.ts @@ -40,6 +40,7 @@ export class StatsController { if (!runners || runners.length == 0) { return []; } + return runners; let topRunners = runners.sort((runner1, runner2) => runner2.distance - runner1.distance).slice(0, 10); let responseRunners: ResponseStatsRunner[] = new Array(); topRunners.forEach(runner => { From 4603a84f16fb53a14d1792447100f5b470969dd0 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Tue, 6 Apr 2021 10:43:54 +0200 Subject: [PATCH 20/37] Reverted temp bugfix ref #190 --- src/controllers/StatsController.ts | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/controllers/StatsController.ts b/src/controllers/StatsController.ts index e8c84dc..ab51f95 100644 --- a/src/controllers/StatsController.ts +++ b/src/controllers/StatsController.ts @@ -37,17 +37,15 @@ export class StatsController { @OpenAPI({ description: "Returns the top ten runners by distance.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) async getTopRunnersByDistance() { let runners = await getConnection().getRepository(Runner).find({ relations: ['scans', 'group', 'distanceDonations', 'scans.track'] }); - return runners; - // if (!runners || runners.length == 0) { - // return []; - // } - // let topRunners = runners.sort((runner1, runner2) => runner2.distance - runner1.distance).slice(0, 10); - // return runners; - // let responseRunners: ResponseStatsRunner[] = new Array(); - // topRunners.forEach(runner => { - // responseRunners.push(new ResponseStatsRunner(runner)); - // }); - // return responseRunners; + if (!runners || runners.length == 0) { + return []; + } + let topRunners = runners.sort((runner1, runner2) => runner2.distance - runner1.distance).slice(0, 10); + let responseRunners: ResponseStatsRunner[] = new Array(); + topRunners.forEach(runner => { + responseRunners.push(new ResponseStatsRunner(runner)); + }); + return responseRunners; } @Get("/runners/donations") From 1d8c8c8e9cefa58449f7abb2481d9396fe37ba20 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Tue, 6 Apr 2021 10:45:06 +0200 Subject: [PATCH 21/37] Removed console log ref #190 --- src/tests/stats/stats_get.spec.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/tests/stats/stats_get.spec.ts b/src/tests/stats/stats_get.spec.ts index 8dbe095..2425f4a 100644 --- a/src/tests/stats/stats_get.spec.ts +++ b/src/tests/stats/stats_get.spec.ts @@ -52,7 +52,6 @@ describe('GET /api/stats/runners/* should return 200', () => { }); it('get by donations w/ auth should return 200', async () => { const res = await axios.get(base + '/api/stats/runners/donations', axios_config_stats); - console.log(res.data) expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); }); From 10221b9f2e4493080f3ff095d9772bcfd0ac50eb Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 7 Apr 2021 16:06:06 +0200 Subject: [PATCH 22/37] Pinned testing container tag to prod container tag ref #190 --- .drone.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.drone.yml b/.drone.yml index 1fd9285..82af4eb 100644 --- a/.drone.yml +++ b/.drone.yml @@ -22,7 +22,7 @@ get: --- kind: pipeline type: kubernetes -name: tests:node_latest +name: tests:node_14.15.1-alpine3.12 clone: disable: true steps: @@ -32,7 +32,7 @@ steps: - git clone $DRONE_REMOTE_URL . - git checkout $DRONE_SOURCE_BRANCH - name: run tests - image: node:latest + image: node:14.15.1-alpine3.12 commands: - yarn - yarn test:ci From f8baca5ab2c56b906751bc7edd71477456ad91f3 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 7 Apr 2021 16:10:22 +0200 Subject: [PATCH 23/37] Updated default docker-compose ref #190 --- docker-compose.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index bcb856b..ba2a93a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,8 +11,12 @@ services: DB_PORT: bla DB_USER: bla DB_PASSWORD: bla - DB_NAME: dev.sqlite + DB_NAME: ./db.sqlite 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 # DB_TYPE: postgres # DB_HOST: backend_db From 4a73eab134c3a9f58771be996bc8811b62cf378e Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 7 Apr 2021 16:10:36 +0200 Subject: [PATCH 24/37] Added temp console log for ci debugging ref #190 --- src/tests/stats/stats_get.spec.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/tests/stats/stats_get.spec.ts b/src/tests/stats/stats_get.spec.ts index 2425f4a..5a56913 100644 --- a/src/tests/stats/stats_get.spec.ts +++ b/src/tests/stats/stats_get.spec.ts @@ -47,16 +47,22 @@ describe('GET /api/stats should return 200', () => { describe('GET /api/stats/runners/* should return 200', () => { it('get by distance w/ auth should return 200', async () => { const res = await axios.get(base + '/api/stats/runners/distance', axios_config_stats); + console.log("################# Runners by distance #################"); + console.log(res.data); expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); }); it('get by donations w/ auth should return 200', async () => { const res = await axios.get(base + '/api/stats/runners/donations', axios_config_stats); + console.log("################# Runners by donations #################"); + console.log(res.data); expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); }); it('get by laptime w/ auth should return 200', async () => { const res = await axios.get(base + '/api/stats/runners/laptime', axios_config_stats); + console.log("################# Runners by laptime #################"); + console.log(res.data); expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); }); @@ -65,11 +71,15 @@ describe('GET /api/stats/runners/* should return 200', () => { describe('GET /api/stats/teams/* should return 200', () => { it('get by distance w/ auth should return 200', async () => { const res = await axios.get(base + '/api/stats/teams/distance', axios_config_stats); + console.log("################# Teams by distance #################"); + console.log(res.data); expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); }); it('get by donations w/ auth should return 200', async () => { const res = await axios.get(base + '/api/stats/teams/donations', axios_config_stats); + console.log("################# Teams by donations #################"); + console.log(res.data); expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); }); From 87f444c30d69d65a9f918c63631a859a389eeee3 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 7 Apr 2021 16:17:37 +0200 Subject: [PATCH 25/37] At least one fewer test should fail now ref #190 --- src/controllers/StatsController.ts | 2 +- src/models/responses/ResponseStatsRunner.ts | 18 +++++++++++++++--- src/tests/stats/stats_get.spec.ts | 2 -- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/controllers/StatsController.ts b/src/controllers/StatsController.ts index ab51f95..30bff44 100644 --- a/src/controllers/StatsController.ts +++ b/src/controllers/StatsController.ts @@ -53,7 +53,7 @@ export class StatsController { @ResponseSchema(ResponseStatsRunner, { isArray: true }) @OpenAPI({ description: "Returns the top ten runners by donations.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) 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 []; } diff --git a/src/models/responses/ResponseStatsRunner.ts b/src/models/responses/ResponseStatsRunner.ts index a8d66e6..6766330 100644 --- a/src/models/responses/ResponseStatsRunner.ts +++ b/src/models/responses/ResponseStatsRunner.ts @@ -76,10 +76,22 @@ export class ResponseStatsRunner implements IResponse { public constructor(runner: Runner, laptime?: number) { this.id = runner.id; this.firstname = runner.firstname; - this.middlename = runner.middlename; + if (runner.firstname) { + this.middlename = runner.middlename; + } this.lastname = runner.lastname; - this.distance = runner.distance; - this.donationAmount = runner.distanceDonationAmount; + try { + this.distance = runner.distance; + } + catch { + this.distance = -1; + } + try { + this.donationAmount = runner.distanceDonationAmount; + } + catch { + this.donationAmount = -1; + } if (laptime) { this.minLaptime = laptime; } diff --git a/src/tests/stats/stats_get.spec.ts b/src/tests/stats/stats_get.spec.ts index 5a56913..7709779 100644 --- a/src/tests/stats/stats_get.spec.ts +++ b/src/tests/stats/stats_get.spec.ts @@ -47,8 +47,6 @@ describe('GET /api/stats should return 200', () => { describe('GET /api/stats/runners/* should return 200', () => { it('get by distance w/ auth should return 200', async () => { const res = await axios.get(base + '/api/stats/runners/distance', axios_config_stats); - console.log("################# Runners by distance #################"); - console.log(res.data); expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); }); From 71b33ab05b53b62c8b271bd2995c94b2fc212dfd Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 7 Apr 2021 16:20:46 +0200 Subject: [PATCH 26/37] Removed console logs for now working tests ref #190 --- src/tests/stats/stats_get.spec.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/tests/stats/stats_get.spec.ts b/src/tests/stats/stats_get.spec.ts index 7709779..d71781e 100644 --- a/src/tests/stats/stats_get.spec.ts +++ b/src/tests/stats/stats_get.spec.ts @@ -52,15 +52,11 @@ describe('GET /api/stats/runners/* should return 200', () => { }); it('get by donations w/ auth should return 200', async () => { const res = await axios.get(base + '/api/stats/runners/donations', axios_config_stats); - console.log("################# Runners by donations #################"); - console.log(res.data); expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); }); it('get by laptime w/ auth should return 200', async () => { const res = await axios.get(base + '/api/stats/runners/laptime', axios_config_stats); - console.log("################# Runners by laptime #################"); - console.log(res.data); expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); }); From 23bd432c5f33a0863217120d97e2e4ea52a08baf Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 7 Apr 2021 16:23:13 +0200 Subject: [PATCH 27/37] Resolved missing parentgroup relation ref #190 --- src/controllers/StatsController.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/controllers/StatsController.ts b/src/controllers/StatsController.ts index 30bff44..694815f 100644 --- a/src/controllers/StatsController.ts +++ b/src/controllers/StatsController.ts @@ -106,7 +106,7 @@ export class StatsController { @ResponseSchema(ResponseStatsTeam, { isArray: true }) @OpenAPI({ description: "Returns the top ten teams by distance.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) 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 []; } @@ -123,7 +123,7 @@ export class StatsController { @ResponseSchema(ResponseStatsTeam, { isArray: true }) @OpenAPI({ description: "Returns the top ten teams by donations.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) 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 []; } From 132b48cf2a9e990a5e830c744ed8244bd25e8b3a Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 7 Apr 2021 16:26:12 +0200 Subject: [PATCH 28/37] Removed console log for passing tests ref #190 --- src/tests/stats/stats_get.spec.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/tests/stats/stats_get.spec.ts b/src/tests/stats/stats_get.spec.ts index d71781e..d32ce24 100644 --- a/src/tests/stats/stats_get.spec.ts +++ b/src/tests/stats/stats_get.spec.ts @@ -72,8 +72,6 @@ describe('GET /api/stats/teams/* should return 200', () => { }); it('get by donations w/ auth should return 200', async () => { const res = await axios.get(base + '/api/stats/teams/donations', axios_config_stats); - console.log("################# Teams by donations #################"); - console.log(res.data); expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); }); From dcdbdd15acfe6eef4220b7ed66db60d78107d1f9 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 7 Apr 2021 16:28:48 +0200 Subject: [PATCH 29/37] Ptotential fix for stats failing ref #190 --- src/models/entities/RunnerGroup.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/models/entities/RunnerGroup.ts b/src/models/entities/RunnerGroup.ts index 5620aca..332bd33 100644 --- a/src/models/entities/RunnerGroup.ts +++ b/src/models/entities/RunnerGroup.ts @@ -51,6 +51,9 @@ export abstract class RunnerGroup { */ @IsInt() public get distance(): number { + if (!this.runners || this.runners.length == 0) { + return 0; + } return this.runners.reduce((sum, current) => sum + current.distance, 0); } From 720774fcf47c38601ab88d5d74cfcd0e47b21acf Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 7 Apr 2021 16:31:36 +0200 Subject: [PATCH 30/37] Added temp console log ref #190 --- src/tests/stats/stats_get.spec.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/tests/stats/stats_get.spec.ts b/src/tests/stats/stats_get.spec.ts index d32ce24..506b0a3 100644 --- a/src/tests/stats/stats_get.spec.ts +++ b/src/tests/stats/stats_get.spec.ts @@ -85,6 +85,8 @@ describe('GET /api/stats/organizations/* should return 200', () => { }); it('get by donations w/ auth should return 200', async () => { const res = await axios.get(base + '/api/stats/organizations/donations', axios_config_stats); + console.log("################# Orgs by donations #################"); + console.log(res.data); expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); }); From 4a294b1e17c44294274b06748ec8141812c2d217 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 7 Apr 2021 16:34:09 +0200 Subject: [PATCH 31/37] Now resolving all relations for orgs by distance ref #190 --- src/controllers/StatsController.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/StatsController.ts b/src/controllers/StatsController.ts index 694815f..eb359ce 100644 --- a/src/controllers/StatsController.ts +++ b/src/controllers/StatsController.ts @@ -157,7 +157,7 @@ export class StatsController { @ResponseSchema(ResponseStatsOrgnisation, { isArray: true }) @OpenAPI({ description: "Returns the top ten organizations by donations.", security: [{ "StatsApiToken": [] }, { "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) 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 []; } From 377d5dadb2a14cb2d70e0b2dc77026f51b3fb51c Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 7 Apr 2021 16:38:20 +0200 Subject: [PATCH 32/37] Potential fix for all remaining errors ref #190 --- src/models/responses/ResponseStatsOrganization.ts | 12 ++++++++++-- src/models/responses/ResponseStatsTeam.ts | 12 ++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/models/responses/ResponseStatsOrganization.ts b/src/models/responses/ResponseStatsOrganization.ts index 5339b55..89257a6 100644 --- a/src/models/responses/ResponseStatsOrganization.ts +++ b/src/models/responses/ResponseStatsOrganization.ts @@ -49,7 +49,15 @@ export class ResponseStatsOrgnisation implements IResponse { public constructor(org: RunnerOrganization) { this.name = org.name; this.id = org.id; - this.distance = org.distance; - this.donationAmount = org.distanceDonationAmount; + try { + this.distance = org.distance; + } catch { + this.distance = -1; + } + try { + this.donationAmount = org.distanceDonationAmount; + } catch { + this.donationAmount = -1; + } } } diff --git a/src/models/responses/ResponseStatsTeam.ts b/src/models/responses/ResponseStatsTeam.ts index 82e4eb9..e887483 100644 --- a/src/models/responses/ResponseStatsTeam.ts +++ b/src/models/responses/ResponseStatsTeam.ts @@ -57,7 +57,15 @@ export class ResponseStatsTeam implements IResponse { this.name = team.name; this.id = team.id; this.parent = team.parentGroup.toResponse(); - this.distance = team.distance; - this.donationAmount = team.distanceDonationAmount; + try { + this.distance = team.distance; + } catch { + this.distance = -1; + } + try { + this.donationAmount = team.distanceDonationAmount; + } catch { + this.donationAmount = -1; + } } } From 95e1eec313a79458dd75307a9d0f8319af0d0904 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 7 Apr 2021 16:41:10 +0200 Subject: [PATCH 33/37] Removed all useless console.logs ref #190 --- src/tests/stats/stats_get.spec.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/tests/stats/stats_get.spec.ts b/src/tests/stats/stats_get.spec.ts index 506b0a3..2425f4a 100644 --- a/src/tests/stats/stats_get.spec.ts +++ b/src/tests/stats/stats_get.spec.ts @@ -65,8 +65,6 @@ describe('GET /api/stats/runners/* should return 200', () => { describe('GET /api/stats/teams/* should return 200', () => { it('get by distance w/ auth should return 200', async () => { const res = await axios.get(base + '/api/stats/teams/distance', axios_config_stats); - console.log("################# Teams by distance #################"); - console.log(res.data); expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); }); @@ -85,8 +83,6 @@ describe('GET /api/stats/organizations/* should return 200', () => { }); it('get by donations w/ auth should return 200', async () => { const res = await axios.get(base + '/api/stats/organizations/donations', axios_config_stats); - console.log("################# Orgs by donations #################"); - console.log(res.data); expect(res.status).toEqual(200); expect(res.headers['content-type']).toContain("application/json"); }); From 5633e85f41cb69b10fd8a86f57f1bd2f50848f7b Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 7 Apr 2021 18:13:00 +0200 Subject: [PATCH 34/37] added new ci secret ref #190 --- .drone.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.drone.yml b/.drone.yml index 82af4eb..8b7504e 100644 --- a/.drone.yml +++ b/.drone.yml @@ -19,6 +19,13 @@ get: path: odit-git-bot name: sshkey +--- +kind: secret +name: ci_token +get: + path: odit-ci-bot + name: apikey + --- kind: pipeline type: kubernetes @@ -176,13 +183,13 @@ steps: settings: urls: https://ci.odit.services/api/repos/lfk/lfk-client-node/builds?SOURCE_TAG=${DRONE_TAG} bearer: - from_secret: BOT_DRONE_KEY + from_secret: ci_token - name: trigger js lib build image: idcooldi/drone-webhook settings: urls: https://ci.odit.services/api/repos/lfk/lfk-client-js/builds?SOURCE_TAG=${DRONE_TAG} bearer: - from_secret: BOT_DRONE_KEY + from_secret: ci_token trigger: event: - tag \ No newline at end of file From b7ad5d3a31b8b4f5960852d3ac38af133719ebcd Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 7 Apr 2021 17:17:14 +0000 Subject: [PATCH 35/37] =?UTF-8?q?=F0=9F=A7=BENew=20changelog=20file=20vers?= =?UTF-8?q?ion=20[CI=20SKIP]=20[skip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index db9d355..ca09c2d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,8 +2,48 @@ All notable changes to this project will be documented in this file. Dates are displayed in UTC. +#### [v0.10.1](https://git.odit.services/lfk/backend/compare/v0.10.1...v0.10.1) + +- 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) +- Added first selfservice test [`057ae0d`](https://git.odit.services/lfk/backend/commit/057ae0d79758cd627d6d128406a0d201b6b7ad9b) +- 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) +- 🧾New changelog file version [CI SKIP] [skip ci] [`dd6d799`](https://git.odit.services/lfk/backend/commit/dd6d799c847fc96aec1be8f2667ad371890076fb) +- 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) +- Pinned testing container tag to prod container tag [`10221b9`](https://git.odit.services/lfk/backend/commit/10221b9f2e4493080f3ff095d9772bcfd0ac50eb) +- 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) +- 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) +> 3 April 2021 + - 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) - 🚀Bumped version to v0.10.1 [`24d152f`](https://git.odit.services/lfk/backend/commit/24d152fdc8fe17fffa2f2a718d7145ba8a91d79c) From 6e236ede145e164ee84543fb62404b4776550973 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 7 Apr 2021 19:18:21 +0200 Subject: [PATCH 36/37] =?UTF-8?q?=F0=9F=9A=80Bumped=20version=20to=20v0.10?= =?UTF-8?q?.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ade8451..341ab2c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@odit/lfk-backend", - "version": "0.10.1", + "version": "0.10.2", "main": "src/app.ts", "repository": "https://git.odit.services/lfk/backend", "author": { From 610988ec16b8df61cca61cf2252a469d30318d81 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Wed, 7 Apr 2021 17:20:21 +0000 Subject: [PATCH 37/37] =?UTF-8?q?=F0=9F=A7=BENew=20changelog=20file=20vers?= =?UTF-8?q?ion=20[CI=20SKIP]=20[skip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca09c2d..437d437 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,10 +2,10 @@ All notable changes to this project will be documented in this file. Dates are displayed in UTC. -#### [v0.10.1](https://git.odit.services/lfk/backend/compare/v0.10.1...v0.10.1) +#### [v0.10.2](https://git.odit.services/lfk/backend/compare/v0.10.1...v0.10.2) -- 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) - 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) @@ -25,13 +25,15 @@ All notable changes to this project will be documented in this file. Dates are d - 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) -- 🧾New changelog file version [CI SKIP] [skip ci] [`dd6d799`](https://git.odit.services/lfk/backend/commit/dd6d799c847fc96aec1be8f2667ad371890076fb) - 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) -- Pinned testing container tag to prod container tag [`10221b9`](https://git.odit.services/lfk/backend/commit/10221b9f2e4493080f3ff095d9772bcfd0ac50eb) - 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)