diff --git a/.drone.yml b/.drone.yml index bee9001..ec2c8fd 100644 --- a/.drone.yml +++ b/.drone.yml @@ -11,7 +11,7 @@ steps: - git checkout $DRONE_SOURCE_BRANCH - mv .env.ci .env - name: run tests - image: node:14.15.1-alpine3.12 + image: node:latest commands: - yarn - yarn test:ci @@ -23,8 +23,15 @@ trigger: kind: pipeline type: docker name: build:dev +clone: + disable: true steps: + - name: clone + image: alpine/git + commands: + - git clone $DRONE_REMOTE_URL . + - git checkout dev - name: build dev image: plugins/docker depends_on: [clone] @@ -37,6 +44,22 @@ steps: tags: - dev registry: registry.odit.services + - name: run changelog export + depends_on: ["clone"] + image: node:latest + commands: + - npx auto-changelog --commit-limit false -p -u --hide-credit + - name: push new changelog to repo + depends_on: ["run changelog export"] + image: appleboy/drone-git-push + settings: + branch: dev + commit: true + commit_message: 🧾New changelog file version [CI SKIP] [skip ci] + author_email: bot@odit.services + remote: git@git.odit.services:lfk/backend.git + ssh_key: + from_secret: GITLAB_SSHKEY - name: run full license export depends_on: ["clone"] image: node:14.15.1-alpine3.12 @@ -49,12 +72,14 @@ steps: settings: branch: dev commit: true - commit_message: new license file version [CI SKIP] + commit_message: 📖New license file version [CI SKIP] [skip ci] author_email: bot@odit.services remote: git@git.odit.services:lfk/backend.git + skip_verify: true ssh_key: from_secret: GITLAB_SSHKEY + trigger: branch: - dev diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..54ee617 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,901 @@ +### Changelog + +All notable changes to this project will be documented in this file. Dates are displayed in UTC. + +#### [v0.0.12](https://git.odit.services/lfk/backend/compare/v0.0.11...v0.0.12) + +- Merge pull request 'Fixed backend version related bugs' (#92) from bugfix/91-backend_version into dev [`#91`](https://git.odit.services/lfk/backend/issues/91) +- Merge pull request 'Bugfix: resolved missing relation' (#89) from bugfix/88-user_update into dev [`#88`](https://git.odit.services/lfk/backend/issues/88) +- 🧾New changelog file version [CI SKIP] [skip ci] [`8cb67a8`](https://git.odit.services/lfk/backend/commit/8cb67a8d202527dcaa26d5f37b3fd03d90a897ca) +- 📖New license file version [CI SKIP] [skip ci] [`09b16c9`](https://git.odit.services/lfk/backend/commit/09b16c980b01db3233db7cd3161e58aa33498993) +- 🧾New changelog file version [CI SKIP] [`2947c41`](https://git.odit.services/lfk/backend/commit/2947c41a7241417d51f278d2e4f6195a3f3bc30d) +- Switched emails to being mandetory for users [`9feeb30`](https://git.odit.services/lfk/backend/commit/9feeb302e89049843564015c2dc2820ac2886e2d) +- Added a new endpoint that returns a users permissions as objects sorted into two arrays [`b01e1eb`](https://git.odit.services/lfk/backend/commit/b01e1eb8a1a36fc8e04e009cd6024495a70a10dd) +- Added new pipeline to automagicly generate changelogs on pr to main [`6345666`](https://git.odit.services/lfk/backend/commit/6345666ae67846463f1dadeb13c0f5c46a0c74ae) +- Updated some openapi descriptions [`0724932`](https://git.odit.services/lfk/backend/commit/0724932152278a1dce94f17835e00fd1bbd808f9) +- Updated step order [`c108fa5`](https://git.odit.services/lfk/backend/commit/c108fa509fc26118b5f805b2c2392f52afd4eacd) +- Updated step order [`1e5e980`](https://git.odit.services/lfk/backend/commit/1e5e9801be98242030733af7ea8030c3ad869a1f) +- Added '@' as a illegal character for usernames [`37fc167`](https://git.odit.services/lfk/backend/commit/37fc167002caa297f865832ba9237a33fb7d9219) +- Reenabled dev build [`ef53035`](https://git.odit.services/lfk/backend/commit/ef53035f70a09aa24bf57696ad0a1b5ecca1b065) +- Moved changelog generation to dev build for now [`aaaa15a`](https://git.odit.services/lfk/backend/commit/aaaa15a0efa3c7d72a0cee5571d5b5653a101713) +- disabled dev build temporary [`472e402`](https://git.odit.services/lfk/backend/commit/472e4025215c04303eecc276b413d28ba2cbb371) +- First part of resolving user inherited permissions [`cd7b15a`](https://git.odit.services/lfk/backend/commit/cd7b15aadfe66353033e976393fc143368ba0ba8) +- Disabled auto clone [`290bb29`](https://git.odit.services/lfk/backend/commit/290bb29e64ac185c17040770b3cffdc970c8a766) +- Updated the release machanics [`46df8b0`](https://git.odit.services/lfk/backend/commit/46df8b05286a9a7962904044657f05df65e6ef65) +- Added secondary full clone for tags [`d0769a5`](https://git.odit.services/lfk/backend/commit/d0769a5e37e3c778d2ca1bf91957a621065bd1f3) +- Disabled custom clone [`b86263d`](https://git.odit.services/lfk/backend/commit/b86263d972dfbe245f27e71d68bcec30a8b79cc5) +- 🚀Bumped version to v0.0.12 [`bd091d5`](https://git.odit.services/lfk/backend/commit/bd091d5cb9b8a95c2e52327cab7a8480bf2ddffc) +- Fixed spellings [`4c26fc8`](https://git.odit.services/lfk/backend/commit/4c26fc808e13a2d91c2a69284bc9f5391ca66273) +- Revert "🚀Bumped version to v0.0.12." [`525b11b`](https://git.odit.services/lfk/backend/commit/525b11b3465af530807857ec088a79808896831f) +- 🚀Bumped version to v0.0.12. [`86679b4`](https://git.odit.services/lfk/backend/commit/86679b498b7cf45aab6a5c36847735c6a79b1984) +- Added new ci skipping flags [`b495cad`](https://git.odit.services/lfk/backend/commit/b495cadae93789b66e3fcfb46e339c80be703ca4) +- Disabled custom clone [`f278320`](https://git.odit.services/lfk/backend/commit/f278320b936c992c9cf0f1226fc663650c451f89) +- 🧾New changelog file version [CI SKIP] [skip ci] [`de65b1c`](https://git.odit.services/lfk/backend/commit/de65b1c6994bcd03eaf3597b64a1f05272c0d986) +- 🧾New changelog file version [CI SKIP] [`47995b7`](https://git.odit.services/lfk/backend/commit/47995b77f7eebc288895b8b143acc77718ff7030) +- 🧾New changelog file version [CI SKIP] [`bc24ec5`](https://git.odit.services/lfk/backend/commit/bc24ec527203ab84302480e5c1130691bc32d44d) +- Disabled verification skip [`290afc3`](https://git.odit.services/lfk/backend/commit/290afc3f8f2b344ace15e5318a0c409c3031f3c3) +- tmp: skip verification [`2b72552`](https://git.odit.services/lfk/backend/commit/2b72552b1f189aaf10a886f497e8698e516d3ec7) +- tmp: skip verification [`df69418`](https://git.odit.services/lfk/backend/commit/df694188551184499b5c3d45eb9e4855b71b6c76) +- Merge pull request 'New user features feature/93-user_endpoints' (#95) from feature/93-user_endpoints into dev [`7b5ebab`](https://git.odit.services/lfk/backend/commit/7b5ebab453f5ad6f059e13c3434bda0134c0f665) +- Merge pull request 'Donation API Endpoint feature/66-donation_api' (#94) from feature/66-donation_api into dev [`ab3af54`](https://git.odit.services/lfk/backend/commit/ab3af54e154e3a91f05ff0b50bc545b083c014be) +- Added donation add invalid tests [`4a0f750`](https://git.odit.services/lfk/backend/commit/4a0f75044f728fadd274b4ffaee7ebb01652176a) +- Added donation add validtests [`e3e570e`](https://git.odit.services/lfk/backend/commit/e3e570e664c5a36d944fca3fb1214a18e474a254) +- Added donation update validtests [`cd5e4bb`](https://git.odit.services/lfk/backend/commit/cd5e4bbd6060debf37e6b64b6e42a95afedde881) +- Added donation update invalid tests [`a513bf1`](https://git.odit.services/lfk/backend/commit/a513bf13ca8d04952ba0f72905fd5306c9fd9c87) +- Added barebones donation controller [`5581c03`](https://git.odit.services/lfk/backend/commit/5581c03f770782d69fe17861e8e23bba942956bf) +- Implemented the donation creation action models [`2e760ff`](https://git.odit.services/lfk/backend/commit/2e760ff46149a25183172a8793275c6c76d39c75) +- Added donation delete tests [`71537b2`](https://git.odit.services/lfk/backend/commit/71537b283fed68a311c355718038dad702574db7) +- Added cascading donor deletion tests [`4375ca9`](https://git.odit.services/lfk/backend/commit/4375ca92d3a2aec3b7243049cd66ac1f3248b55e) +- Implemented fixed donation updateing [`2820f15`](https://git.odit.services/lfk/backend/commit/2820f151e873f342a03b656385ca08d7ea8bc0a5) +- Implemented fixed donation updateing [`9517df5`](https://git.odit.services/lfk/backend/commit/9517df50826aff1a1cb03e611b990de5829e2132) +- Added donation get tests [`63506da`](https://git.odit.services/lfk/backend/commit/63506dac1c86e4bf4cfae9d4b94d98ac3856bbaa) +- Added cascading runner deletion tests [`b729a7c`](https://git.odit.services/lfk/backend/commit/b729a7ceadf25787066ddc4d9cb5f08d140c4cd8) +- Implemented donation getting [`0df26cb`](https://git.odit.services/lfk/backend/commit/0df26cbd54bf914166bcb9ac1b03dee0c5dba07d) +- Implemented distance donation updateing [`f7370bc`](https://git.odit.services/lfk/backend/commit/f7370bc8025f9a29b4c046ec1dd28b128398dab9) +- Implmented cascading donation deletion for runners and donors [`e716fae`](https://git.odit.services/lfk/backend/commit/e716fae1c5eec625e6d050ac8893dfbe2ff1d820) +- Added the basics for distance donation updateing [`72c3fc7`](https://git.odit.services/lfk/backend/commit/72c3fc78b3f7a960496fd7737c5aac8e9880db45) +- Implemented the distance donation response [`55f72c3`](https://git.odit.services/lfk/backend/commit/55f72c35a62ec827866b29e2d2cde371734b2e0e) +- Implemented the donation response [`6c53701`](https://git.odit.services/lfk/backend/commit/6c53701a59a0f9559d3668ead3970b7eacefe2ec) +- Implemented a response donation interface [`02bb634`](https://git.odit.services/lfk/backend/commit/02bb6342575de23074c4117fbc93c3fc26ecd717) +- Added donor donation amount to the donor response [`bba35d1`](https://git.odit.services/lfk/backend/commit/bba35d189eb0a2dc082c3e5553b98e29f7e12075) +- Implemented donation deletion [`57f62a6`](https://git.odit.services/lfk/backend/commit/57f62a608764914c5a213f0c2aebde0d67df70e0) +- Implemented fixed donation creation [`97ecc83`](https://git.odit.services/lfk/backend/commit/97ecc83fe47f35638313d4cb424ccb554d8d47d4) +- Added donation errors [`5f1ab4a`](https://git.odit.services/lfk/backend/commit/5f1ab4a2f32ca2297fcf952171e6c106c2ae3a39) +- Updated some trone pipeline names and messages [`67b3101`](https://git.odit.services/lfk/backend/commit/67b3101fd11537a53ac91fe252f1d66cb2f66921) +- Implemented distance donation creation [`8ee2bdf`](https://git.odit.services/lfk/backend/commit/8ee2bdf488f3aa77bc3c68956ff5ba906b743323) +- Added the basics for fixed donation updateing [`bbaee7c`](https://git.odit.services/lfk/backend/commit/bbaee7cd4d0cb68545a405899e7c2ff93c39bac4) +- Introduces a very basic version getting endpoint [`a2f4fd5`](https://git.odit.services/lfk/backend/commit/a2f4fd5d9b4a683d5eeb5133009e14227f8ee54c) +- Fixed typos [`badff85`](https://git.odit.services/lfk/backend/commit/badff85e287449f8b19d336b245427f83793a191) +- Fixed the version getting process [`295a152`](https://git.odit.services/lfk/backend/commit/295a1524d879c04a17fbb5dab8398ac08424197f) +- Bugfix: resolved missing relation [`7b08784`](https://git.odit.services/lfk/backend/commit/7b087840ec798801ff74ba37cdb62729fb8b53da) +- Added donation permission target [`e1ff8c0`](https://git.odit.services/lfk/backend/commit/e1ff8c03e15c6833e71d1b82ea25b9566ebef48c) +- Fixed typo [`56cedf0`](https://git.odit.services/lfk/backend/commit/56cedf0144e933b34038089e840860dfb6375129) + +#### [v0.0.11](https://git.odit.services/lfk/backend/compare/v0.0.10...v0.0.11) + +> 10 January 2021 + +- Merge pull request 'Alpha Release 0.0.11' (#87) from dev into main [`b3ce56c`](https://git.odit.services/lfk/backend/commit/b3ce56c6053efb828d30c640e4ed4ac113392131) +- Version bump [`28cefa7`](https://git.odit.services/lfk/backend/commit/28cefa792cb24d5a07314b58454145a61a64b8d4) +- Merge pull request 'General cleanup and optimisation feature/76-cleanup' (#86) from feature/76-cleanup into dev [`0803abc`](https://git.odit.services/lfk/backend/commit/0803abc1686d15e6c466b4fc9488fc6facdad05f) +- Intruduced a new folder structure for action models [`3bc172e`](https://git.odit.services/lfk/backend/commit/3bc172e7e0633a662811787f66bf30fbcf533868) +- Updated imports [`a00231d`](https://git.odit.services/lfk/backend/commit/a00231dd3ca028c4e36a1825ccb6ee589bddf060) +- added trackscan update tests [`7e95103`](https://git.odit.services/lfk/backend/commit/7e95103a2d68e9f55a6550290d36b6e62add973f) +- added trackscan add tests [`0c86e5d`](https://git.odit.services/lfk/backend/commit/0c86e5dae173c04422cf7254c72da961eca96e35) +- Added card update tests [`35ea315`](https://git.odit.services/lfk/backend/commit/35ea3154d132d095fc29d1d302964d680d082b4e) +- added card add tests [`8463bee`](https://git.odit.services/lfk/backend/commit/8463bee25312b4ddf5badb2af26716c2bcf9d9dc) +- Unified the openapi generation [`1721594`](https://git.odit.services/lfk/backend/commit/172159414b1d4964ee862ad1edc66a7c4c94cccb) +- Implemented trackscan updateing [`638898f`](https://git.odit.services/lfk/backend/commit/638898fa28bbb686c920ff5603e9ef6b68af3d83) +- added trackscan get tests [`f1dee10`](https://git.odit.services/lfk/backend/commit/f1dee1061dc8dc9b76d3100b7c66d7c12434fd8f) +- added trackscan delete tests [`efe1a1f`](https://git.odit.services/lfk/backend/commit/efe1a1f543aa2eebd2b2a3c2be89ce1a08c6bcd4) +- Added card creation [`36ecae7`](https://git.odit.services/lfk/backend/commit/36ecae7e6e1eda637bafbc260d3dfa5815a472ff) +- Added a barebones runnercard controller [`52eb7b1`](https://git.odit.services/lfk/backend/commit/52eb7b1afe87c4e96d6975a983dcc69a2989de23) +- Implemented runner updateing [`32fda46`](https://git.odit.services/lfk/backend/commit/32fda46f0a7e4b63b1119754e9c0ba5327511ceb) +- Added runner card get endpoints [`4faeddc`](https://git.odit.services/lfk/backend/commit/4faeddc3f3086727432bfbf9bebf4f38d73b74aa) +- Added card deletion + errors [`a5bfe4e`](https://git.odit.services/lfk/backend/commit/a5bfe4e3d5072718f29e2d4ca324d63bd7393291) +- Moded group updateing to a updateusergroup action model [`be40507`](https://git.odit.services/lfk/backend/commit/be4050768e45fb7893d9bf1957095baed646ae92) +- Renamed the to>Entity Name>() functiuons to toEntity() [`e6b9d4f`](https://git.odit.services/lfk/backend/commit/e6b9d4f2737a6eeb30e4c14a10675b13f89d62fa) +- Added basic response calss for runner cards [`af3a9e5`](https://git.odit.services/lfk/backend/commit/af3a9e5ce249950ebd9d54c9b5521c9bd0aaab8c) +- Fixed manual trackscan creation [`188f26a`](https://git.odit.services/lfk/backend/commit/188f26ad650a0099fba2b2b683e5dc5c9ea4613e) +- Added card get tests [`df39166`](https://git.odit.services/lfk/backend/commit/df39166279723f13d38288dd09f3120c26a628f1) +- Added card delete tests [`ebf6682`](https://git.odit.services/lfk/backend/commit/ebf66821a2a0956905a2e7d3e7bbdd0cd2296152) +- Implmented the EAN generation [`860680d`](https://git.odit.services/lfk/backend/commit/860680d001191ac8ab4f5190618b4b0937915992) +- Renamed the update>Entity Name>() functiuons to update() [`3f7b0f6`](https://git.odit.services/lfk/backend/commit/3f7b0f6563f2446508257d09ca87e119c6383ea8) +- Fixed some typos in errors [`ee9df21`](https://git.odit.services/lfk/backend/commit/ee9df21ae53cb4c4787f6605ba981bdff909f9f3) +- Dependency bump [`1bb98c1`](https://git.odit.services/lfk/backend/commit/1bb98c13d1eef83204506e67381f448b16f542fa) +- Implemented proper scan invalidation [`61cf0fc`](https://git.odit.services/lfk/backend/commit/61cf0fc08d3af733b30640880f4b3981cd9f827a) +- Implemented cascading scan, track and card deletion [`3d07aac`](https://git.odit.services/lfk/backend/commit/3d07aac9441b529ec38a47146ee2d8dcb9b5ea73) +- Renamed the auth response call to ResponseAuth [`01e0d5b`](https://git.odit.services/lfk/backend/commit/01e0d5b94db8d6fc8d0e5f6aa7f83794812d9367) +- Fixed some typos and extended comments for the middlewares [`f96b256`](https://git.odit.services/lfk/backend/commit/f96b256ad3ed492367eb4087c6537a9ca116e3cc) +- Implmented basic release mgnt [`dc6ec23`](https://git.odit.services/lfk/backend/commit/dc6ec23cb99efecf1b932b91fcec2bb7d7ba208c) +- Added missing parameter fro negative-test [`4fea690`](https://git.odit.services/lfk/backend/commit/4fea6906706872ca6157679d47b22b70d7ff2255) +- Renamed the auth response call to ResponseAuth [`ac00667`](https://git.odit.services/lfk/backend/commit/ac00667465d80745d6e1954df764f8aa977a693f) +- Moved all update() and toEntity action model functions to async [`3deae2b`](https://git.odit.services/lfk/backend/commit/3deae2bfeb9f022d3d324bfdd7f0d6d2e9bd39a1) +- Fixed runner distance resolution [`9013b94`](https://git.odit.services/lfk/backend/commit/9013b9492c89c8128664cf86f4cf0ab9d4122e55) +- Removed total distance from tests [`3ceb5a0`](https://git.odit.services/lfk/backend/commit/3ceb5a0c0fc49e28ac26e1bccaa1b5ee044e616c) +- Revert "Temporary: extended live logging" [`1e37186`](https://git.odit.services/lfk/backend/commit/1e371862471057d49ba10f18f32533d652eba3a7) +- Temporary: extended live logging [`154c763`](https://git.odit.services/lfk/backend/commit/154c7637195f6f13fcb2f2e1b92fa0d6f2d05b34) +- removed distance checks from tests [`e7cd68e`](https://git.odit.services/lfk/backend/commit/e7cd68e1c8bd419772de33e250292e1d7d65a16b) +- Implemented cascading scan, track and card deletion [`1a5493f`](https://git.odit.services/lfk/backend/commit/1a5493facf5635d8a0fb3773df70a2c6f2f4c767) +- Cleaner implementation of the api version getter [`e4fafd7`](https://git.odit.services/lfk/backend/commit/e4fafd764c138708e0393e0b2cc46dd4e6276239) +- App now automagicly displays the current package version as the openapi version [`9355138`](https://git.odit.services/lfk/backend/commit/9355138a8c8322bc98465fcfc7d9691694b3986b) +- Fixed runner total distance not getting resolved [`e1ce052`](https://git.odit.services/lfk/backend/commit/e1ce052d3caa051b88c0e9525977b0610605b078) +- Removed everything comit related from the release-it config [`02ae883`](https://git.odit.services/lfk/backend/commit/02ae883fa4dd34d3d8032bbe81414c4287f078b9) +- Reverted temporary logging [`02e3239`](https://git.odit.services/lfk/backend/commit/02e3239848a045220f75a7ee3ddd603b5e9a552f) +- Temporary: extended live logging [`89926b2`](https://git.odit.services/lfk/backend/commit/89926b2c3121ab54213492ec8d0c1749b0f610cf) +- Unified remove parameters [`bca979b`](https://git.odit.services/lfk/backend/commit/bca979bab5a092d0e266f96b5eca54525d53b0c7) +- Reverted temporary logging [`8a54b02`](https://git.odit.services/lfk/backend/commit/8a54b027d059365c1573c34da26dfa8dd5ee4456) +- Temporary: extended live logging [`7b4e895`](https://git.odit.services/lfk/backend/commit/7b4e89555ea138acc9908b218491c5b913f1a168) +- Merge pull request 'feature/78-trackscan' (#85) from feature/78-trackscan into dev [`80197d5`](https://git.odit.services/lfk/backend/commit/80197d5834e3db32e4c35b35f8216dd4e7446956) +- Merge pull request 'New feature: runner cards (feature/77-runner_cards)' (#84) from feature/77-runner_cards into dev [`70a379e`](https://git.odit.services/lfk/backend/commit/70a379edef1b96229cbfcbedb3e6267310356290) +- Added card permission target [`98f7bf3`](https://git.odit.services/lfk/backend/commit/98f7bf366f916d98cbce0b502923d1054044badf) + +#### [v0.0.10](https://git.odit.services/lfk/backend/compare/v0.0.9...v0.0.10) + +> 8 January 2021 + +- Merge pull request 'Alpha Release 0.0.10' (#83) from dev into main [`490fbd2`](https://git.odit.services/lfk/backend/commit/490fbd241d930cbe1aa9bbe452ee39db187f46a8) +- Fixed responsescheme for the user controller [`c1e680a`](https://git.odit.services/lfk/backend/commit/c1e680a0632451a0f94277cbf47f610af80df0b8) +- Version bump [`f132131`](https://git.odit.services/lfk/backend/commit/f132131156e1ce39ab0e7e634761fafbfb790f1e) + +#### [v0.0.9](https://git.odit.services/lfk/backend/compare/v0.0.8...v0.0.9) + +> 8 January 2021 + +- Merge pull request 'All users get profile pics feature/79-profile_pics' (#81) from feature/79-profile_pics into dev [`#79`](https://git.odit.services/lfk/backend/issues/79) +- Merge pull request 'Added scan (station) apis feature/67-scan_apis' (#80) from feature/67-scan_apis into dev [`#67`](https://git.odit.services/lfk/backend/issues/67) +- Merge pull request 'Alpha Release 0.0.9' (#82) from dev into main [`c66b06c`](https://git.odit.services/lfk/backend/commit/c66b06c2c92bcb590dba460831839f5e0735d946) +- Added scan update tests [`975ad50`](https://git.odit.services/lfk/backend/commit/975ad50afc87280fedbc4a9228ee9d071cb14c45) +- Added scan add tests [`0c27df7`](https://git.odit.services/lfk/backend/commit/0c27df7754609d5f0c91db339f71738696f93491) +- Added basics for scan creation (to be tested after scanstations got added) [`72b5ca4`](https://git.odit.services/lfk/backend/commit/72b5ca415340d96649ecce943d19f0e0b2b82fda) +- Added scan station add tests [`5510cbb`](https://git.odit.services/lfk/backend/commit/5510cbb8e9e53dec141dd0e31168321e8253e121) +- Added the enabled flag for scanstations [`4f01baa`](https://git.odit.services/lfk/backend/commit/4f01baaa23c658561a0f34046caa4c1d82cb7773) +- Added scan station update tests [`ccf2a3b`](https://git.odit.services/lfk/backend/commit/ccf2a3b6173744bcb48d066e3430cd8305227923) +- Added barebones scans controller [`ee2433a`](https://git.odit.services/lfk/backend/commit/ee2433a5ae2d3797477e46bc63ddfb362a0ece24) +- Implemented "normal" scan updateing [`eec5284`](https://git.odit.services/lfk/backend/commit/eec528430682fdf2209825d511852141a1c6bd2b) +- Added scan add tests with the station based auth [`a005945`](https://git.odit.services/lfk/backend/commit/a005945e9e0b17d754ffc52dc5f5c2c6a010f3eb) +- Defined responses for scans and trackscans [`a4b0dfe`](https://git.odit.services/lfk/backend/commit/a4b0dfe43ed6707cc682ac100941930c80738ea9) +- Added a barebones scanstation controller [`eea656b`](https://git.odit.services/lfk/backend/commit/eea656bd7b09c8a878235b88793a7a2aa4baf41b) +- Implemented the second round of the toResponse normalisationf for all classes [`2cad2ac`](https://git.odit.services/lfk/backend/commit/2cad2ac2e95d0ece9ec7a7f294aa6e7901915b0c) +- Implemented scan auth middleware [`db6fdf6`](https://git.odit.services/lfk/backend/commit/db6fdf6baf074830a457e0e5ab56421bfc0ce4e3) +- Added Creation class for ScanSatations [`857de9f`](https://git.odit.services/lfk/backend/commit/857de9ffcc637ab5e9761e8e5cc00067d4d21745) +- Fixed Creation of normal scans [`30502ec`](https://git.odit.services/lfk/backend/commit/30502ec94991b31a26bdb9aa631a7323d3f2bccf) +- Added scan get tests [`3f23e4f`](https://git.odit.services/lfk/backend/commit/3f23e4f1f14d07a252a49ed17bfb9ef680feb305) +- Added scan delete tests [`102a860`](https://git.odit.services/lfk/backend/commit/102a860ba350783a08dd20fe66aa4c4b96655dfc) +- Added a ScanStation response class [`c447114`](https://git.odit.services/lfk/backend/commit/c447114297f2a5d2f64582a16cf5c6a2b258086c) +- Implemented the first route of the toResponse normalisationf for all classes [`58156e0`](https://git.odit.services/lfk/backend/commit/58156e0d616dab65ad3366a383426945fd207250) +- Added scan station get tests [`a434173`](https://git.odit.services/lfk/backend/commit/a434173b545f3a7d97c62f00ff4daaa5ef46e71f) +- Added scan station delete tests [`09ab638`](https://git.odit.services/lfk/backend/commit/09ab638239d37746f3acf22b7cb8762c66a66b89) +- Added scan station delete tests [`a4f88c7`](https://git.odit.services/lfk/backend/commit/a4f88c78f4d863e734c8c4b91f0165bbf36ae25d) +- Implemented cascading station deletion [`9b9ee70`](https://git.odit.services/lfk/backend/commit/9b9ee702882730bc765d4e684ff85ec9e9b1ceb1) +- Added single scan get w/ errors [`aeec2e1`](https://git.odit.services/lfk/backend/commit/aeec2e1c3255557bab0452ac931d346335269396) +- Implemented single scan station get +e errors [`b9c0a32`](https://git.odit.services/lfk/backend/commit/b9c0a328628cb6a68460d4c3264487ec18004a8b) +- First part of the permission return (buggy!) [`f3cd138`](https://git.odit.services/lfk/backend/commit/f3cd1380be650837dadd47649eb59b82dea6c060) +- First part of the permission return (buggy!) [`a2c3dfb`](https://git.odit.services/lfk/backend/commit/a2c3dfbf85ea1514959dba05455bd1bf66bd2a2f) +- Added profile pics to all user related models [`3c37aaf`](https://git.odit.services/lfk/backend/commit/3c37aafe1f5b044f524132c74c4642068d7cf559) +- Implmented getting all scan stations [`82644a2`](https://git.odit.services/lfk/backend/commit/82644a2ff49d678937ebe7648bc2f0013cad0031) +- Implemented scan deletion [`88a6a76`](https://git.odit.services/lfk/backend/commit/88a6a768c4849731619024c47e75094be70463de) +- Adusted the way scan distances are implemented [`f1c7713`](https://git.odit.services/lfk/backend/commit/f1c7713da2db6d90df8161872887f61348fafd5b) +- Ajusted the way scan distances are implemented [`d6a41d5`](https://git.odit.services/lfk/backend/commit/d6a41d5a82e3c1e3593a494f6292eb25f1f6533d) +- Updated comments [`c591c18`](https://git.odit.services/lfk/backend/commit/c591c182b344cb09e237ae5046f1a662a5ed4c33) +- Implemented scan station creation [`2628f69`](https://git.odit.services/lfk/backend/commit/2628f6965165de7abbc100ed729b8d1f9c8c422d) +- Track deletion now recognizes associated stations [`9776a35`](https://git.odit.services/lfk/backend/commit/9776a35f9f31bcfaedd44a95b76c3b630179213f) +- Updated OPENAPI Descriptions for the new controllers [`ce8fed3`](https://git.odit.services/lfk/backend/commit/ce8fed350ecc84d5abe8ffd6b0789c89334c5ec1) +- Fixed getting all permissions for users [`aa0337e`](https://git.odit.services/lfk/backend/commit/aa0337ea33b0b68d5a8eed9d520cab4ee064c23d) +- Fixed scan runner in response [`e67d1c5`](https://git.odit.services/lfk/backend/commit/e67d1c56976994ffeae47f038d453123908dc08d) +- Added openapi sec scheme for the scan station auth [`7728759`](https://git.odit.services/lfk/backend/commit/7728759bcd9cf311149ce80f356bdb027b402dd4) +- Added alias for posting track scans [`7387f70`](https://git.odit.services/lfk/backend/commit/7387f700fb75681e7e1e4be766db436a816db489) +- Implemented scans get including the response classes [`f9889be`](https://git.odit.services/lfk/backend/commit/f9889bea3d5d049b08d471ad60264f190aaaad54) +- Finned node version for ci [`c3b9e13`](https://git.odit.services/lfk/backend/commit/c3b9e135b056edb108759e0d72c5a8d2d2079588) +- Fixed wrong auth type being used [`cf86520`](https://git.odit.services/lfk/backend/commit/cf86520faeaf5e4ac2e7b3a3606d2ea8317d2eb6) +- Fixed runner scan validation bug [`edac1a2`](https://git.odit.services/lfk/backend/commit/edac1a224c8ce6fa44ff39302431e64f014b7137) +- Finned node version for ci [`e6576f4`](https://git.odit.services/lfk/backend/commit/e6576f4a540d822ed4c57e42ddecc68ac2311bbb) +- Added tmp files to gitignore [`324d570`](https://git.odit.services/lfk/backend/commit/324d5709e3a11ae2f6e9a7532fe13d54be3d4d6f) +- Added (scan) stations as a new permission target [`3d2c93b`](https://git.odit.services/lfk/backend/commit/3d2c93b5acae4c37278e45580f81ded3a5f088ec) +- Added Scan permission target [`2151b85`](https://git.odit.services/lfk/backend/commit/2151b8502d34f1e7693be1d58fdef1c136414684) +- Version bump [`65e605c`](https://git.odit.services/lfk/backend/commit/65e605cdc4b799be58872d63f1296b943f3f5723) +- Fixed wrong relation getting resolved [`d0deb9d`](https://git.odit.services/lfk/backend/commit/d0deb9d647262a05f6239c273868e715d28777fe) +- Pinned sqlite3 to 5.0.0 as a temporary bugfix [`4991d73`](https://git.odit.services/lfk/backend/commit/4991d735bf4a12369043e8dea533ba387b9b48b9) +- Fixed wrong error getting thrown [`c8f941a`](https://git.odit.services/lfk/backend/commit/c8f941a779d90e6661efca5aeeadc44fc612eb50) +- Fixed typo [`09b37f0`](https://git.odit.services/lfk/backend/commit/09b37f0ff23f1cfc05000648d567801ef2aba137) + +#### [v0.0.8](https://git.odit.services/lfk/backend/compare/v0.0.7...v0.0.8) + +> 3 January 2021 + +- Merge pull request 'Fixed relative paths not being updated + version bump for bugfix release' (#75) from dev into main [`d948fe2`](https://git.odit.services/lfk/backend/commit/d948fe26311824cb0e3049bc67b4312535f326aa) +- Fixed relative paths not being updated + version bump for bugfix release [`2b55253`](https://git.odit.services/lfk/backend/commit/2b5525323bc57fc9e4fe02a21f34df06f756f67a) +- Merge pull request 'Bugfix for the openapi exporter' (#74) from dev into main [`b57fde9`](https://git.odit.services/lfk/backend/commit/b57fde9b0a06b6a75a1548109c586245ea703fe4) +- Fixed switch up between node/js and ts-node/ts [`0687f26`](https://git.odit.services/lfk/backend/commit/0687f268fce14ad06dd27642f6f37406cfe83537) + +#### [v0.0.7](https://git.odit.services/lfk/backend/compare/0.0.6...v0.0.7) + +> 3 January 2021 + +- Merge pull request 'Minimum lap times for tracks feature/71-track_times' (#72) from feature/71-track_times into dev [`#71`](https://git.odit.services/lfk/backend/issues/71) +- Merge pull request 'New Feature: Donor endpoints feature/65-donor_controllers' (#69) from feature/65-donor_controllers into dev [`#65`](https://git.odit.services/lfk/backend/issues/65) +- Merge pull request 'bugfix/68-address_circular_dependencies' (#70) from bugfix/68-address_circular_dependencies into feature/65-donor_controllers [`#68`](https://git.odit.services/lfk/backend/issues/68) +- Merge pull request 'Automatic and manual license collection 📖' (#62) from feature/59-license_collection into dev [`#59`](https://git.odit.services/lfk/backend/issues/59) +- Merge pull request 'Alpha Release 0.0.7' (#73) from dev into main [`bc42683`](https://git.odit.services/lfk/backend/commit/bc426831db5a257652e529607576046477fc1f5a) +- Switched to automatic license attribution generation via oss-attribution-generator [`580a73f`](https://git.odit.services/lfk/backend/commit/580a73f9a5923215a64d2a073eff8ec18d963803) +- Removed legacy license txt file [`eb40de6`](https://git.odit.services/lfk/backend/commit/eb40de6eb46ee24e247a3c4354e2a98fbf9578bc) +- new license file version [CI SKIP] [`6efd09d`](https://git.odit.services/lfk/backend/commit/6efd09db738d1b10f0e06f9c4f64f6ed1a5381ec) +- Removed the old basic test class [`daa899a`](https://git.odit.services/lfk/backend/commit/daa899a1ef4ccc7bff950cca887d8ba85c937df3) +- Added copy of runnerController with some stuff reanames for donors [`4126d31`](https://git.odit.services/lfk/backend/commit/4126d31a5e87aadd33f3c0b7878c71d428721243) +- Added track update tests [`d67be31`](https://git.odit.services/lfk/backend/commit/d67be313e6c683a2494790af43fc4ab5300c5dfa) +- Added track add tests [`1a0573e`](https://git.odit.services/lfk/backend/commit/1a0573e0d055488bbb2c8474c8d60f7ff5f32c02) +- Added donor post (add) tests [`e4c1930`](https://git.odit.services/lfk/backend/commit/e4c1930dd1ac1c95ca0449d81dd2251f570729a5) +- Added donor put (update) tests [`deb1367`](https://git.odit.services/lfk/backend/commit/deb13674b255fde6f367e09bf624ac084a5f44de) +- Implemented track upodates using the "new" method [`59cb72a`](https://git.odit.services/lfk/backend/commit/59cb72a11d6a12a1733a3bd8d8c082252a408bfd) +- Mitigated circular dependency (to be fixed) [`1dc438b`](https://git.odit.services/lfk/backend/commit/1dc438beb25e81671980fa7a5704879169053985) +- Added basic runner updateing [`ab67e5f`](https://git.odit.services/lfk/backend/commit/ab67e5f4aaa6deeb79af1ebbf2aaff0675ce58e9) +- Added donor get tests [`b337ab4`](https://git.odit.services/lfk/backend/commit/b337ab424d2a350d662910445fcbdb1a5e35c070) +- Revert "Added --full option for the license exporter to export the license path and text as well" [`a501625`](https://git.odit.services/lfk/backend/commit/a501625dd65c05fc96155a0c9f315958aa963ad7) +- Added --full option for the license exporter to export the license path and text as well [`62c7f26`](https://git.odit.services/lfk/backend/commit/62c7f26540905b0f73c09b8047da7718a67cfaf8) +- Implemented a possible bugfix [`2c47436`](https://git.odit.services/lfk/backend/commit/2c47436259260a3e1d340ae64e69da1496a685ec) +- Added track delete tests [`15d2d02`](https://git.odit.services/lfk/backend/commit/15d2d029dc251751ec46511d3e770392a96ba622) +- Added track get tests [`9f103d8`](https://git.odit.services/lfk/backend/commit/9f103d8df1242b95fdea4a461975b05e4b0c2c6b) +- Added donor delete tests [`17c82ff`](https://git.odit.services/lfk/backend/commit/17c82ff4098dc42a99fae445fc298471b295cb0a) +- Added everything for basic donor creation [`557608e`](https://git.odit.services/lfk/backend/commit/557608e3181ec3b2c6a6cde3a6405509356e97d0) +- Added first donor-specific errors [`a83fedc`](https://git.odit.services/lfk/backend/commit/a83fedc9b8cefb25105149aa82988c8aa263a0bb) +- Revert "Added license exporter (to json)" [`5cfd2c9`](https://git.odit.services/lfk/backend/commit/5cfd2c9a526b17c3c8cdfa687fa90235426283bc) +- Added license exporter (to json) [`84a0bd2`](https://git.odit.services/lfk/backend/commit/84a0bd2cd90509eb843d3f7db569f0a96685acc2) +- Added the base logic for donor getters [`3df1db4`](https://git.odit.services/lfk/backend/commit/3df1db4ad8fa26deaaf7fe64af94c8893303d9c3) +- Improved error handling for negative lap times [`28c1b6d`](https://git.odit.services/lfk/backend/commit/28c1b6d31dddab082a31aeaedff6dd9339dbfc0c) +- Removed the testing pipeline and updated the dev license pipeline [`8757813`](https://git.odit.services/lfk/backend/commit/875781335c771382aad8d346ee6ec42bb184c6b3) +- Revert "Added test pipeline for automatic license export" [`cc64ce4`](https://git.odit.services/lfk/backend/commit/cc64ce449865e8a460cc9a175141296586da5b09) +- Added test pipeline for automatic license export [`c9378e6`](https://git.odit.services/lfk/backend/commit/c9378e6cae06dcb355bc05cae4370d70477b94be) +- Added donor response class [`e46cfa0`](https://git.odit.services/lfk/backend/commit/e46cfa0d7789466cf9fef153de7eed0fc10c96bf) +- Revert "Removed addresses from tests until the circular dependencies are solved" [`56c6a7e`](https://git.odit.services/lfk/backend/commit/56c6a7efb057da6a43081be803ae2b15402eb2fd) +- Updated track tests for paralellism [`82a0e19`](https://git.odit.services/lfk/backend/commit/82a0e194cbac2b9191e1361909dbcb979865bda3) +- Removed addresses from tests until the circular dependencies are solved [`599296c`](https://git.odit.services/lfk/backend/commit/599296c4e3736bf9aadbc32067cd2ff8c39f0f17) +- Revert "Added automatic license export on dev push/merge" [`2924ac2`](https://git.odit.services/lfk/backend/commit/2924ac290027acb16d08a6b2f79510552abee053) +- Added automatic license export on dev push/merge [`18e3ef9`](https://git.odit.services/lfk/backend/commit/18e3ef9a7954f4102a26f050e5b82ace69e9a17b) +- Added address check for donors that want a receipt [`335d4e2`](https://git.odit.services/lfk/backend/commit/335d4e24daeccf06b559c077e26469c5d6c8a91c) +- Implemented basic donor deletion [`61a17b1`](https://git.odit.services/lfk/backend/commit/61a17b198f13a3c4b57d4811f74a531688e95045) +- Marked property as optional [`02f7ddb`](https://git.odit.services/lfk/backend/commit/02f7ddbb37efe28cc682cda2666d442770f56e8c) +- Added the laptime to the track response [`dcb791c`](https://git.odit.services/lfk/backend/commit/dcb791c9a2418900a9f07730fd9d650593606f72) +- Added the minimum lap time to the track entity [`63b1ca9`](https://git.odit.services/lfk/backend/commit/63b1ca9b56d3c729a441390ca4b4dd1134ae0a37) +- Added donor add test for address needed error [`f9e314b`](https://git.odit.services/lfk/backend/commit/f9e314bf9f2c0a23e585f5a093b1b46a92af54cd) +- Revert "Moved package script related files to their own folder" [`6c7b31d`](https://git.odit.services/lfk/backend/commit/6c7b31d76c2b93078cab53e81242e7d4a5dc7447) +- Moved package script related files to their own folder [`395b010`](https://git.odit.services/lfk/backend/commit/395b0101a8a8684566b4c56e36c1f1f34dc87a4c) +- Reenabled addresses in org responses [`1e2de76`](https://git.odit.services/lfk/backend/commit/1e2de7656e36405b9b15d4e0a7004e8b14e61c85) +- Added helpful comment about the tracktime's unit [`f378b06`](https://git.odit.services/lfk/backend/commit/f378b0651add4142ce02a288c7712ab8d4fdedfa) +- Added address check for donors that want a receipt on update [`2594a60`](https://git.odit.services/lfk/backend/commit/2594a607dc4315a8fdfe42c8b961b6c3a30b4428) +- Fixed copy-paste mistake [`b6ea5e6`](https://git.odit.services/lfk/backend/commit/b6ea5e6549ef5dd347428f8d2fddc564abb7abdc) +- Added the laptime to createtrack [`907259b`](https://git.odit.services/lfk/backend/commit/907259bf737f4ad5bcc5d65f152c3f54ce2f6408) +- Added comments to the bugfix [`9c4e54f`](https://git.odit.services/lfk/backend/commit/9c4e54fc6e738194475c956895a229b18b51a3f4) +- Bumped license lib version [`05868e0`](https://git.odit.services/lfk/backend/commit/05868e0e00aca932634c759f33fc46ff4c9ba5ad) +- Added new donor permission target [`9d9549c`](https://git.odit.services/lfk/backend/commit/9d9549cdd45f53137c8b86b28e2f051b1eba806b) +- Version bump [`276e553`](https://git.odit.services/lfk/backend/commit/276e553e13c8e84a2a884f353bb863aef17e3833) +- Change requested by @philipp [`97e8470`](https://git.odit.services/lfk/backend/commit/97e8470b0d9c2d6e87fb951236769eb4274e2ab9) +- Dependency: Bumped license-exporter version [`6b0e350`](https://git.odit.services/lfk/backend/commit/6b0e3503a75b566640bdbc8a4c4834e318549f2e) +- Fixed not null constraint [`52cdd41`](https://git.odit.services/lfk/backend/commit/52cdd41ec869318d75aead3043b3541487916b5a) +- Fixed not null constraint [`53548ba`](https://git.odit.services/lfk/backend/commit/53548ba7a698bef27560adb18aca07e4a587c155) +- Extended todo w/ issue link [`c9ba697`](https://git.odit.services/lfk/backend/commit/c9ba69792f326b70d68ee1529d513f0fc122d375) +- Adjusted ci dependencies [`82d4b11`](https://git.odit.services/lfk/backend/commit/82d4b11de3a07c6ccbbaa0e4d98c7f4cd8c31440) +- Adjusted ci dependencies [`7547393`](https://git.odit.services/lfk/backend/commit/75473937cfec3abcac7aabb301f115acf1f3a8da) +- Canged drone branch [`a68bbab`](https://git.odit.services/lfk/backend/commit/a68bbab8abaa560fd05ef4ed850854266b6e02c9) +- Removed useless console.log [`a5d70ce`](https://git.odit.services/lfk/backend/commit/a5d70ce4b5ea758a535958752d65d0ab23c727c3) +- Added todo relateing to the bugfix issue [`9b5d16a`](https://git.odit.services/lfk/backend/commit/9b5d16ae92045580a748c820d0af64950cf2fdfd) +- Added secondary dependency for piupeline [`a684f60`](https://git.odit.services/lfk/backend/commit/a684f602524ea0426c68317786ac25c29281a254) +- new license file version [CI SKIP] [`931cae3`](https://git.odit.services/lfk/backend/commit/931cae3c9839c1febf89276486c6a3d989099133) + +#### [0.0.6](https://git.odit.services/lfk/backend/compare/0.0.5...0.0.6) + +> 30 December 2020 + +- Merge pull request 'feature/56-stats_endpoint' (#60) from feature/56-stats_endpoint into dev [`#56`](https://git.odit.services/lfk/backend/issues/56) +- Merge pull request 'Merge for alpha 0.0.6' (#61) from dev into main [`9cd181c`](https://git.odit.services/lfk/backend/commit/9cd181c5b8cae2d2bf80e635a5d6cd8f9e466eb6) +- Added stats and stats responses for orgs [`5d31d8d`](https://git.odit.services/lfk/backend/commit/5d31d8d1a23f8bbff31cf89cc1090103362c607e) +- Added stats response [`53a01ad`](https://git.odit.services/lfk/backend/commit/53a01ad97779ff47be4c309f5dc2547ecc61d08e) +- Added a controller for stats clients (todo: put) [`500b94b`](https://git.odit.services/lfk/backend/commit/500b94b44afc27df2bbbaab50390fdf7e7fb7d14) +- Added a response class for team stats [`ec64ec3`](https://git.odit.services/lfk/backend/commit/ec64ec3d6326c0afcdff64f782944554c2760b78) +- Added response class for the runner stats [`d850650`](https://git.odit.services/lfk/backend/commit/d850650aeb632576114a0f7d726533585e0fd3bb) +- Update: keys cant be updated (for security reasons) [`b53b5cf`](https://git.odit.services/lfk/backend/commit/b53b5cf91f073a30736fe941ded9d63a1816423f) +- Added authed stats routes [`555e37e`](https://git.odit.services/lfk/backend/commit/555e37eaf71456d4b46ec8343622ccd1d5ea2f27) +- Created a response for the statsClient [`2b38044`](https://git.odit.services/lfk/backend/commit/2b3804427117ab36aea31986f18928ee49f9fdcb) +- Impelemented stats api auth via token or the usual auth (jwt with get for runners, teams and orgs). [`43e256f`](https://git.odit.services/lfk/backend/commit/43e256f38c216b0136dd9b6fb41a73f98047d110) +- Added basic status api key checking middleware [`7c5a389`](https://git.odit.services/lfk/backend/commit/7c5a3893efd98bcd1b0684e3c0571a5206485bf0) +- Updated the method of api key creation. [`0481317`](https://git.odit.services/lfk/backend/commit/04813173e4c6ff57702950ad5d8126a1ad7b47f3) +- Implemented more stats endpoints [`6e121a3`](https://git.odit.services/lfk/backend/commit/6e121a3ce29ba858eafe3d8c6314c865cd05621c) +- Added the new statsClient class for stats api auth [`a738c19`](https://git.odit.services/lfk/backend/commit/a738c19316355343d4a458903de3209f0fbd8daa) +- Added stats endpoint with some basic stats (more to come) - to be tested [`1b7424f`](https://git.odit.services/lfk/backend/commit/1b7424f7501075ede10cc91e3f4de096065b4533) +- Added Create action for the statsclients [`e2cc0c0`](https://git.odit.services/lfk/backend/commit/e2cc0c0b800a66a8696525dd7a8f7e4b3d456c7c) +- Added some comments [`e0fa58d`](https://git.odit.services/lfk/backend/commit/e0fa58da57013a3482636a04d20095d2f842fa7e) +- Added example endpoint for stats auth [`345851b`](https://git.odit.services/lfk/backend/commit/345851bf1d8dc06c2cdcefe90135dea3470898e6) +- Added basic errors for stats clients [`641466a`](https://git.odit.services/lfk/backend/commit/641466a7315fe6869e9b41cdb855cc52cf5487f9) +- Added enabled flag for the stats clients [`4c3d264`](https://git.odit.services/lfk/backend/commit/4c3d2643c111dece23a38a565cd4cb156e55a917) +- Updated security for the stats endpoints [`6cb978d`](https://git.odit.services/lfk/backend/commit/6cb978df98c548111ea5da6dac4c551d7411748b) +- Moved the authchecker to the middleware folder (b/c it pretty much is a glolified middleware) [`b5f9cf2`](https://git.odit.services/lfk/backend/commit/b5f9cf201d09c32ff10017eb7956cf41d6167540) +- Added openapi scheme for the stats api tokens. [`9675e79`](https://git.odit.services/lfk/backend/commit/9675e79441e623821402902768bd1cbd9c6ef951) +- Switched to hased tokens based on uuid (to be canged) [`bb24ed5`](https://git.odit.services/lfk/backend/commit/bb24ed53a4b4601c2cce9d0d5ecdc23e5db18f6d) +- Added team and org stats [`6a762f5`](https://git.odit.services/lfk/backend/commit/6a762f570d8f58c70413974daa2f4d20729af814) +- Added donation amount to the stats runner response [`35dbfeb`](https://git.odit.services/lfk/backend/commit/35dbfeb5e7302dd1865d41c561dbdfb2f0823603) +- Added ResponseSchemas and fixed donation resolution bug [`dd48ee2`](https://git.odit.services/lfk/backend/commit/dd48ee2f7edd38af803f735567e1aadeeb7c655d) +- Added mission relation resolving [`d779175`](https://git.odit.services/lfk/backend/commit/d7791756dcee47e0e0e516a2a1be8f88d0394c4f) +- Added response schemas [`a9ecfcc`](https://git.odit.services/lfk/backend/commit/a9ecfccfd26bcd47c902c7ddd81b3049384e12bc) +- Adapted the new async behaviour [`c4270b0`](https://git.odit.services/lfk/backend/commit/c4270b0839cb90be2be7ed498605eedb0f6e4d4d) +- Adjusted the validation type [`b7cbe2a`](https://git.odit.services/lfk/backend/commit/b7cbe2a0b485d341c7a556d460d585e0be834056) +- Added STATSCLIENT as a new permission target [`b604374`](https://git.odit.services/lfk/backend/commit/b6043744a9ce1ec9daf04aefd965659f8df26750) +- Version bump [`41828a6`](https://git.odit.services/lfk/backend/commit/41828a6e41164fc8472595d5b6410f481d65909f) +- Added response schemas [`4cb0efa`](https://git.odit.services/lfk/backend/commit/4cb0efa6bd17b30bbc67767e7eb2d7f313d5cf3c) +- Renamed class [`1b74b21`](https://git.odit.services/lfk/backend/commit/1b74b214202217edfcb5ab4202a713cfb14130c1) +- Removed async flag, b/c this doesn't need to perform anything async [`e3ea83b`](https://git.odit.services/lfk/backend/commit/e3ea83bb4782565e773e97019a92aa71f92c2809) +- Removed abstract flag from class [`ce55dce`](https://git.odit.services/lfk/backend/commit/ce55dce011bb44c65b1ed1e3a60123cb5edb7b38) +- Adjusted return type, since async is no longer needed here (thanks to db relations) [`bdd4f70`](https://git.odit.services/lfk/backend/commit/bdd4f705bee079d052c17bc5fb1222c73d8aef47) + +#### 0.0.5 + +> 29 December 2020 + +- Merge pull request 'feature/52-alternative_openapi_viewers' (#53) from feature/52-alternative_openapi_viewers into dev [`#52`](https://git.odit.services/lfk/backend/issues/52) +- Merge pull request 'feature/49-openapi_cookie_schema' (#51) from feature/49-openapi_cookie_schema into dev [`#49`](https://git.odit.services/lfk/backend/issues/49) +- Merge pull request 'feature/45-auth_tests' (#50) from feature/45-auth_tests into dev [`#45`](https://git.odit.services/lfk/backend/issues/45) +- Merge pull request 'feature/40-pw_reset' (#48) from feature/40-pw_reset into dev [`#40`](https://git.odit.services/lfk/backend/issues/40) +- Merge pull request 'feature/43-postal_from_env' (#46) from feature/43-postal_from_env into dev [`#43`](https://git.odit.services/lfk/backend/issues/43) +- Merge pull request 'Updated the put methods and cleaned up a shitload of comments' (#42) from feature/39-update_puts into dev [`#39`](https://git.odit.services/lfk/backend/issues/39) +- Merge pull request 'Fixed a bug concerning user updates' (#38) from bugfix/37-user_update into dev [`#37`](https://git.odit.services/lfk/backend/issues/37) +- Merge pull request 'feature/34-status_health' (#36) from feature/34-status_health into dev [`#34`](https://git.odit.services/lfk/backend/issues/34) +- Merge pull request 'Auth for everything (and everything auth) #6' (#35) from feature/6-api_auth into dev [`#6`](https://git.odit.services/lfk/backend/issues/6) +- Merge pull request 'Runner import' (#33) from feature/22-runner_import into dev [`#22`](https://git.odit.services/lfk/backend/issues/22) +- Merge pull request 'feature/24-production_dockerfile' (#30) from feature/24-production_dockerfile into dev [`#24`](https://git.odit.services/lfk/backend/issues/24) +- Merge pull request 'feature/25-refresh-token-cookie' (#29) from feature/25-refresh-token-cookie into dev [`#25`](https://git.odit.services/lfk/backend/issues/25) +- Merge pull request 'New Feature: User seeding feature/19-user_seeding' (#26) from feature/19-user_seeding into dev [`#19`](https://git.odit.services/lfk/backend/issues/19) +- Merge pull request 'Added drone pipeline that automaticly runs on prs (or at least it should)' (#27) from feature/23-tests_on_pr into dev [`#23`](https://git.odit.services/lfk/backend/issues/23) +- Merge branch 'feature/18-exported-env-vars' into dev [`#16`](https://git.odit.services/lfk/backend/issues/16) [`#18`](https://git.odit.services/lfk/backend/issues/18) +- final phone validation move to ZZ default [`#16`](https://git.odit.services/lfk/backend/issues/16) +- Merge branch 'feature/12-jwt-creation' into dev [`#12`](https://git.odit.services/lfk/backend/issues/12) +- ✅ - close #14 [`#14`](https://git.odit.services/lfk/backend/issues/14) +- tsdoc generation [`#8`](https://git.odit.services/lfk/backend/issues/8) +- Merge pull request 'Updates for the tag build pipeline' (#58) from dev into main [`bc76afa`](https://git.odit.services/lfk/backend/commit/bc76afafce6faaba67718753e218fc0d7be899fc) +- switched over to using the static deployment of swaggerUI [`39ad43b`](https://git.odit.services/lfk/backend/commit/39ad43bbb20055328f51ff7d96983c8f3318fd61) +- Added very basic api doc chooser [`ebedea9`](https://git.odit.services/lfk/backend/commit/ebedea97ed3eb0c35696e18e5b69e60232b11667) +- Cleanup [`6e316a7`](https://git.odit.services/lfk/backend/commit/6e316a7533daca0c2045b8947ce9c0cb84253876) +- Moded runner get tests to a new file and added more of them [`49ac7be`](https://git.odit.services/lfk/backend/commit/49ac7be3671f5e322bd30b480f943f7464947718) +- Added responseusers [`efecffb`](https://git.odit.services/lfk/backend/commit/efecffb72d85ecedc8fb5656312d4e514d393145) +- Consolidated the json import for a cleaner result [`0d8fbf1`](https://git.odit.services/lfk/backend/commit/0d8fbf1eca512c3a14cd4ca09b0eda820742ed43) +- Implemented new Permission system on the DB side. [`cc5a309`](https://git.odit.services/lfk/backend/commit/cc5a30980a8d07966981f0474f2de83e15c7a5e5) +- Added runner update tests [`c20f01f`](https://git.odit.services/lfk/backend/commit/c20f01f485897ca3f6e5a4936525fc7266ec020c) +- Added org deletion tests (orgs that still have teams) [`32a92b1`](https://git.odit.services/lfk/backend/commit/32a92b1ad712a83d9bdd901b3341815a4edece3d) +- Added runner creation tests [`47862f2`](https://git.odit.services/lfk/backend/commit/47862f2e1dd3ab958b81242def40fda1fc6c8343) +- Added auth reset tests [`c6ecde2`](https://git.odit.services/lfk/backend/commit/c6ecde29b59119152f8c68f6e504a81c9e628208) +- Added team update tests [`105efdd`](https://git.odit.services/lfk/backend/commit/105efdd4543ad14cb43a6bfb5f15f16527c8fe03) +- Runner updateing now works with it's own class [`f3000f1`](https://git.odit.services/lfk/backend/commit/f3000f14cd3197c95e8a26366435a0ca99e06d8c) +- Bugfix for runner team updates [`721af32`](https://git.odit.services/lfk/backend/commit/721af329893f6c18c378491b61bae053722f41e6) +- Implemented basic password reset [`caeb173`](https://git.odit.services/lfk/backend/commit/caeb17311b3acae85850f4dd0fe835421f6d2b63) +- Added auth refresh tests [`13949af`](https://git.odit.services/lfk/backend/commit/13949af938ccc1897e3692c3facb2fefb2ed4a7b) +- Added logut tests [`3c003a6`](https://git.odit.services/lfk/backend/commit/3c003a60b207d744a6763fc8605abeadd07d81fc) +- added the first login tests [`af27448`](https://git.odit.services/lfk/backend/commit/af2744885fd047467b948c5414d308487c49abc4) +- Added a basic pw reset action [`aa146cd`](https://git.odit.services/lfk/backend/commit/aa146cd6c1d2bfd94217778863f55b34c9c3b103) +- refactoring: cleaned up the names [`d295100`](https://git.odit.services/lfk/backend/commit/d295100a48b46aaa1b2f085464ae282e9d626c10) +- Added runner deletion tests [`d2e0384`](https://git.odit.services/lfk/backend/commit/d2e0384f3cf0d159f1d531f4ac89fae8ae697da9) +- Added team update test [`92dee66`](https://git.odit.services/lfk/backend/commit/92dee666ee842eafa010cb19484e850be01daacb) +- Added basic update test [`64725d9`](https://git.odit.services/lfk/backend/commit/64725d9e7a75e3768ba1912989a94ac1ec741fb9) +- Went back to using id's for deletion (for cleaner query params) [`df5b8ac`](https://git.odit.services/lfk/backend/commit/df5b8ac141ebd009018537ca6107f212dc6403c6) +- Now disableing users while they're in the process of resetting their password [`4b9bfe3`](https://git.odit.services/lfk/backend/commit/4b9bfe3b79c2afd4013df5ed30d7e3fa5b635e2e) +- Added openapi cookie security schema [`dae51cf`](https://git.odit.services/lfk/backend/commit/dae51cfd471089fa15b5feceb66af1407304fde5) +- Changed method of triggering lib builds [`ded14b1`](https://git.odit.services/lfk/backend/commit/ded14b1b3bc7282ed09a708d990c88d7ef913b94) +- Implemented a password reset timeout [`17ee682`](https://git.odit.services/lfk/backend/commit/17ee682029cf261a557dc2e20d6375c41b12f721) +- Added first demo seed [`09decd5`](https://git.odit.services/lfk/backend/commit/09decd5600e415491f5a50e078b3487f099542f4) +- Set trigger to ref tags only [`b737fe6`](https://git.odit.services/lfk/backend/commit/b737fe6a0829f85aba3670c7f6de46f2b7da0cf4) +- Little comment cleanup [`02877ec`](https://git.odit.services/lfk/backend/commit/02877ece9c0dde3211931de0a1b71b57f21843cb) +- Implemented the getter for loading the postalcodelocale from env [`b8c93bf`](https://git.odit.services/lfk/backend/commit/b8c93bf476d0c2e7ac37b202d0b8788567304824) +- Added basic runner get tests [`d0d050e`](https://git.odit.services/lfk/backend/commit/d0d050e6c6e8733b677030883ce259f51d1e3eda) +- Updated ci to trigger the builds for the new libs [`ce5f4b4`](https://git.odit.services/lfk/backend/commit/ce5f4b467d66ee3865e9f1662ed8a4f5bce645c4) +- Implemented toe password reset route [`5aad581`](https://git.odit.services/lfk/backend/commit/5aad581c2d01fc674c0f94a7c6a778b798abaa07) +- Renamed the password reset token creation class to better fit the scheme [`aef8485`](https://git.odit.services/lfk/backend/commit/aef8485f597aca09e680a3967bd15b361c1531c4) +- Added drone pipeline that automaticly runs on prs (or at least it should) [`d543dfb`](https://git.odit.services/lfk/backend/commit/d543dfb2010f186f242407284016ffe34669f78c) +- Added login test after logout [`a9dbf1d`](https://git.odit.services/lfk/backend/commit/a9dbf1d0d2cb79b75707b91462d043a66c8f64a0) +- Users now can be disabled from the start [`a16c4c5`](https://git.odit.services/lfk/backend/commit/a16c4c564a5c81fbe46326591ca574c09069fcee) +- Updated the openapi descriptions for all team routes [`16e5b69`](https://git.odit.services/lfk/backend/commit/16e5b6921d35ed69ba9d48ec6ae0789127aa59e4) +- Updated the openapi descriptions for all team routes [`58a12c7`](https://git.odit.services/lfk/backend/commit/58a12c7fa187ad94801313ebd7df01dee8cffe0a) +- Updated the openapi descriptions for all organisation routes [`f256dec`](https://git.odit.services/lfk/backend/commit/f256dec121bb39bbb9f23273d9cb4f9400f94db8) +- Updated the openapi descriptions for all runner routes [`66631f5`](https://git.odit.services/lfk/backend/commit/66631f5e0a943be974dee887758052c61a1f7708) +- Updated the openapi descriptions for all runner routes [`8de35f3`](https://git.odit.services/lfk/backend/commit/8de35f3431b28759f152ad01e60be86519d488b0) +- Updated the openapi descriptions for all permission routes [`05319e6`](https://git.odit.services/lfk/backend/commit/05319e6f6ea10676281f2a05aad95cdca4d156ba) +- Updated the openapi descriptions for all auth routes [`50f2462`](https://git.odit.services/lfk/backend/commit/50f2462eb9f5a49e1cc6cfb6ce8473b9804073f0) +- Added comments [`146787f`](https://git.odit.services/lfk/backend/commit/146787fd660afe1bd8d775b9355e3ad97f6795dc) +- All things auth now check if the user is disabled [`bf4250b`](https://git.odit.services/lfk/backend/commit/bf4250babd3e5c684cfdea9d49a5e268db8867c8) +- Added a password reset token request route [`61aff5e`](https://git.odit.services/lfk/backend/commit/61aff5e629c0e1c9349e4709bcbeb0b3e56ec191) +- User seeding now automaticly runs if no users are detected [`473033a`](https://git.odit.services/lfk/backend/commit/473033aa50191bca7518fc842c6d550c72600304) +- added non-existant deletion test for teams [`71e5be2`](https://git.odit.services/lfk/backend/commit/71e5be2ba47bdfef9f1e1a705ef4014ca7b3244e) +- Updated the openapi descriptions for all import routes [`b7827fe`](https://git.odit.services/lfk/backend/commit/b7827fef5462dbcc5b861716162ca25e892fb455) +- new get test [`5a27689`](https://git.odit.services/lfk/backend/commit/5a27689e80a54c424c3ce260e40d2af2a64e52d9) +- Added wron password auth test [`69796a8`](https://git.odit.services/lfk/backend/commit/69796a888fa9a2f108717d320d5005db388e67b6) +- Added the POSTALCODE_COUNTRYCODE to the sample and ci env files [`f300897`](https://git.odit.services/lfk/backend/commit/f3008979f30b3a4d5de87ad415b06b813f8bd1a2) +- Added seed yarn script [`effa790`](https://git.odit.services/lfk/backend/commit/effa79032bb4dbacaf75a74646130424b21d9767) +- Fixed uniqueness error [`a4ddeee`](https://git.odit.services/lfk/backend/commit/a4ddeee8e4fdabd5ef7abb42a2688508f6a683eb) +- Renamed the return variable to fit the class [`5aa83fe`](https://git.odit.services/lfk/backend/commit/5aa83fe2f0b3c2afbcde2114a60163929c651e12) +- Added a test:ci script (for testing in ci enviornments) [`79e418f`](https://git.odit.services/lfk/backend/commit/79e418f91883f90827453fdf5fe031cf777173da) +- Switched to yarn [`abb1304`](https://git.odit.services/lfk/backend/commit/abb13045e6857057515aab77d8aacb6ef9e23e82) +- Added validator as a explicit dependency, b/c pnpm doesn't fallback to peer dependencies [`a85e914`](https://git.odit.services/lfk/backend/commit/a85e914759e1f511d21c8ddc0a73a40ad08dba65) +- Removed bs enabled check [`2f7b0d5`](https://git.odit.services/lfk/backend/commit/2f7b0d5606de7daa168d6db4f081df4169641e87) +- Changed docker image tag [`fbd3f61`](https://git.odit.services/lfk/backend/commit/fbd3f615ad33e9695f8c77e21a588fb6f14a99ac) +- Merge pull request 'Final fix for the tag pipeline triggers' (#57) from dev into main [`a22a7a1`](https://git.odit.services/lfk/backend/commit/a22a7a19c2bd7bd545a91375447f350432ebaa4a) +- Added very basic api doc chooser [`5c3c3eb`](https://git.odit.services/lfk/backend/commit/5c3c3eb167cbfdfe38467f5ec58b42aa16e9876a) +- 🎨 fixed landing html + styling [`11c7d04`](https://git.odit.services/lfk/backend/commit/11c7d041efaa6d2cca50bc58e263edfd7821147e) +- Removed the firsttests jest tests (they were redundant) [`ce0500e`](https://git.odit.services/lfk/backend/commit/ce0500ef8cf7fd6dca1c74594782f840ecbf92ae) +- Added tests for the api docs [`9ab6eb5`](https://git.odit.services/lfk/backend/commit/9ab6eb5314e102b063cd1131f7f0152af2ca8a6e) +- Tried switching to global when [`607630c`](https://git.odit.services/lfk/backend/commit/607630c4f936ea1097b0300310bb5c4558c65d73) +- Switched from trigger to when [`a7976c0`](https://git.odit.services/lfk/backend/commit/a7976c0ee2d9920595ef9ab595ce3c16fcdb9238) +- Updated the openapi descriptions for all group routes [`1f061c7`](https://git.odit.services/lfk/backend/commit/1f061c7ea6ae59452eae8d1c04f1937608f156df) +- Now using the exact trigger snytax the gitea project uses [`6a8247f`](https://git.odit.services/lfk/backend/commit/6a8247f88a50b7a29e7e0d85b95a31e3436d572b) +- Moved to the official tag recognition [`a79bed2`](https://git.odit.services/lfk/backend/commit/a79bed259b584f586a102da82f92bfdf2db2202f) +- Fixed typo [`c34bde7`](https://git.odit.services/lfk/backend/commit/c34bde7d4fd065f7f43fb62f85de713b546867e1) +- Back to when syntax for triggering tag builds [`b3f7412`](https://git.odit.services/lfk/backend/commit/b3f741234e20f87e856868f01e7014acf1f82726) +- Removed everything concerning the swaggerUI express middleware [`9fc282d`](https://git.odit.services/lfk/backend/commit/9fc282d858d08ccc0a4e546bf149219f13b0fb12) +- Updated the openapi descriptions for all user routes [`578f930`](https://git.odit.services/lfk/backend/commit/578f9301db0a7373a98d74b6c1af0c4a04d367ed) +- Updated the openapi descriptions for all track routes [`9b47f3a`](https://git.odit.services/lfk/backend/commit/9b47f3ab05fbb7f50f24007bac8019ea1f3fdd1b) +- Set package version (+openapi version) [`c93e93b`](https://git.odit.services/lfk/backend/commit/c93e93be319280a6e2284078f2881748b6cb8a0b) +- Removed push from tag build triggers [`e33076c`](https://git.odit.services/lfk/backend/commit/e33076c04d021a3f7c5609e28616f5ad8442ae1b) +- Added branch to when [`f2970f4`](https://git.odit.services/lfk/backend/commit/f2970f4cd8fb95db4cff0c24522890f43448047c) +- Added tag as ref to tag build [`5ed5f18`](https://git.odit.services/lfk/backend/commit/5ed5f181d187cc40c3cde28079a3e6f782b46843) +- Renamed the package to fit the scheme for the project [`d8e38f4`](https://git.odit.services/lfk/backend/commit/d8e38f404dab045e4778a27763a2d0cc1815b6c7) +- Added the static files to the build step [`bb70bf5`](https://git.odit.services/lfk/backend/commit/bb70bf58fb1a09e2c856bd32e679037301f37589) +- Removed the branch requirements from dev [`519d11b`](https://git.odit.services/lfk/backend/commit/519d11beef5dc985314a565313e059f5c5401a19) +- Added pushing to tags as trigger [`b51da15`](https://git.odit.services/lfk/backend/commit/b51da15007f1144d34789effa7ddc52476c0e70c) +- Added push as drone tag build event trigger [`ae35f50`](https://git.odit.services/lfk/backend/commit/ae35f50da268144b948f0ff605c519849ccba5b5) +- Merge pull request 'Bugfix for the release pipeline (no other changes)' (#55) from dev into main [`cc5d90c`](https://git.odit.services/lfk/backend/commit/cc5d90cb4fa811be266f8a49d9669a0a975264f9) +- Merge pull request 'Merge alpha 0.0.5 to master' (#54) from dev into main [`cbed5fc`](https://git.odit.services/lfk/backend/commit/cbed5fc0b24bbb418b02b5808013caaaa3ed050f) +- Added auth to all tests [`b19f18a`](https://git.odit.services/lfk/backend/commit/b19f18ada16d7e7c150e3e4281603b0706435124) +- Added pw reset jwt generation [`6042089`](https://git.odit.services/lfk/backend/commit/6042089074810df8b5af8fc5ff6447ea8c1dc7d0) +- Merge pull request 'Disabled the x-served-by and x-powered-by Headers' (#44) from feature/41-owasp_headers into dev [`b6cf3b2`](https://git.odit.services/lfk/backend/commit/b6cf3b24d42c38952684e8ec95d8cd5950af4940) +- Code + comment cleanup for the entities [`d20d738`](https://git.odit.services/lfk/backend/commit/d20d7382180b798ecf96ba30d7171a870be682f5) +- Implemented permission getting [`d89fcb8`](https://git.odit.services/lfk/backend/commit/d89fcb84a28b535a017dd22494281710d465072f) +- Code + comment cleanup for the response models [`7533298`](https://git.odit.services/lfk/backend/commit/75332983c2b6eec549af8b479c864277102e3f7d) +- First part of the action comment refactoring [`1d0d79f`](https://git.odit.services/lfk/backend/commit/1d0d79f3da52adb9e070812f2a8428bad0303f2e) +- Now with 1000% cleaner jwt generation [`65a8449`](https://git.odit.services/lfk/backend/commit/65a8449ea390503060a9882dc6a102411ad93880) +- Fixed some weired user update behaviour [`ca14237`](https://git.odit.services/lfk/backend/commit/ca142376b3e229dc149a1d66de6756b29eb565ae) +- Implemented permission updateing [`8820654`](https://git.odit.services/lfk/backend/commit/882065470adf15ee38a6a0047d42c9a9d864f12d) +- Second part of the action comment refactoring [`48bef8d`](https://git.odit.services/lfk/backend/commit/48bef8db608032375705b27aecc4c9ae7b75f655) +- Added Permission creation [`dc485c0`](https://git.odit.services/lfk/backend/commit/dc485c02eac36096011fa731bb85cce10c1bc4b3) +- Now with smooth access token refreshing [`6403e38`](https://git.odit.services/lfk/backend/commit/6403e386ab3a2ec5a994ad8f50fecdc73a8791c9) +- Now with cleaner participants in the responses [`145a08b`](https://git.odit.services/lfk/backend/commit/145a08b1b4f0c8c7a389b04d7ef033e23641a5b7) +- Added specific permission getting [`ebb0c5f`](https://git.odit.services/lfk/backend/commit/ebb0c5faca6fee18482a6552f10be18be5398b40) +- Switched runner orgs to the cleaner syntax via a update entity [`532b5a5`](https://git.odit.services/lfk/backend/commit/532b5a56a5226d524f864bb8e965b4f57483101b) +- Implemented permission deletion [`d4293c1`](https://git.odit.services/lfk/backend/commit/d4293c164db3478c5adc799e33b1d721e99b1972) +- Added auth to all endpoints [`744faba`](https://git.odit.services/lfk/backend/commit/744faba7eec3702b8cbd15fe51e7a248cc7cc19a) +- Fixed messages and comments for AuthErrors [`4ca85a1`](https://git.odit.services/lfk/backend/commit/4ca85a1f224ae48fc5c358e8e044b86f054c9d3d) +- Fixed the user->Group relation [`d670b81`](https://git.odit.services/lfk/backend/commit/d670b814a4d516f1874dc11dc3bccdd9c59c536c) +- Added a admin group with all permissions to seeding [`f25ae9b`](https://git.odit.services/lfk/backend/commit/f25ae9ba4f390c9ec71891ed326d47060dfb7133) +- Cleaned up the auth checker a little bit [`b9e9150`](https://git.odit.services/lfk/backend/commit/b9e91502cdbfa391805435cc2ea07a563894f3c7) +- Fixed some stuff not getting checked against null [`7a4238f`](https://git.odit.services/lfk/backend/commit/7a4238f1f7e54de2c0ec91b3dc67656c2f1f7ec8) +- Moved runners to the new put mechanism [`cc68948`](https://git.odit.services/lfk/backend/commit/cc68948a205b7e983f4c6f8e21b47d9b60c008bc) +- Added coments to the jwt creator [`428e2c3`](https://git.odit.services/lfk/backend/commit/428e2c38cef3ce34714a28ce78d18681d28b8bfc) +- added a simple health route [`cea5993`](https://git.odit.services/lfk/backend/commit/cea5993049b3c7098c33a2191db496656d72589e) +- User deletion now also delete's the users permissons [`ff3a5b4`](https://git.odit.services/lfk/backend/commit/ff3a5b4545d0359cd4af94229bb71c023888a860) +- Added the openapi security header to all routes that need some kind of auth [`cdfd0e0`](https://git.odit.services/lfk/backend/commit/cdfd0e0d64ae469b0ecfde353834b89364708b28) +- Added permission deletion on group deletion [`9dc336f`](https://git.odit.services/lfk/backend/commit/9dc336f0bbe3708201c1745f55f8e00f4a82557f) +- Added comments and formatting to the auth checker [`595a921`](https://git.odit.services/lfk/backend/commit/595a9213c199f5bd0274c8dde382845f308e1567) +- Code + Comment cleanup for the middlewares [`a88c038`](https://git.odit.services/lfk/backend/commit/a88c0389c1dc6862fe1a10b03c1345a1196869c5) +- Added class validation for the enum [`2240a45`](https://git.odit.services/lfk/backend/commit/2240a45a91c7597cae154cad0672784965c1cbe6) +- Reverted simplification that created loops [`7d5f3b0`](https://git.odit.services/lfk/backend/commit/7d5f3b092f72de6cf97ee35735ece35c554ddc6d) +- Updated some nameing to fit with the rest of the models [`4a21c1f`](https://git.odit.services/lfk/backend/commit/4a21c1fb5cecaba4138dd2ae5df938b257683475) +- Fixed messages and comments for TrackErrors + spelling for some other errors [`75b6489`](https://git.odit.services/lfk/backend/commit/75b6489f8dc91c0c268bf46158ccf5375cfa674d) +- Fixed messages and comments for RunnerOrganisationErrors [`37afc10`](https://git.odit.services/lfk/backend/commit/37afc10e44b4beed4563bd67bbba0fbbe42c1c75) +- Moved permissions to the new put mechanism [`b2bd617`](https://git.odit.services/lfk/backend/commit/b2bd6173a5b2c2fab5a259e0136486aeb92fd833) +- Moved runner teams to the new put mechanism [`24de82f`](https://git.odit.services/lfk/backend/commit/24de82f6dff1ff07cab5b5a851519a290b642266) +- Reimplmented the old permission checking system [`6237e62`](https://git.odit.services/lfk/backend/commit/6237e62a03a6d35beed78c4283b82c26d0753ce9) +- Updated loader comments and descriptions [`43a4f11`](https://git.odit.services/lfk/backend/commit/43a4f1118da324016f9038451484f3b8e6764729) +- Fixed messages and comments for RunnerTeamErrors [`389f634`](https://git.odit.services/lfk/backend/commit/389f6347c367c04e8e6b45cf42f2d54f1bc28084) +- Added toString for permissions [`445e96d`](https://git.odit.services/lfk/backend/commit/445e96dcdf273cb67724ebce86b2eb9bd4155085) +- Jwt's now feature group permissions and permission deduplication [`d742ccd`](https://git.odit.services/lfk/backend/commit/d742ccd581fc803663d90916365d60b0c7caccd5) +- Added missing username property to the responseuser [`cf583a2`](https://git.odit.services/lfk/backend/commit/cf583a22fad8de5967bd0a1be93a693a935ef1c1) +- Shoothed out variable nameing scheme [`1d54fb0`](https://git.odit.services/lfk/backend/commit/1d54fb085b43aaa9584a9998a2381fd49bec0040) +- Fixed messages and comments for UserErrors [`ee76f1c`](https://git.odit.services/lfk/backend/commit/ee76f1c0e8d9f93a9a98871fbfeedbc55fc0cbc1) +- Formatting implemented for @philipp [`a0a08f7`](https://git.odit.services/lfk/backend/commit/a0a08f7724e64c05e3a6bec74071d2a0f74b8f7e) +- Added additional targets and actions for permissions [`e25fc79`](https://git.odit.services/lfk/backend/commit/e25fc795fe006b27b64199868fb928b94851f4cf) +- Now with duplication avoidance [`6a7e8cc`](https://git.odit.services/lfk/backend/commit/6a7e8ccc37a05a2745ff85d785e6ceb9a180c71b) +- Code + comment cleanup for the enums [`a03f1a4`](https://git.odit.services/lfk/backend/commit/a03f1a438d1e15cb68015a0a90c7e9ebbc2def95) +- Code + comment cleanup for the seeds [`a85d524`](https://git.odit.services/lfk/backend/commit/a85d52437b7e448c8e35741eb71ed28ab3147f3b) +- Fixed messages and comments for UserGroupErrors [`2199cb0`](https://git.odit.services/lfk/backend/commit/2199cb0aef340034644d7b9204a215e539fd6005) +- Fixed messages and comments for PermissionErrors [`c1d784e`](https://git.odit.services/lfk/backend/commit/c1d784e29c80b71a499d5bdd08b897561e235979) +- Formatting #6 [`1a9c860`](https://git.odit.services/lfk/backend/commit/1a9c860188dda598582d01ba5c39b36cc33f4d55) +- Added tracks/get as test-route for auth [`b21dd6f`](https://git.odit.services/lfk/backend/commit/b21dd6f0c0dff656c7b1d2acc4142a5cf44c66dc) +- Fixed messages and comments for RunnerErrors [`5de81ad`](https://git.odit.services/lfk/backend/commit/5de81ad0939cd870ff960c303930147f81144781) +- Fixed wrong error type [`b55d210`](https://git.odit.services/lfk/backend/commit/b55d210affbe19a07d1859064a8d58f9562d3319) +- Renamed function to better reflect it's function [`3850bd9`](https://git.odit.services/lfk/backend/commit/3850bd968173fb2a701ff02327c38a662ee0c40b) +- Bugfix for bs file names [`23758e7`](https://git.odit.services/lfk/backend/commit/23758e7a91ddccef2b37b6b0c20b257de7681764) +- removed useless deletes [`adec2bc`](https://git.odit.services/lfk/backend/commit/adec2bcc5b56fe7139eaada4f66398f20ae9212f) +- Fixed import for linux [`631310f`](https://git.odit.services/lfk/backend/commit/631310f1589511803bd2044fc0f021e7f53226a7) +- Updated the openapi json path for the ci testing script [`0b4d30b`](https://git.odit.services/lfk/backend/commit/0b4d30b3f3760d0e926c3ce4d58def6ff22f5674) +- fixed typo [`5d75f70`](https://git.odit.services/lfk/backend/commit/5d75f70296670b08f425e29b9159aaa7344a5fc8) +- Updated the openapi descriptions for all status routes [`84b97be`](https://git.odit.services/lfk/backend/commit/84b97bee8d19ab87b6485488ed8c2b4781b88f0c) +- Removed the user disableing [`9458b77`](https://git.odit.services/lfk/backend/commit/9458b774ea1abd7d2c10676264e715ee5e44b49f) +- Fixed weired query behaviour [`8d860cb`](https://git.odit.services/lfk/backend/commit/8d860cb2e109bcee81d0de60cdbbcbe9076a8fde) +- Set reset token expiry to 15 mins [`4868545`](https://git.odit.services/lfk/backend/commit/48685451bead5972a95dec9abd03f9b5285454ed) +- Disabled the x-served-by and x-powered-by Headers [`19422ed`](https://git.odit.services/lfk/backend/commit/19422edbaee15751c37d926e3b31b15acba29984) +- Small bugfix [`0ef6d9c`](https://git.odit.services/lfk/backend/commit/0ef6d9cc4865a5eebd9458cdd51f8aff9f3590d2) +- Added a missing poiunt/exclamation mark [`de91d49`](https://git.odit.services/lfk/backend/commit/de91d491e561881ba5a54d920dba28fe486fce61) +- Moved tracks to the new put mechanism [`fbe2b35`](https://git.odit.services/lfk/backend/commit/fbe2b358bd349456f2f4ac3413ab8b82d6f4bbe3) +- Moved usergroups to the new put mechanism [`18ede29`](https://git.odit.services/lfk/backend/commit/18ede29ea544000abd9bffdfa35d82a62b6733a4) +- Fixed some weired toString beviour [`ec4d751`](https://git.odit.services/lfk/backend/commit/ec4d75128b284fb5530dc76b7ae99df3efcaba75) +- Bugfix for bs file names [`c7fd059`](https://git.odit.services/lfk/backend/commit/c7fd0593fb5cce2b2ae39789073436d674a56825) +- Fixed messages and comments for RunnerGroupErrors [`82ced34`](https://git.odit.services/lfk/backend/commit/82ced34750222f733e30ab42fa6cabe00c6dbba0) +- Manual overwrite [`c3e3c6b`](https://git.odit.services/lfk/backend/commit/c3e3c6bed170f2c3002895fc06a4e0244f976b71) +- Merge pull request 'feature/17-automated_tests' (#21) from feature/17-automated_tests into dev [`57f6775`](https://git.odit.services/lfk/backend/commit/57f67751400510731811c2a2ecd62539172bd9f3) +- Fix for the 404 in the swagger doc [`bd07763`](https://git.odit.services/lfk/backend/commit/bd0776345501cab1634f29dcca36b821d675f789) +- Fixed runner get test [`e223c06`](https://git.odit.services/lfk/backend/commit/e223c060d4665556cf28d91a3e4fe85831e93602) +- Removed console logs [`7fe9480`](https://git.odit.services/lfk/backend/commit/7fe9480c9408d1f3b51fe22c4fbf530e9cde0bf2) +- Runner update tests now run clean [`6eee80d`](https://git.odit.services/lfk/backend/commit/6eee80d3577d5da218ace78710904dc8523ebfe3) +- future proved the group update failture [`6e12b01`](https://git.odit.services/lfk/backend/commit/6e12b014e706b96e3e3b1f2d39276f417a537157) +- Replaced a console log with a consola.error [`aaeef4a`](https://git.odit.services/lfk/backend/commit/aaeef4a27e3980204c4cc300d1f748b19162af62) +- Fixed optional property [`bc80be9`](https://git.odit.services/lfk/backend/commit/bc80be947d073296010d13c9ec1b225e45f8869b) +- Adjustes responsecode [`80ef7e8`](https://git.odit.services/lfk/backend/commit/80ef7e8c3ab8fc3f2db4d0463b1e5f09d5ba17d0) +- Added squlite jurnal tmp file to the gitignore [`3e961e3`](https://git.odit.services/lfk/backend/commit/3e961e34a1a28f1a02bd547eec180ad51cb1ff38) +- Removed sqlite jurnal (however it managed to end up here) [`ff6a4ea`](https://git.odit.services/lfk/backend/commit/ff6a4eaca1d37f1d14a582d4ee4b1a0c99abd3ff) +- Merge pull request 'latest work' (#20) from dev into main [`e3a5b41`](https://git.odit.services/lfk/backend/commit/e3a5b41b5eca8fc7025f31033d0ab96685ef739d) +- Added more basic tests for the runner orgs [`db5feb0`](https://git.odit.services/lfk/backend/commit/db5feb00cc48e475c8575f08535ceaba93883733) +- Added import-action classes [`a8ec014`](https://git.odit.services/lfk/backend/commit/a8ec0142b06eb367e496d395a74105cd7df77d06) +- Pulled out some linguini-esc code [`5dc9edf`](https://git.odit.services/lfk/backend/commit/5dc9edfe40fe0898946861430bda15769e67fdb8) +- Added status codes [`3aae8f8`](https://git.odit.services/lfk/backend/commit/3aae8f85c430115b0a9122881821415261c10b5d) +- Working csv import [`03b7e34`](https://git.odit.services/lfk/backend/commit/03b7e346ab52a2f70b39f8784d8525a7f4da9123) +- Removed the bs code [`ff178f9`](https://git.odit.services/lfk/backend/commit/ff178f9d777f0da0a60d5bad5328222155aae214) +- test drone pipeline [`8d00487`](https://git.odit.services/lfk/backend/commit/8d004873596d07ee03295437bbd27be8647bcf5d) +- Added downstream trigger [`0c6f3d1`](https://git.odit.services/lfk/backend/commit/0c6f3d1f12397666562ea8e630abcecc059d6ffe) +- Now organisations and teams can import runners [`71228fb`](https://git.odit.services/lfk/backend/commit/71228fbf33a59e9d1d77ee8415c43a69a66ac010) +- Added rawbody if needed [`b9fd237`](https://git.odit.services/lfk/backend/commit/b9fd2379f4bc83265441c08814d85f359c3cd11b) +- Added responseschemas and content types [`15ed9f5`](https://git.odit.services/lfk/backend/commit/15ed9f58d5aa22ba7d53f1e54e6f45f72ec01948) +- Fixed the dynamic class creation [`cad30c7`](https://git.odit.services/lfk/backend/commit/cad30c7f6326d288173223e77df59f90696576da) +- Added endpoints for runner import by json and csv [`2e4a4f1`](https://git.odit.services/lfk/backend/commit/2e4a4f1661093ad8816aca44684ea4a97a8816d7) +- Added a basic import controller [`1b1f8f2`](https://git.odit.services/lfk/backend/commit/1b1f8f2b09bc72b90c0c12bbd1cc5a68a1290cc3) +- Removed the test pipeline [`fcb3e35`](https://git.odit.services/lfk/backend/commit/fcb3e35b29d23421f06bb052c5609aa858533eb9) +- Runners can now be imported into a org [`97494ae`](https://git.odit.services/lfk/backend/commit/97494aeaf71d258980256592ae4406f2a2be0bb9) +- Cleaned up relation types [`eb9473e`](https://git.odit.services/lfk/backend/commit/eb9473e230e8737b624b5084b31c73aa99bc4e66) +- Expanded API Decriptions [`9db4344`](https://git.odit.services/lfk/backend/commit/9db4344153ebd8965e2639b4bb008e5e86893055) +- removed the lib generation part [`ec69f6c`](https://git.odit.services/lfk/backend/commit/ec69f6caf3a9ba9e72720b1046e2ce4a30291a96) +- Abstracted a little bit more for potential company runner import [`1b59d58`](https://git.odit.services/lfk/backend/commit/1b59d58c6023803a5b729b0a274c6d17013219d7) +- Updated nameing to fit the usual scheme [`476afc6`](https://git.odit.services/lfk/backend/commit/476afc6a997b68221708c0c2afbd735a5603efe7) +- Marked csv import as not implemented [`30952aa`](https://git.odit.services/lfk/backend/commit/30952aa14f12f7af59780c9c5d2358764db7ac0e) +- Fixed typo [`388fc6b`](https://git.odit.services/lfk/backend/commit/388fc6ba6a62088d773d5e1afd299ee78b47d573) +- Fixed path [`c90f9f1`](https://git.odit.services/lfk/backend/commit/c90f9f1dd44d78b828b2d084c66f1d5cfcf7a8cf) +- Cleanup [`3e6c7b6`](https://git.odit.services/lfk/backend/commit/3e6c7b630258181c8805c8d7f289d4771ea2a017) +- Push [`d0c5323`](https://git.odit.services/lfk/backend/commit/d0c5323cb6e2e62a09ae3e713fd96cb98618bd5a) +- I just need to trigger sth [`4705b5a`](https://git.odit.services/lfk/backend/commit/4705b5a0b4d3e925829cae56cf095c21cb6db0b4) +- fixed command order [`20ec6e0`](https://git.odit.services/lfk/backend/commit/20ec6e0cd6da23579943106b4d5b4ca1ca7dbe92) +- fixed duplicate name [`e10a394`](https://git.odit.services/lfk/backend/commit/e10a3947ba8afc5bf19ec01c8e5329f4551f904b) +- Removed useless console.log [`4801e01`](https://git.odit.services/lfk/backend/commit/4801e010b4e7327507f7465f4b86d1c57cb3c369) +- Merge pull request 'feature/31-lib_generation' (#32) from feature/31-lib_generation into dev [`39b932a`](https://git.odit.services/lfk/backend/commit/39b932a81c22fd54fbf9ae059b340eb16c9a70e4) +- Moved to a "cleaner" directory structure [`e8727ca`](https://git.odit.services/lfk/backend/commit/e8727ca922475f2a7f32ee0785625a3612c21c0e) +- More dynamic creation of objects [`4352910`](https://git.odit.services/lfk/backend/commit/4352910d54a74773499704070f35adb95e542ff6) +- Create models now feature the createparticipant abstract [`56202ec`](https://git.odit.services/lfk/backend/commit/56202ec3094444ec60170953aee5829e2a4ffba1) +- Added basics for the runner team controller [`ca917b0`](https://git.odit.services/lfk/backend/commit/ca917b057767c341f7d0e2f2d62603df9d291a3b) +- Moved Create Runner to it's own file [`9e3ee43`](https://git.odit.services/lfk/backend/commit/9e3ee433d2571110004d797381a872348075a317) +- 🚧 UserGroups [`3275b5f`](https://git.odit.services/lfk/backend/commit/3275b5fd8008b0c10601c33844b6d35ab39d4972) +- User + UserGroup [`48e28e7`](https://git.odit.services/lfk/backend/commit/48e28e7b7a19e1ad66ba12461826676bd9074a58) +- Cleaned up a load of relations and optional stuff [`a1105f0`](https://git.odit.services/lfk/backend/commit/a1105f06abf28d72b691c9431fd54083a82d8318) +- Added basics for runnerorg controller [`a35e6d0`](https://git.odit.services/lfk/backend/commit/a35e6d0a9f19dc7dbde3c867b840276416eac9f6) +- Now with even more inheritance and fancy stuff: RunnerResponses now get their information from participant responses [`b480912`](https://git.odit.services/lfk/backend/commit/b480912bd8c643391865da4c7f4bfeb796315d7a) +- Runnerteams now with resolving relations and response types :O [`a437ada`](https://git.odit.services/lfk/backend/commit/a437ada3b3cee64c69548cf0cd1e93d4fa2495b3) +- Reverted to id based relation setter [`65b2399`](https://git.odit.services/lfk/backend/commit/65b2399eaa83ae97a8ade0f4eef5a17f15773fcb) +- Fixed the cirvular import BS [`ac0ce79`](https://git.odit.services/lfk/backend/commit/ac0ce799f950dac194192177329d07c802feb457) +- New response model for runners [`8beb658`](https://git.odit.services/lfk/backend/commit/8beb658bccb754b73ff7cb39d9d1e18e33cde0dd) +- Now with working runner orga controller including responses [`7b08489`](https://git.odit.services/lfk/backend/commit/7b084895334431445ae2c038bd086c8833a8e530) +- All things deletion for runner* now are clean af and cascadeing [`45675b0`](https://git.odit.services/lfk/backend/commit/45675b06994d6754fa0106f46353b48041aaba13) +- Error cleanup [`33b3bcb`](https://git.odit.services/lfk/backend/commit/33b3bcb8c2eaec3dd9d92a2f92d1e561920b97a9) +- Error cleanup [`1ae466a`](https://git.odit.services/lfk/backend/commit/1ae466a6f4618ca41beaffb64a673a5a66ca4901) +- Created basic runner controller [`701207e`](https://git.odit.services/lfk/backend/commit/701207e100c7b7b71a4791a7594bd346a4618066) +- 🚧 UserController [`d556e9b`](https://git.odit.services/lfk/backend/commit/d556e9ba190222c615b2b7567bd30fece0c08c5c) +- Working(tm) implementation of group and team deletion [`795599f`](https://git.odit.services/lfk/backend/commit/795599fd388150a07c959cb3fbed6f676d3db790) +- Added basic creation class [`7bbf769`](https://git.odit.services/lfk/backend/commit/7bbf769bddaa92ec263d06adb5ccd3199feb8bc4) +- A step towards inheritance for the create* objects relating to runner groups [`5d7d80d`](https://git.odit.services/lfk/backend/commit/5d7d80d2e75e0cdf68eea458b97610e6e2322087) +- Switched to using a response model for tracks [`9130333`](https://git.odit.services/lfk/backend/commit/913033373be3ece9bed301f787e7d7036042ca26) +- 🚧 better/ more errors [`a0e6424`](https://git.odit.services/lfk/backend/commit/a0e6424d482c54d77a887d8b91c81a6f39b51f59) +- 🚧 starting work on LogoutHandler [`675717f`](https://git.odit.services/lfk/backend/commit/675717f8ca495898e87fb73dca12249065301fb0) +- 🚧 basic AuthErrors 🔒 [`b9bbdee`](https://git.odit.services/lfk/backend/commit/b9bbdee82654b5cea26fdd97b38df2c0829ec1e6) +- 🚧 Permissions [`1cf35f0`](https://git.odit.services/lfk/backend/commit/1cf35f016b0aeb0f1224648b301044b2ea76dc60) +- Added comments and decorators for existing create models [`330cbd5`](https://git.odit.services/lfk/backend/commit/330cbd5f57a9f16cbf277ea57fadefcb6d24e0fa) +- Updated relationships to be nullable [`4c80ab1`](https://git.odit.services/lfk/backend/commit/4c80ab1516d11ec069fd79e06cdf050712647090) +- Impementing more methods for the runner orgs [`0c6528b`](https://git.odit.services/lfk/backend/commit/0c6528bdc5eb314399bc722087e3b907f0f59ff8) +- Emergency fix: Switched to table inheritances [`a895622`](https://git.odit.services/lfk/backend/commit/a8956223c2c70b810b4ec9dea09900b30b963a24) +- Cleaned up the createUser a little bit [`a42595b`](https://git.odit.services/lfk/backend/commit/a42595bd15ec7646b5b18758aee4c178857e1427) +- 🚧 CreateUser model [`d2c826c`](https://git.odit.services/lfk/backend/commit/d2c826c7c9a8b79ff5ab6268865a26791b36c2c2) +- Moded track controller related models to a new file [`da4597f`](https://git.odit.services/lfk/backend/commit/da4597fa62dd85b0496aaa6d9407a263b5291912) +- implement proper jwt checking in authchecker [`76e19ca`](https://git.odit.services/lfk/backend/commit/76e19ca28dc183f698049080b62e88f9feddf036) +- first part of the user class cleanuo [`dadaacf`](https://git.odit.services/lfk/backend/commit/dadaacfaaeed6f4cc1a1c01abc6428601708fbcb) +- 🚧 UserAction [`82ca8f4`](https://git.odit.services/lfk/backend/commit/82ca8f48dc8cd5438ba1eeab7b222b1df60355df) +- 🚧 User + Permissions [`a78bbb1`](https://git.odit.services/lfk/backend/commit/a78bbb1de5765f6339440663bb884367b6d3bfdf) +- Smoothed out the participant creation process regarting addresses [`975d30e`](https://git.odit.services/lfk/backend/commit/975d30e411c580d8c6a7e6c87f7d0187b97070f1) +- Updated a bunch of optional collumns to be nullable [`aa565c6`](https://git.odit.services/lfk/backend/commit/aa565c6b344f62521b9b53575ffce36e8b77af74) +- 🚧 basic JWTAuth Middleware [`1f3b312`](https://git.odit.services/lfk/backend/commit/1f3b31267598e1b9e97cf8bed542def68bfd99f6) +- Cleanup: Renamed the creation folder to the more fitting "actions" [`0e92444`](https://git.odit.services/lfk/backend/commit/0e924449d60c994c29b95abba675309e31c04383) +- temp commit: added first part of create runner [`3ade01d`](https://git.odit.services/lfk/backend/commit/3ade01def931fbb7feb1a1fe8b8b8e29a22b0a58) +- Fixed bugs concerning posts [`aca13f7`](https://git.odit.services/lfk/backend/commit/aca13f730865e3660bdc14574af71d1ccfd7e5ad) +- 🚧 Permissions [`1d57264`](https://git.odit.services/lfk/backend/commit/1d5726492286f21adcc6064c62159de8d134538d) +- 🚧 starting work on RefreshAuth [`2f90275`](https://git.odit.services/lfk/backend/commit/2f902755c47af829ae3eb6447a5cabe3c0017cf4) +- CreateAuth model [`a7afcf4`](https://git.odit.services/lfk/backend/commit/a7afcf4cd1ab60f856c299eaeace7fe5f3ec3b14) +- working on AuthController + CreateAuth [`6cb0109`](https://git.odit.services/lfk/backend/commit/6cb01090d0f640d25728495f0a80c756ee43e985) +- Still broken distance, we'll fix this together [`c30922e`](https://git.odit.services/lfk/backend/commit/c30922e3250ad2a0510ab8fd296e364943994eba) +- 🚧 better uuid + starting hashing implementation [`f162944`](https://git.odit.services/lfk/backend/commit/f1629440feae3a49ab17ec7d29b709ff392d6988) +- basic jest + typescript support [`8ae5cea`](https://git.odit.services/lfk/backend/commit/8ae5cea631a9c3097c7fbf7da6ce0cb1f347c4b4) +- Part 1 of the relation fix [`c53e94d`](https://git.odit.services/lfk/backend/commit/c53e94d20517837b871f1649ac3fe850e9658c9c) +- 🚧 UserAction relation [`f50e7f0`](https://git.odit.services/lfk/backend/commit/f50e7f0b3ac49b6f728099e9ed1f1ccb0d9e78ff) +- Added basic runner related errors [`980ac64`](https://git.odit.services/lfk/backend/commit/980ac646889690ae773de75b984dc9eec4e67bb1) +- 🚧 CreateAuth - credential validation [`bd0c7ce`](https://git.odit.services/lfk/backend/commit/bd0c7ce04213a297cf13f85ac63de34785796306) +- 🐞 fixed UserGroupNotFoundError throwing ✅ [`d4753a0`](https://git.odit.services/lfk/backend/commit/d4753a02d4fa04beaf0794f1b15debb38c7827b9) +- CreateUser [`b101682`](https://git.odit.services/lfk/backend/commit/b101682e3cd23ea501ca8c6036084c0d4aef2644) +- Added more runner errors [`cb5d5e5`](https://git.odit.services/lfk/backend/commit/cb5d5e546d0232e771495a3c5d140ac9531b7743) +- Deletes now work based on EntityFromParam [`8870b26`](https://git.odit.services/lfk/backend/commit/8870b26ce63d6294567863c76d9dcfccd18e681d) +- Cleaned up the createUserGroup a little bit [`109e145`](https://git.odit.services/lfk/backend/commit/109e145a1970952a2375df9f1f6cf57f056982ff) +- Fixed amount calculations [`afef95e`](https://git.odit.services/lfk/backend/commit/afef95e14ea1e77144a9cd0ccbf9b02e4d63b4f4) +- 🚧 CreateUserErrors model [`983fa41`](https://git.odit.services/lfk/backend/commit/983fa41cba3a4d537ab742a149b86d6c6a87f5bf) +- Cleaned up the loaders [`f58a715`](https://git.odit.services/lfk/backend/commit/f58a715c45ae5e8ea95041816d78991498461b94) +- implemented refreshcount increase [`13d568b`](https://git.odit.services/lfk/backend/commit/13d568ba3f9a3c1035a2dd48509bee2567bd06f3) +- 🚧 RefreshAuth - refresh tokens now working ✅ [`51addd4`](https://git.odit.services/lfk/backend/commit/51addd4a31e63bdaab64b422f35432571af7da23) +- better errors [`c0c9505`](https://git.odit.services/lfk/backend/commit/c0c95056bf0401de0c77032928547c13982c932c) +- basic Auth model [`b0a24c6`](https://git.odit.services/lfk/backend/commit/b0a24c6a74d9a20a4ec5c562ece6baa3811cd00a) +- first accesstoken generation [`c33097f`](https://git.odit.services/lfk/backend/commit/c33097f7738da74cbd50f3cedd15e1ae173a7e3e) +- 🚧 AuthController with multiple endpoints [`28c2b86`](https://git.odit.services/lfk/backend/commit/28c2b862f0a070323ea7eb1d2c0a53c71979e46f) +- Now all runner endpoints return a response runner [`0564135`](https://git.odit.services/lfk/backend/commit/056413560ec29cb8d8a1f7a94528d84025e994c1) +- 🚧 CreateUser group search + adding [`5b7f3ae`](https://git.odit.services/lfk/backend/commit/5b7f3ae12f3f8749aa637d18763cf5f5df8001eb) +- 🚧 reference new Errors from CreateUser [`1efca47`](https://git.odit.services/lfk/backend/commit/1efca4733617806363e51d013590c885b9b13405) +- 🚧 Permission [`e4d5afb`](https://git.odit.services/lfk/backend/commit/e4d5afbebe7179c926a0625fd11d17f5285e55a8) +- 🧹 cleanups [`e5b605c`](https://git.odit.services/lfk/backend/commit/e5b605cc55715e92885ddb1fefe930b79449c430) +- trying to fix UserGroupNotFoundError (false/not triggering) [`451d0c9`](https://git.odit.services/lfk/backend/commit/451d0c92dddd4e56626eca8c8b9e6728b6427a23) +- 🚧 Scan.ts - secondsSinceLastScan [`9395813`](https://git.odit.services/lfk/backend/commit/9395813f5aafb282a50b8e2313a3022737e7decc) +- 🚧 UserNotFoundOrRefreshTokenCountInvalidError [`093f6f5`](https://git.odit.services/lfk/backend/commit/093f6f5f789d58d54f325fcf02fbd1ab3cf09a95) +- Turned the abstracts into entities [`5bf978d`](https://git.odit.services/lfk/backend/commit/5bf978d32dc8e9d49d9fcff0adeb75c8ee50ad03) +- basic RefreshAuth checking [`126799d`](https://git.odit.services/lfk/backend/commit/126799dab98a8866be2e3f3812b7a76a50d0812d) +- first jwt generation [`6ae0c1b`](https://git.odit.services/lfk/backend/commit/6ae0c1b95526530968198ebf78b10ab1e71a8caa) +- UserNotFoundError [`d803704`](https://git.odit.services/lfk/backend/commit/d803704eeebc5d5a188cb9fd5c9afd6882579fd3) +- Added Comments. [`6d81fc1`](https://git.odit.services/lfk/backend/commit/6d81fc13095b2d96b6cd864f952242749567bbab) +- Added defaults back in [`932e782`](https://git.odit.services/lfk/backend/commit/932e782a14454a05aa59f9b76c7c9638aa440385) +- Cleaned up relations [`dd5f448`](https://git.odit.services/lfk/backend/commit/dd5f4488be9cf5df6fae740f60fb5597382ca984) +- TrackController now also deletes based on a entityfromparam [`0e3cf07`](https://git.odit.services/lfk/backend/commit/0e3cf07b9147f32cf3da40e764fea19fb1f52c58) +- Little bugfix [`9c63a34`](https://git.odit.services/lfk/backend/commit/9c63a34fe13ffed8e35371c42617a43814f7d16c) +- integrate UserNotFoundError [`6244c96`](https://git.odit.services/lfk/backend/commit/6244c969afac300183339aaf0dac77d213947d2b) +- Added basic openapi security scheme for the bearer auth header [`5a4a6cd`](https://git.odit.services/lfk/backend/commit/5a4a6cdcefd96ddc413232841af8b596580d941f) +- 🚧 JwtNotProvidedError [`d23ed00`](https://git.odit.services/lfk/backend/commit/d23ed002b24ee29b1bfca98b7f5b3eb3ce47c2db) +- Now throwing errors even faster [`179add8`](https://git.odit.services/lfk/backend/commit/179add80f480cd10f2951d8f7077164da840d4d0) +- Cleaned up some relations for users [`74ee77f`](https://git.odit.services/lfk/backend/commit/74ee77f814c269718cb99847e4a43600fc52b41f) +- Cleanup: Renamed Responses to represent their response nature [`61e7ae4`](https://git.odit.services/lfk/backend/commit/61e7ae4f86e0453c0efa15f151271d674ea0a44d) +- remove routes/v1/test [`740d7f1`](https://git.odit.services/lfk/backend/commit/740d7f10f5ede09846d5a4d3a482bf750cb13698) +- 🚧 CreateAuth - basic jwt creation with user details [`a0fe8c0`](https://git.odit.services/lfk/backend/commit/a0fe8c0017d4f594d57e0d3c00305077874f5aa0) +- 🚧 User entity - add @Column [`7f3358d`](https://git.odit.services/lfk/backend/commit/7f3358d284889687aef92a4dbd562ec2ccb4c499) +- authchecker - use new custom Errors [`f251b7a`](https://git.odit.services/lfk/backend/commit/f251b7acdbc8e277971cf97cfe619f441ac0362a) +- Attention: Broken [`32c4270`](https://git.odit.services/lfk/backend/commit/32c4270dff0c3e1a9703e72b8b180a7289d413d4) +- 🚧 User.ts - optional phone number [`8d1dd78`](https://git.odit.services/lfk/backend/commit/8d1dd78194be42c837934f0804287624ff7079b9) +- Fixed user<-> Group relationship [`4a9fd57`](https://git.odit.services/lfk/backend/commit/4a9fd57356132b2fce539724c2faecdc6f160e7f) +- sample json validation [`431fd60`](https://git.odit.services/lfk/backend/commit/431fd608a6945b0fbed932f122af5e6e5c8e8cd8) +- remove sampletoken generation [`5c25948`](https://git.odit.services/lfk/backend/commit/5c259484ee5a4063bcf71bd847413014ec848a00) +- 🚧 CreateAuth now returns a sample jwt [`d46ad59`](https://git.odit.services/lfk/backend/commit/d46ad5954676e73ab3c77f2d84c87b22088f4e71) +- 🚧 User - mark columns as unique [`b8bc39d`](https://git.odit.services/lfk/backend/commit/b8bc39d691d10c13e60dc7bd3709d413dcf8b8b6) +- Formatting [`af75d6c`](https://git.odit.services/lfk/backend/commit/af75d6cfec13131f2980cc83866eb3d6b024b9e0) +- Added missing getter [`84dd1fe`](https://git.odit.services/lfk/backend/commit/84dd1fe4a5871e1bf3d5510bb92d826d519dd6ad) +- 🧹 clean up CreateAuth [`1850dd5`](https://git.odit.services/lfk/backend/commit/1850dd542d564e91cf55ac9fcdf7902091969163) +- ⚙ tsconfig - includes + excludes [`8ef6f93`](https://git.odit.services/lfk/backend/commit/8ef6f933a745214ba02a12cf778eb36bc04a0891) +- Fixxed dockerfile [`ee35da7`](https://git.odit.services/lfk/backend/commit/ee35da7342de601650052eae13bc773831ea9ad7) +- 🚧 AuthController - add proper response schemas [`0d21497`](https://git.odit.services/lfk/backend/commit/0d21497c2fd42602d253067d6f6d42fe7cfee5b5) +- note on refreshtokencount checking [`e5f65d0`](https://git.odit.services/lfk/backend/commit/e5f65d0b801934c0ac3a5d898aa7d8fdee4a35c4) +- class-validator on Auth model [`c4b7ece`](https://git.odit.services/lfk/backend/commit/c4b7ece974fe548e68415b49fc8cce913ef6cd92) +- 🚧 move to uuidV4 [`091b455`](https://git.odit.services/lfk/backend/commit/091b455460dfe79276305c533170f5d153d78b73) +- Shortened db call [`c4f0202`](https://git.odit.services/lfk/backend/commit/c4f02023b949312a8e09d2fbd1c4d036816f30e0) +- ⚙ vscode setting - import organize + fix [`92bafb0`](https://git.odit.services/lfk/backend/commit/92bafb0cf457b50a19f0f965c3a7e241974e750d) +- ⚙ settings - standard imports + quote formatting [`684e7c4`](https://git.odit.services/lfk/backend/commit/684e7c4ddbb10e88ead1d33e93f97fc7dcb0db25) +- add response schemas to AuthController [`8c229db`](https://git.odit.services/lfk/backend/commit/8c229dba82ebad03a22231ac821d985a49b45611) +- 🚧AuthController - add all Error response schemas to post [`2a1b65f`](https://git.odit.services/lfk/backend/commit/2a1b65f4249defb535f8464cf5ec3a63e4dd44bb) +- ⚙tsconfig - no sourcemaps [`ffc3150`](https://git.odit.services/lfk/backend/commit/ffc31506e36b9c0b22cc7cc66e6ab5f06c4a64cf) +- 🚧 RunnerCard EAN [`33d159d`](https://git.odit.services/lfk/backend/commit/33d159dbcf49b6dd0e87e85d0a98042e7d5f34a8) +- CreateUser - remove uuid from params [`a7854fb`](https://git.odit.services/lfk/backend/commit/a7854fbe81b1b8ed1c0df7927e3b8da74ad0fab0) +- clean up jwtauth [`c5c3058`](https://git.odit.services/lfk/backend/commit/c5c3058f3d20aa898bd67c02baa3d995321e0ab5) +- 🔒argon2 password hashing w/ salt [`ce2c38e`](https://git.odit.services/lfk/backend/commit/ce2c38e1882882da13e631fdde62a79b879d13b6) +- 📏 fit to new structure [`ae24c33`](https://git.odit.services/lfk/backend/commit/ae24c3394b4243065119535d24252a66cce2cdeb) +- Fixed missing child declaration [`5bbf522`](https://git.odit.services/lfk/backend/commit/5bbf522362a8985e93b16884369f5859ab72d32a) +- Now creating runner orgs again [`ec2ff98`](https://git.odit.services/lfk/backend/commit/ec2ff981b217e460e4547b57a1ad069059d13b7d) +- Removed console logs [`21ad622`](https://git.odit.services/lfk/backend/commit/21ad622c10712ae36fb0c5e1519fc3ecba6341ae) +- Now returning the saved runner [`084691c`](https://git.odit.services/lfk/backend/commit/084691c294ff3bf4d09ef634ce2d0d81ef93c50d) +- added await (async stuff und so) [`7e4ce00`](https://git.odit.services/lfk/backend/commit/7e4ce00c30acd4eaa188fdee524cee1c19948faf) +- 🚧 CreateAuth - use proper refreshTokenCount [`82f3118`](https://git.odit.services/lfk/backend/commit/82f31185a1aaba1cb3d4e3812ff65ef62d042e4c) +- 🚧 CreateUser - add group as object instead of nested array [`a7cf86e`](https://git.odit.services/lfk/backend/commit/a7cf86eae41991956db6b48f8c70ed0d6cec374a) +- Fix [`a3b79ef`](https://git.odit.services/lfk/backend/commit/a3b79ef21df1ce96f0b301097cc0122eef06bfbd) +- ⚙🐞 VSCode formatting broke code by removing all unused [`5e0fcf1`](https://git.odit.services/lfk/backend/commit/5e0fcf1f4ab8ac7929b69cbbf117bbd49edc1407) +- Added missing import [`e3133e0`](https://git.odit.services/lfk/backend/commit/e3133e0d5eb70daf858a6b807970838db8fd0ef9) +- ⚙target: es2017 ▶ ES2020 [`9051b75`](https://git.odit.services/lfk/backend/commit/9051b7565cf3506ddecfdc0abc05e7266be450dd) +- 🐞 CreateRunner - optional orgId & teamId [`098699e`](https://git.odit.services/lfk/backend/commit/098699e09a4b2c1399c471149a3379645710274a) +- Merge pull request 'feature/11-new_classes' (#15) from feature/11-new_classes into dev [`7d9e003`](https://git.odit.services/lfk/backend/commit/7d9e003a6dc32a21214a32d21ced13bd33156b25) +- Initial commit [`80cb16c`](https://git.odit.services/lfk/backend/commit/80cb16cccde94664a16945e05063acfbdad0cad7) +- Added errors and fixed the create model [`b382f06`](https://git.odit.services/lfk/backend/commit/b382f0689bba58f9b731a7d63b44f9ba09b5d732) +- Added participant abstract class [`f350007`](https://git.odit.services/lfk/backend/commit/f350007ae5696a16ecb1994bf3b4be843781b91d) +- fixed auth parsing [`5f4aed2`](https://git.odit.services/lfk/backend/commit/5f4aed2f02b22799d3e043394641bc3ac549caf2) +- Added Runnergroup abstract class [`f999c41`](https://git.odit.services/lfk/backend/commit/f999c416c4367ddbb99fe19e443c1ce4867f5053) +- fixed component definition [`51ff9de`](https://git.odit.services/lfk/backend/commit/51ff9defc5c796ad895bf8ecfdaad2ec8bb35de0) +- Added differenciation between local and docker based testing/dev setup [`860b6c8`](https://git.odit.services/lfk/backend/commit/860b6c850daf5756ad1f97c111f77e5f21c80df0) +- Adjusted the comments for tsdoc [`f0a7cbb`](https://git.odit.services/lfk/backend/commit/f0a7cbbcae140fba469634ef79a63f677cb994c7) +- Added custom errors [`01542ae`](https://git.odit.services/lfk/backend/commit/01542ae6a8779703842fbd0114c8f3b049cd77b7) +- Added openapi style response schemas [`0e3ec4e`](https://git.odit.services/lfk/backend/commit/0e3ec4ebf9a70866b8b54e066f41a4460a361b2b) +- implementation details [`d85c126`](https://git.odit.services/lfk/backend/commit/d85c126c276a91996178ccf8b8e7a566d33dac69) +- Added Basic Scan interface [`abb7f7f`](https://git.odit.services/lfk/backend/commit/abb7f7f89452cdd44bbc5f34d377a9306684fc9b) +- Switched from implementing the "interfaces" as interface to abstract classes [`a2cf8d1`](https://git.odit.services/lfk/backend/commit/a2cf8d1f2c4a2087e2dd6c297bea1a46db4220f9) +- Changed nameing scheme for the abstract classes since we're not useing interfaces [`f8e1bf7`](https://git.odit.services/lfk/backend/commit/f8e1bf715b57788c16c8f8565bc20696c26b1499) +- Merge pull request 'Added our branch structure to the readme' (#10) from bugfix/readmeupdate into main [`96a99c4`](https://git.odit.services/lfk/backend/commit/96a99c4e3ba6910a5922f04fc543419f653384d6) +- Now using typeorm-routing-controllers-extensions for cleaner controllers [`2c29fe2`](https://git.odit.services/lfk/backend/commit/2c29fe29e8153f264ceb91b04ff95ac4883b3ca3) +- Added basic ignores [`186e172`](https://git.odit.services/lfk/backend/commit/186e172be79892e4f5b84eb76331b56621b1af85) +- Added basic ignores [`ba5a4cb`](https://git.odit.services/lfk/backend/commit/ba5a4cb2f22c79e30e1035b0d80caaf58564c73a) +- precommit hooks & file formatting [`595aacb`](https://git.odit.services/lfk/backend/commit/595aacb311c22e63a476579f0d4d95550c314940) +- move to module [`e29d59a`](https://git.odit.services/lfk/backend/commit/e29d59ac02f6d73aba5452cba6801898fe1900b9) +- Switched to using controllers via routing-controllers [`8cbcfe7`](https://git.odit.services/lfk/backend/commit/8cbcfe7fbb66b9de7b6193962ed11b32150aaa7c) +- Added the track scan class [`8b2d684`](https://git.odit.services/lfk/backend/commit/8b2d6840a861d44132740fa65128d45400ebd449) +- Added tracks route [`4ba0219`](https://git.odit.services/lfk/backend/commit/4ba021935c201e9d155656e82a7295c53debd8f8) +- Added the address class [`2bd0cba`](https://git.odit.services/lfk/backend/commit/2bd0cbadbed6b04136d7fc3c6f0f5e8ef35d982d) +- Added rlly basic lib generation [`421ddc5`](https://git.odit.services/lfk/backend/commit/421ddc50edc97dd98f95b19097d26f0b0388b165) +- Implemented more loaders [`6ce88a1`](https://git.odit.services/lfk/backend/commit/6ce88a1e3db4639e05473d7227ed55a785a9e967) +- Cleaned up the pipelines [`40fb081`](https://git.odit.services/lfk/backend/commit/40fb081332d4e24f222eee986d78ac3d85acd5c9) +- 🐳 working Dockerfile [`b8aebc1`](https://git.odit.services/lfk/backend/commit/b8aebc14e837868516a4fbac7bab1cef3b33c754) +- gets now use the db [`7b948f0`](https://git.odit.services/lfk/backend/commit/7b948f0380e6cc8e3d4a8b2ef54ffa34931d7f07) +- 🚀 CI/CD [`359e955`](https://git.odit.services/lfk/backend/commit/359e9559269ff34d91a42905280faa658afb5de9) +- sample implementation of authorizationChecker [`d5c6c92`](https://git.odit.services/lfk/backend/commit/d5c6c9238fb4339153fd2702dda106d36c1893e0) +- Added scanstation class [`f7beebc`](https://git.odit.services/lfk/backend/commit/f7beebce3f5dc39f6b5e8ae34a1010ebf25058e1) +- Added first team creation tests [`862834c`](https://git.odit.services/lfk/backend/commit/862834c877c3cf38f55dccf30c08e6d937cac947) +- Added runnerCard class [`fbbb5df`](https://git.odit.services/lfk/backend/commit/fbbb5df64f6033c528c7e20141fd3208b103500f) +- Added team delete test [`c3258b9`](https://git.odit.services/lfk/backend/commit/c3258b9304be150ae9e36153b72d86fd6f639ac1) +- 🧪tracks.spec.ts - adding + getting + updating tracks [`29acabf`](https://git.odit.services/lfk/backend/commit/29acabfca362ea7e13f7435b171ab3ac2d12daad) +- Deletes now return 204 instead of 404 (better rest compatability) [`a068c4d`](https://git.odit.services/lfk/backend/commit/a068c4d318dadc1860b796b231dafd3e2cf53714) +- Added distance Donation [`6c32a9e`](https://git.odit.services/lfk/backend/commit/6c32a9ebe954cd272ee140d06ef2553c9091239e) +- Added put tests for runner orgs [`0a00503`](https://git.odit.services/lfk/backend/commit/0a0050368fa0e921e20efe43f653c672c7f477ae) +- Added delete test [`13f96e3`](https://git.odit.services/lfk/backend/commit/13f96e319060bea8d47fd7d98ae5e7fc21ff59dd) +- 🚚 basic move to config.ts [`99d8a03`](https://git.odit.services/lfk/backend/commit/99d8a0360f3cdb18444a07ba4f3b5f8cd4bb98d0) +- move to dotenv + custom env validations [`622bdf7`](https://git.odit.services/lfk/backend/commit/622bdf7a3fb31e69ee28b43a02b3958c2568c31e) +- Added the donation abstract/interface [`57ba0c3`](https://git.odit.services/lfk/backend/commit/57ba0c3051ac539eca96a9d32faa00a910332db3) +- basic track testing [`07e03ff`](https://git.odit.services/lfk/backend/commit/07e03ff04e6e51113f9dcdd9e0c2f6bde2c1b906) +- sample implementation of db connection [`0d870be`](https://git.odit.services/lfk/backend/commit/0d870be23c7129645a7f4b16a812d008671d1a0d) +- initial package setup + tsconfig [`a4656e4`](https://git.odit.services/lfk/backend/commit/a4656e40373515f8ef25c2b5137d173f4fab644f) +- basic build works [`47e4f6c`](https://git.odit.services/lfk/backend/commit/47e4f6cd7eaf170f444f618b62c2bf1256ca890f) +- Added TrackScan relationships [`c1242b2`](https://git.odit.services/lfk/backend/commit/c1242b2a2aa0cc2bb07caf845a204052ac3934a7) +- Added basic openapi support [`3ce9a0b`](https://git.odit.services/lfk/backend/commit/3ce9a0b21a050095d93643bab453375c4b889ca6) +- clean up app.ts [`9925047`](https://git.odit.services/lfk/backend/commit/992504705b89e6dd915c97bbb79ccc3c6e6c7dbb) +- Added bad test to the put [`4e3b038`](https://git.odit.services/lfk/backend/commit/4e3b038dec481bdfef53c4cd136120b19d1b462e) +- First tests for orgs [`34fa94e`](https://git.odit.services/lfk/backend/commit/34fa94ea4f896ad17b6a8759f61ecb7fba095d53) +- basic jwt auth test [`3a84cc8`](https://git.odit.services/lfk/backend/commit/3a84cc8ef56c20fce74707f0aa9df7f120ee693e) +- Basic track route [`619485b`](https://git.odit.services/lfk/backend/commit/619485b356427cf3f57fa680628323917a229de0) +- Now using class validator annotations [`a6bd723`](https://git.odit.services/lfk/backend/commit/a6bd7235114e63298f2534636fa1c6fa0f08ddf5) +- Untested dockerfile and compose [`36192ea`](https://git.odit.services/lfk/backend/commit/36192ea5eb253cbdc1303e58fb34cbfa23397dae) +- sample route actions for jwt + consola demo [`8140d76`](https://git.odit.services/lfk/backend/commit/8140d76240a9c8a70ff9199e57a5759d5e7cfb74) +- Removed garbage file [`ad6c9e7`](https://git.odit.services/lfk/backend/commit/ad6c9e72111f91f432b66bc67001ef8ceea499dc) +- Moved attribute to super [`c82cc9a`](https://git.odit.services/lfk/backend/commit/c82cc9a67060268518b33b4e6ee383292c529998) +- move orm config to src folder [`3c38993`](https://git.odit.services/lfk/backend/commit/3c389937b7a1526d1da968d171330d5462fb34af) +- 🧪tracks.spec.ts - move to baseurl [`def7ca3`](https://git.odit.services/lfk/backend/commit/def7ca3eb218caf6cf4ed15799ee8ddf921cdc9f) +- 🐳 optimize Dockerfile in speed and size (pnpm + layers) [`c391201`](https://git.odit.services/lfk/backend/commit/c391201570aae13dd494a6d8fa1d28bd69dea06b) +- Updated author, contributors and license [`2000909`](https://git.odit.services/lfk/backend/commit/200090935f1ec61aa4f2c5b2956c15c48cf5b63b) +- basic prettier config [`8e107fd`](https://git.odit.services/lfk/backend/commit/8e107fd206d3c7520fc566cc5f8570f1ea559f22) +- 🚀 CI build on feature branch tags [`a1c3751`](https://git.odit.services/lfk/backend/commit/a1c37511646bee7b626bc934f28bc655e1005dca) +- Added the runnerteam class [`ac40527`](https://git.odit.services/lfk/backend/commit/ac40527fa2997450f2e0685485bc7d91ca3e9bde) +- Added the runner org class [`66f7a79`](https://git.odit.services/lfk/backend/commit/66f7a7928c60ff6def7da2c7238de297d03d67e1) +- Now throwing errors [`77b7694`](https://git.odit.services/lfk/backend/commit/77b769446ff443cf0538fcdb9bbeb1b56932e881) +- Added finxed donations [`deae0bb`](https://git.odit.services/lfk/backend/commit/deae0bb84b02b2ddf18104b7e3181c05cf20ec35) +- Added the runner class [`5a04e61`](https://git.odit.services/lfk/backend/commit/5a04e61d1cb1583e2e496fbfcb5ba78c5be6dea1) +- Set env to node_env for the server [`f2efc4e`](https://git.odit.services/lfk/backend/commit/f2efc4e37b44f9eb68cd03713a17df7d93e2c550) +- Added createtrack model that omits the id from the track model [`e5562ef`](https://git.odit.services/lfk/backend/commit/e5562efe3545012cfcddff7707891fff3f05ff1d) +- Now w/ working logout [`ac2da0a`](https://git.odit.services/lfk/backend/commit/ac2da0af63d2d6fcd4436b03f61b4eac495c1959) +- 🚧tracks.spec.ts - check if track was added [`15e3d04`](https://git.odit.services/lfk/backend/commit/15e3d04215fdab899c0fc0b8aeeb77419c518f9b) +- Added donor [`b632c09`](https://git.odit.services/lfk/backend/commit/b632c09924bd3f1f42bfc0d3ed820d349576b13a) +- basic loaders logic [`ab0e925`](https://git.odit.services/lfk/backend/commit/ab0e925ab32e8e3700a551334a07d6cc2e8cf56f) +- Now w/ working cookie based refresh [`aca3eaa`](https://git.odit.services/lfk/backend/commit/aca3eaaeea482f3fbeeb8fc69e5e9a7c5297bbc5) +- Added more negative tests for the teams [`b4b5271`](https://git.odit.services/lfk/backend/commit/b4b52717fcbb40f0aaebb5c8372715e365342b8c) +- Fix for getting one [`204e235`](https://git.odit.services/lfk/backend/commit/204e2352a9a580a5579fad98ffcfb8cdb4683eab) +- Cleaned up up the middlewares [`1fb09e5`](https://git.odit.services/lfk/backend/commit/1fb09e577c539d8261afe4cc4a2cfae88b8f866b) +- Added relations for runners [`a6222a8`](https://git.odit.services/lfk/backend/commit/a6222a80251168153dd82b69a9eb65be87aaf3a8) +- Now creating (json)schemas from class validator annotated classes [`796b894`](https://git.odit.services/lfk/backend/commit/796b8942d89ccd57fd8b5a9cd85fdc0b13f59c80) +- first sample router - ref #4 [`0d1d3c5`](https://git.odit.services/lfk/backend/commit/0d1d3c593c3621082eaa17a951aff28fbd8b1aa0) +- Basic typreorm config [`abb5b44`](https://git.odit.services/lfk/backend/commit/abb5b443eaeaa5beeb078e9e7c03aadee8335500) +- Added relations to RunnerGroup [`f28b08e`](https://git.odit.services/lfk/backend/commit/f28b08ed654309305960f8f5a882b2f6d492bf1d) +- Now also serving the openapi [`9b2ea8c`](https://git.odit.services/lfk/backend/commit/9b2ea8c23c09621e5a84dbc013137ea150a4a2dc) +- Added pirst part of track model db connection [`203d95e`](https://git.odit.services/lfk/backend/commit/203d95ee1c6c5b54646c7950b7555c8675040448) +- Added simple tracks model [`d7b5563`](https://git.odit.services/lfk/backend/commit/d7b5563d0f04183ca5e88520eacfc5a18f3e18e1) +- 🚧 tracks.spec.ts - sample track adding + getting [`a671bf8`](https://git.odit.services/lfk/backend/commit/a671bf8bcbfee3af07d5f4b667d5484e69eb9afe) +- Added scan station relationship [`f32291d`](https://git.odit.services/lfk/backend/commit/f32291d7142ed262680e627832594984b901c7e4) +- Added relations for participants [`4075276`](https://git.odit.services/lfk/backend/commit/40752761302a043e8c974fe98bc57a865eedcb55) +- Added relationships for donation [`2b69391`](https://git.odit.services/lfk/backend/commit/2b693917b0d003165bed24d97d9218f5dc613d18) +- Added endpoint descriptions [`b267d87`](https://git.odit.services/lfk/backend/commit/b267d87ba66e19e61fc04a64dee5056e3cad91e5) +- removed husky [`6363595`](https://git.odit.services/lfk/backend/commit/63635956cee97bf00375e64deebc575364e46470) +- clean up initial route sample [`529ebb2`](https://git.odit.services/lfk/backend/commit/529ebb2a8f73c9a4941a639b913d05b2eeed8de1) +- move to node:14.15.1-alpine3.12 [`bcb266e`](https://git.odit.services/lfk/backend/commit/bcb266e29bee1a7fd0f978c5b9e3c5c7795d79fe) +- switched to custom clone logic [`553a35b`](https://git.odit.services/lfk/backend/commit/553a35bb8ec61f0bc6335b2eacd26df508db6f8d) +- testing branch parameter [`ef3fcee`](https://git.odit.services/lfk/backend/commit/ef3fcee2a9cb4dc29e26040f9a9039a1b135edb4) +- Added test for non-existant deletion [`6396fff`](https://git.odit.services/lfk/backend/commit/6396fffc045da75d15b84de66d1029b01f736d79) +- ✅ phone countrycode validation in env vars [`fcfc10f`](https://git.odit.services/lfk/backend/commit/fcfc10f7d123130a5abfb877035c0e073c885021) +- ⚙ use new config loader [`39cefbc`](https://git.odit.services/lfk/backend/commit/39cefbc593a057393c59de96d2b7153adb5ea7a5) +- Relations for distanceDonation [`1c43442`](https://git.odit.services/lfk/backend/commit/1c43442300b9287ed7148a0847bf1db7805e7f0b) +- vscode workspace settings.json [`b6ddda6`](https://git.odit.services/lfk/backend/commit/b6ddda6cd8ab5dc1ee37ba9bea6fcefd23648fdf) +- Added relations for Scans [`8e2eac9`](https://git.odit.services/lfk/backend/commit/8e2eac9dc07d99da7c150e393164e96fafcdc632) +- Added relations for RunnerTeams [`0d9d72c`](https://git.odit.services/lfk/backend/commit/0d9d72c223782310a86a20ef483d695b8845dbdd) +- Added relations to RunnerOrganisation [`7ac46a7`](https://git.odit.services/lfk/backend/commit/7ac46a7cc75618f5c01c46d3baee83c30d124124) +- Added relations for runner cards [`029e4be`](https://git.odit.services/lfk/backend/commit/029e4beaf545b2dacaeb272da7f0776cfc28b82d) +- Removed relation that was already implemented in the super [`4d593eb`](https://git.odit.services/lfk/backend/commit/4d593eb840f51d33746479a26787c30f5a3983f5) +- Cleaned up imports and descriptions [`748fff5`](https://git.odit.services/lfk/backend/commit/748fff5c323c63cdfe0c8e9260ca175d99194a6b) +- Added "/api" route prefix [`4e5e084`](https://git.odit.services/lfk/backend/commit/4e5e08483d1b63ae03dc6dbb16d3277cc12bbf8d) +- Switched to declaring the track route for the whole controller [`c85fdda`](https://git.odit.services/lfk/backend/commit/c85fddaa8e9dc60226db4ba45c33a2dc54465fca) +- Make the linter happier [`90136af`](https://git.odit.services/lfk/backend/commit/90136af516abc80703b5d7f063aa87c1c1082563) +- README - basic editor informations [`0dbac89`](https://git.odit.services/lfk/backend/commit/0dbac894a1e875b352ca93ffa80667f81d1338f0) +- Added ci env [`6cfaec8`](https://git.odit.services/lfk/backend/commit/6cfaec8397f184dd357779eddac2aca568634c25) +- ⚙ nodemon config - ignore tests [`4ff6f8c`](https://git.odit.services/lfk/backend/commit/4ff6f8c54007aa01b94f428eef0c6abdaa0c29ee) +- Added our branch structure to the readme [`5b4224b`](https://git.odit.services/lfk/backend/commit/5b4224b8f55b1125f0d13893606397fb6bfc7852) +- Added reflect-metadata - typeorm requires it [`27629fb`](https://git.odit.services/lfk/backend/commit/27629fbe3bbe039ef083d073795e9089a0e07d7b) +- Added test for getting an non-existant team [`f4abbfc`](https://git.odit.services/lfk/backend/commit/f4abbfcee4cc57ec826af594ef3bcd30868c81ab) +- Added group contact class [`96d70d5`](https://git.odit.services/lfk/backend/commit/96d70d5048b89324266f33468ab3a3ea4c771604) +- default to only jwt checking (empty @Authorized() ) [`37baa4e`](https://git.odit.services/lfk/backend/commit/37baa4ea45e64fce0cc5e14bbb29b7aabed22145) +- debugging [`cb5f5b9`](https://git.odit.services/lfk/backend/commit/cb5f5b9ecb9425566a4621a87499ab13b3eaad02) +- Moved cors to the routing-controller function [`24d890f`](https://git.odit.services/lfk/backend/commit/24d890f638b2298ac2588786897490797a405ee5) +- formatting [`f7d7f5e`](https://git.odit.services/lfk/backend/commit/f7d7f5e75f9693f68ed0cf387eb402c185bc1e1c) +- Added first db connection for a tack endpoint [`b5518d0`](https://git.odit.services/lfk/backend/commit/b5518d005ffb9ab5ce5d0244a66ab28ff3a61b0e) +- basic recommended editor extensions [`9ce6209`](https://git.odit.services/lfk/backend/commit/9ce6209cac397b22698e8a92ce6c9fe506d97f49) +- 🚧 implementation in AuthController@login [`36fbccb`](https://git.odit.services/lfk/backend/commit/36fbccb286331bb4226b336e14825e593413c50c) +- Now throwing errors to the next instance [`af1ad48`](https://git.odit.services/lfk/backend/commit/af1ad482d4dd9cf65cc2895896c19f0ecf9d879d) +- Updated file structure in readme [`60c1b5d`](https://git.odit.services/lfk/backend/commit/60c1b5d748e087c89e5ede66d352eb407394e8f0) +- Added basic file structure for routes, models and controllers [`8340cce`](https://git.odit.services/lfk/backend/commit/8340cce9977c291f945eee084d40239a06fc22c1) +- Updated tsconfig to work with await and node imports [`79f883f`](https://git.odit.services/lfk/backend/commit/79f883fc31862d1b1b90ba5ad055ee712a7ed4bf) +- sample ExpressJS code [`fb00f50`](https://git.odit.services/lfk/backend/commit/fb00f50adb81eaaaf90ca9c36fab12f930b712bb) +- Renamed some drone steps [skip-ci} [`c3aa88c`](https://git.odit.services/lfk/backend/commit/c3aa88c212a65789732708157f8c4c56c8d60c29) +- Added cookie-parser to app.use [`c07d40a`](https://git.odit.services/lfk/backend/commit/c07d40ae93581b48a4e5bd0e87e0d8a41c365ec6) +- integrate pm2 process manager to keep the app up and running [`8bcaf71`](https://git.odit.services/lfk/backend/commit/8bcaf710ad580d78a254dc89060f30c0395bbdf2) +- Updated folders in the readme [`5103e8a`](https://git.odit.services/lfk/backend/commit/5103e8a6e5db8a3484eae5710f8f4f7712cb8b14) +- Other classed are now using the new Address class rather than the old location placeholder [`dca9aef`](https://git.odit.services/lfk/backend/commit/dca9aef25842b6127e258475039d6c2e1bad99f7) +- Put now isn't allowed to change ids [`aef2f95`](https://git.odit.services/lfk/backend/commit/aef2f9562a0c585cd567175118996a1725edf28b) +- Added jsdoc style class documentation [`d2278fd`](https://git.odit.services/lfk/backend/commit/d2278fd248658504cba856542328851f4fc6d96b) +- Added update and delete function functionallity [`1d57f4a`](https://git.odit.services/lfk/backend/commit/1d57f4a8d9ba01059df407758bdc9606702bbaa2) +- dependency: body-parser, cors, helmet, sqlite3 (dev) [`5034cbf`](https://git.odit.services/lfk/backend/commit/5034cbfd936b84d52279113a3d8da7be2b34716b) +- Added dev setup description [`84fee8b`](https://git.odit.services/lfk/backend/commit/84fee8b19ae3c10ddfd06883816b59c4d7ccf620) +- drop unused packages [`a7e27c6`](https://git.odit.services/lfk/backend/commit/a7e27c6f6cf20c268a81d41cedfd8e81421fff21) +- Added dedicated clone step [`31e7d07`](https://git.odit.services/lfk/backend/commit/31e7d074dc1850e91d01c3f96a9b29c09f36a59d) +- Added sqlite testing db to ignores [`cfbf1ff`](https://git.odit.services/lfk/backend/commit/cfbf1ff8211f7c8e1f5bfc9231c2187b3b9d8c31) +- Added some fixxes for typeorm entities [`8791bed`](https://git.odit.services/lfk/backend/commit/8791bed4f9239979c526b09e917b779abbeeb978) +- Cleaned up some errors [`6aa1e0d`](https://git.odit.services/lfk/backend/commit/6aa1e0d573e01926de83c410da300e02d2d902ec) +- Removed secure flag and added expiry basd on ht refresh token [`615b54e`](https://git.odit.services/lfk/backend/commit/615b54ec4f12c79d4ced3c13eb159411087ed510) +- Set cookies to secure [`0e003d2`](https://git.odit.services/lfk/backend/commit/0e003d2dc4140f9200cb0d8906a7dcd77db53d50) +- Added source [`1fbddf5`](https://git.odit.services/lfk/backend/commit/1fbddf5ef83a7d40e249ce1bbabfb6913e90a875) +- Fixed typos [`5845a91`](https://git.odit.services/lfk/backend/commit/5845a91f15b6c660fd8707aaffef212ad380d94c) +- resolve groups + permissions [`2d603a1`](https://git.odit.services/lfk/backend/commit/2d603a1467eca50263a0ad2eea427e59da88d263) +- Renamed property, so it fits with the rest of the nameing [`084e2d9`](https://git.odit.services/lfk/backend/commit/084e2d99303ebf02f69782e647ce964649156d07) +- fixxed missing imports and commented out a non-implemented function call [`79eecbb`](https://git.odit.services/lfk/backend/commit/79eecbb329c1f7181558d8a2fc39b91179ec91cf) +- sample in TrackController [`c15b650`](https://git.odit.services/lfk/backend/commit/c15b6501819ec22870c67f16e3d306bd01364ac6) +- tsconfig not strict [`447f4d8`](https://git.odit.services/lfk/backend/commit/447f4d882f23d65598fd7847cc659fa82ae91ac2) +- remove prettier config [`f96f5a6`](https://git.odit.services/lfk/backend/commit/f96f5a63a42dd84181b014ee0e638d519329380f) +- Now creating db schemas [`b5cf040`](https://git.odit.services/lfk/backend/commit/b5cf040cf0975f3a1e5ba60e8c34bbd23bc97c91) +- Switched to export default exports [`e58da2a`](https://git.odit.services/lfk/backend/commit/e58da2a22b98dc63d0982a5dad4fb94653038f2e) +- license update - move to CC BY-NC-SA 4.0 [`5e059cb`](https://git.odit.services/lfk/backend/commit/5e059cbc2a93e19a1d560915ce23312baecb19f0) +- 🩺❤🐳 Docker healthcheck [`95f40a9`](https://git.odit.services/lfk/backend/commit/95f40a9c287745dc7ccffc792f8880ff17cbc515) +- package.json - drop nodemon delay [`5ccdfe1`](https://git.odit.services/lfk/backend/commit/5ccdfe154025fde523fe30986df9ab38a4c87893) +- 🐞 fixed app.ts for production use [`a1e3289`](https://git.odit.services/lfk/backend/commit/a1e3289a88a61ee0bf574f5c674ee4ea6c06a9f8) +- Test for branch restrictions [`7a79f35`](https://git.odit.services/lfk/backend/commit/7a79f35b58eb4c1e9cf7a6bca559bdb396212fef) +- ⚡test:watch script [`34567f2`](https://git.odit.services/lfk/backend/commit/34567f24c3311ed6a0d5f1e0ea52eb8cbaff8904) +- Fixed import [`abf7aae`](https://git.odit.services/lfk/backend/commit/abf7aaeda3a39aecac98756c19b275405d869cb5) +- Changed the distance to be an abstract [`df3715d`](https://git.odit.services/lfk/backend/commit/df3715d8d67ea2506d541fe2418cd1a5bff77e8f) +- Marked amount as abstract [`a8d1ec6`](https://git.odit.services/lfk/backend/commit/a8d1ec6f9b3a3a4673945de9143b299cac1933f8) +- Amount no longer is a column by default [`daea056`](https://git.odit.services/lfk/backend/commit/daea0568a8da9dd661779510ab328175d6f790f2) +- Added todo's for relationships [`72f8085`](https://git.odit.services/lfk/backend/commit/72f80859a974086ba354b48058844d12def937dd) +- Now importing entities from src/models [`40d7d44`](https://git.odit.services/lfk/backend/commit/40d7d447308d0c135ee92171c8d2d445796137d9) +- gitignore /build folder - ref #1 [`f854f13`](https://git.odit.services/lfk/backend/commit/f854f137e579c4498d2a144b7f8f8c833d485d2d) +- tsc building script [`0b92d82`](https://git.odit.services/lfk/backend/commit/0b92d82a5ba64358a4eda4dc88475a9b2f156654) +- Switched to installing all dependencies [`16769b1`](https://git.odit.services/lfk/backend/commit/16769b19782960a8ad835a10c8c2c3095df73c9c) +- Added dotenv-save types [`a5fc6dd`](https://git.odit.services/lfk/backend/commit/a5fc6dd2340cd9fb09061e83cfc54982f50cdd59) +- Fixed broken substitution [`ad908a3`](https://git.odit.services/lfk/backend/commit/ad908a3555e430073d3a43ab6d9d7cd429840116) +- More switching [`e59630b`](https://git.odit.services/lfk/backend/commit/e59630b17e663723bb52b3153d3fd46cc464e693) +- Added lib to gitignore [`f304b86`](https://git.odit.services/lfk/backend/commit/f304b86cb61b88e4c51a5f2ae19e874d36a00068) +- Switched env to dev for tests(ci) [`c321da6`](https://git.odit.services/lfk/backend/commit/c321da613a4cdb87fd2df14c1f4c245e4228870a) +- Switched to prefering body provided tokens over cookie tokens [`3092818`](https://git.odit.services/lfk/backend/commit/30928180e63ad0dbfcf1a94440fc0a6ebd6394f1) +- 🚧 move sqlite to to production [`e398009`](https://git.odit.services/lfk/backend/commit/e3980096e279fa3d884a3688663d7e934f290b32) +- switched to using the ci testing script [`0f41962`](https://git.odit.services/lfk/backend/commit/0f419625d26c7727b20124f7d413c7d42262e500) +- fixed typo [`a83a23a`](https://git.odit.services/lfk/backend/commit/a83a23a64751db583b693892d83852e0f356a984) +- renamed step [`61b2baa`](https://git.odit.services/lfk/backend/commit/61b2baaee71bee52c3c5209f4828a2efb4bb66eb) +- send empty array for user permissions if null [`02236ca`](https://git.odit.services/lfk/backend/commit/02236caa413c3a374c62a30d9cfe0e77e1cb4c91) +- Removed relations resolution that broke the update [`e4cb8eb`](https://git.odit.services/lfk/backend/commit/e4cb8eba1d7a4e7623ebf38d84227752c84d1ead) +- Renamed to better fit the content [`6da7c23`](https://git.odit.services/lfk/backend/commit/6da7c23c04df1148ac79646c362acfaaba3ffd77) +- Fixxed missing plural [`4df63a8`](https://git.odit.services/lfk/backend/commit/4df63a8cc0c1346dda6758bf5aa20f939dc64ade) +- Renamed getter [`d0a1ea3`](https://git.odit.services/lfk/backend/commit/d0a1ea3292cf7c033d24a39ba6fdccde3c0f4022) +- Fixed copy-paste slip up [`7ce8c37`](https://git.odit.services/lfk/backend/commit/7ce8c375a2cf6aceab827d69aaa9b2835a71a5f6) +- Extended error message [`2649965`](https://git.odit.services/lfk/backend/commit/26499658a48cdb475058d1102c5be531f66beb5d) +- Fixed wrong type [`27462b0`](https://git.odit.services/lfk/backend/commit/27462b061538210acc494b151d5d6c88b8d99474) +- Loading db first [`4151f05`](https://git.odit.services/lfk/backend/commit/4151f05c2484a77d61972442b5409e60a59db526) +- Changed type to const [`29979a3`](https://git.odit.services/lfk/backend/commit/29979a37ab2bbd2559050a2dc6096142568c5a7f) +- imported bodyparser [`e3883fe`](https://git.odit.services/lfk/backend/commit/e3883fecbd93f241effbd9462080cd618376a37e) +- added jsonwebtoken dependency [`03a4898`](https://git.odit.services/lfk/backend/commit/03a4898553557e5f02c785429108c438a9e62674) +- Added libs for databases: postgres and mysql [`6c5c61b`](https://git.odit.services/lfk/backend/commit/6c5c61b1e8eed3b76ae5e6ffbaf5aacf3bb2e87b) +- dotenv-safe usage [`e764fcb`](https://git.odit.services/lfk/backend/commit/e764fcbfe916b36e2fbc4677c84130997fe59ea8) +- Switched to dotenv-save [`36d2573`](https://git.odit.services/lfk/backend/commit/36d25732eaa18a83c6d65f36422a1921cf7933af) +- Removed useless return [`db5da3d`](https://git.odit.services/lfk/backend/commit/db5da3d3c25a687d301da5b6aa28daff8cb0c5f4) +- Removed console logging only used for dev [`65f995c`](https://git.odit.services/lfk/backend/commit/65f995cb9fe27b142437d3b83b0fcc7e03c2d6b9) +- 🚧 User class WIP [`d47983a`](https://git.odit.services/lfk/backend/commit/d47983a032c5bb4d4b2958cc013df0b92ece2844) +- remove @types/helmet [`f527cad`](https://git.odit.services/lfk/backend/commit/f527cad186b199f7e5e80f38f0bc142dacf16457) +- added consola dependency [`6b46a0a`](https://git.odit.services/lfk/backend/commit/6b46a0a69e85f7cac7fdd848bbae7dd9353c7c2f) +- add @types/dotenv-safe [`a5cae04`](https://git.odit.services/lfk/backend/commit/a5cae044ed6fd018447531bf11ae19b6137b4938) +- Renamed b/c runner teams also need dedicated tests [`7606553`](https://git.odit.services/lfk/backend/commit/76065538c9cf55008879bf9bbe49ede5bbd51749) diff --git a/package.json b/package.json index a6f868c..aa13d94 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@odit/lfk-backend", - "version": "0.0.11", + "version": "0.0.12", "main": "src/app.ts", "repository": "https://git.odit.services/lfk/backend", "author": { @@ -78,16 +78,16 @@ "seed": "ts-node ./node_modules/typeorm/cli.js schema:sync && ts-node ./node_modules/typeorm-seeding/dist/cli.js seed", "openapi:export": "ts-node scripts/openapi_export.ts", "licenses:export": "license-exporter --md", - "release": "release-it" + "release": "release-it --only-version" }, "release-it": { "git": { + "commit": true, "requireCleanWorkingDir": false, - "requireBranch": "main", + "commitMessage": "🚀Bumped version to v${version}", + "requireBranch": "dev", "push": false, - "tag": true, - "tagName": "v${version}", - "tagAnnotation": "v${version}" + "tag": false }, "npm": { "publish": false @@ -99,4 +99,4 @@ "docs/*" ] } -} \ No newline at end of file +} diff --git a/src/apispec.ts b/src/apispec.ts index f0a6d85..de38236 100644 --- a/src/apispec.ts +++ b/src/apispec.ts @@ -1,5 +1,6 @@ import { MetadataArgsStorage } from 'routing-controllers'; import { routingControllersToSpec } from 'routing-controllers-openapi'; +import { config } from './config'; /** * This function generates a the openapi spec from route metadata and type schemas. @@ -43,7 +44,7 @@ export function generateSpec(storage: MetadataArgsStorage, schemas) { info: { description: "The the backend API for the LfK! runner system.", title: "LfK! Backend API", - version: process.env.npm_package_version + version: config.version }, } ); diff --git a/src/config.ts b/src/config.ts index 8729b6e..2e01f0e 100644 --- a/src/config.ts +++ b/src/config.ts @@ -7,7 +7,8 @@ export const config = { development: process.env.NODE_ENV === "production", jwt_secret: process.env.JWT_SECRET || "secretjwtsecret", phone_validation_countrycode: process.env.PHONE_COUNTRYCODE || "ZZ", - postalcode_validation_countrycode: getPostalCodeLocale() + postalcode_validation_countrycode: getPostalCodeLocale(), + version: process.env.VERSION || require('../package.json').version } let errors = 0 if (typeof config.internal_port !== "number") { diff --git a/src/controllers/DonationController.ts b/src/controllers/DonationController.ts new file mode 100644 index 0000000..9c2696d --- /dev/null +++ b/src/controllers/DonationController.ts @@ -0,0 +1,145 @@ +import { Authorized, Body, Delete, Get, JsonController, OnUndefined, Param, Post, Put, QueryParam } from 'routing-controllers'; +import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi'; +import { getConnectionManager, Repository } from 'typeorm'; +import { DonationIdsNotMatchingError, DonationNotFoundError } from '../errors/DonationErrors'; +import { DonorNotFoundError } from '../errors/DonorErrors'; +import { RunnerNotFoundError } from '../errors/RunnerErrors'; +import { CreateDistanceDonation } from '../models/actions/create/CreateDistanceDonation'; +import { CreateFixedDonation } from '../models/actions/create/CreateFixedDonation'; +import { UpdateDistanceDonation } from '../models/actions/update/UpdateDistanceDonation'; +import { UpdateFixedDonation } from '../models/actions/update/UpdateFixedDonation'; +import { DistanceDonation } from '../models/entities/DistanceDonation'; +import { Donation } from '../models/entities/Donation'; +import { FixedDonation } from '../models/entities/FixedDonation'; +import { ResponseDistanceDonation } from '../models/responses/ResponseDistanceDonation'; +import { ResponseDonation } from '../models/responses/ResponseDonation'; +import { ResponseEmpty } from '../models/responses/ResponseEmpty'; + +@JsonController('/donations') +@OpenAPI({ security: [{ "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) +export class DonationController { + private donationRepository: Repository; + private distanceDonationRepository: Repository; + private fixedDonationRepository: Repository; + + /** + * Gets the repository of this controller's model/entity. + */ + constructor() { + this.donationRepository = getConnectionManager().get().getRepository(Donation); + this.distanceDonationRepository = getConnectionManager().get().getRepository(DistanceDonation); + this.fixedDonationRepository = getConnectionManager().get().getRepository(FixedDonation); + } + + @Get() + @Authorized("DONATION:GET") + @ResponseSchema(ResponseDonation, { isArray: true }) + @ResponseSchema(ResponseDistanceDonation, { isArray: true }) + @OpenAPI({ description: 'Lists all donations (fixed or distance based) from all donors.
This includes the donations\'s runner\'s distance ran(if distance donation).' }) + async getAll() { + let responseDonations: ResponseDonation[] = new Array(); + const donations = await this.donationRepository.find({ relations: ['runner', 'donor', 'runner.scans', 'runner.scans.track'] }); + donations.forEach(donation => { + responseDonations.push(donation.toResponse()); + }); + return responseDonations; + } + + @Get('/:id') + @Authorized("DONATION:GET") + @ResponseSchema(ResponseDonation) + @ResponseSchema(ResponseDistanceDonation) + @ResponseSchema(DonationNotFoundError, { statusCode: 404 }) + @OnUndefined(DonationNotFoundError) + @OpenAPI({ description: 'Lists all information about the donation whose id got provided. This includes the donation\'s runner\'s distance ran (if distance donation).' }) + async getOne(@Param('id') id: number) { + let donation = await this.donationRepository.findOne({ id: id }, { relations: ['runner', 'donor', 'runner.scans', 'runner.scans.track'] }) + if (!donation) { throw new DonationNotFoundError(); } + return donation.toResponse(); + } + + @Post('/fixed') + @Authorized("DONATION:CREATE") + @ResponseSchema(ResponseDonation) + @ResponseSchema(DonorNotFoundError, { statusCode: 404 }) + @OpenAPI({ description: 'Create a fixed donation (not distance donation - use /donations/distance instead).
Please rmemember to provide the donation\'s donors\'s id and amount.' }) + async postFixed(@Body({ validate: true }) createDonation: CreateFixedDonation) { + let donation = await createDonation.toEntity(); + donation = await this.fixedDonationRepository.save(donation); + return (await this.donationRepository.findOne({ id: donation.id }, { relations: ['donor'] })).toResponse(); + } + + @Post('/distance') + @Authorized("DONATION:CREATE") + @ResponseSchema(ResponseDistanceDonation) + @ResponseSchema(DonorNotFoundError, { statusCode: 404 }) + @ResponseSchema(RunnerNotFoundError, { statusCode: 404 }) + @OpenAPI({ description: 'Create a distance donation (not fixed donation - use /donations/fixed instead).
Please rmemember to provide the donation\'s donors\'s and runner\s ids and amount per distance (kilometer).' }) + async postDistance(@Body({ validate: true }) createDonation: CreateDistanceDonation) { + let donation = await createDonation.toEntity(); + donation = await this.distanceDonationRepository.save(donation); + return (await this.donationRepository.findOne({ id: donation.id }, { relations: ['runner', 'donor', 'runner.scans', 'runner.scans.track'] })).toResponse(); + } + + @Put('/fixed/:id') + @Authorized("DONATION:UPDATE") + @ResponseSchema(ResponseDonation) + @ResponseSchema(DonationNotFoundError, { statusCode: 404 }) + @ResponseSchema(DonorNotFoundError, { statusCode: 404 }) + @ResponseSchema(RunnerNotFoundError, { statusCode: 404 }) + @ResponseSchema(DonationIdsNotMatchingError, { statusCode: 406 }) + @OpenAPI({ description: "Update the fixed donation (not distance donation - use /donations/distance instead) whose id you provided.
Please remember that ids can't be changed and amounts must be positive." }) + async putFixed(@Param('id') id: number, @Body({ validate: true }) donation: UpdateFixedDonation) { + let oldDonation = await this.fixedDonationRepository.findOne({ id: id }); + + if (!oldDonation) { + throw new DonationNotFoundError(); + } + + if (oldDonation.id != donation.id) { + throw new DonationIdsNotMatchingError(); + } + + await this.fixedDonationRepository.save(await donation.update(oldDonation)); + return (await this.donationRepository.findOne({ id: donation.id }, { relations: ['donor'] })).toResponse(); + } + + @Put('/distance/:id') + @Authorized("DONATION:UPDATE") + @ResponseSchema(ResponseDonation) + @ResponseSchema(DonationNotFoundError, { statusCode: 404 }) + @ResponseSchema(DonorNotFoundError, { statusCode: 404 }) + @ResponseSchema(RunnerNotFoundError, { statusCode: 404 }) + @ResponseSchema(DonationIdsNotMatchingError, { statusCode: 406 }) + @OpenAPI({ description: "Update the distance donation (not fixed donation - use /donations/fixed instead) whose id you provided.
Please remember that ids can't be changed and amountPerDistance must be positive." }) + async putDistance(@Param('id') id: number, @Body({ validate: true }) donation: UpdateDistanceDonation) { + let oldDonation = await this.distanceDonationRepository.findOne({ id: id }); + + if (!oldDonation) { + throw new DonationNotFoundError(); + } + + if (oldDonation.id != donation.id) { + throw new DonationIdsNotMatchingError(); + } + + await this.distanceDonationRepository.save(await donation.update(oldDonation)); + return (await this.donationRepository.findOne({ id: donation.id }, { relations: ['runner', 'donor', 'runner.scans', 'runner.scans.track'] })).toResponse(); + } + + @Delete('/:id') + @Authorized("DONATION:DELETE") + @ResponseSchema(ResponseDonation) + @ResponseSchema(ResponseDistanceDonation) + @ResponseSchema(ResponseEmpty, { statusCode: 204 }) + @OnUndefined(204) + @OpenAPI({ description: 'Delete the donation whose id you provided.
If no donation with this id exists it will just return 204(no content).' }) + async remove(@Param("id") id: number, @QueryParam("force") force: boolean) { + let donation = await this.donationRepository.findOne({ id: id }); + if (!donation) { return null; } + const responseScan = await this.donationRepository.findOne({ id: donation.id }, { relations: ['runner', 'donor', 'runner.scans', 'runner.scans.track'] }); + + await this.donationRepository.delete(donation); + return responseScan.toResponse(); + } +} diff --git a/src/controllers/DonorController.ts b/src/controllers/DonorController.ts index f6b8527..4b0d508 100644 --- a/src/controllers/DonorController.ts +++ b/src/controllers/DonorController.ts @@ -1,12 +1,13 @@ import { Authorized, Body, Delete, Get, JsonController, OnUndefined, Param, Post, Put, QueryParam } from 'routing-controllers'; import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi'; import { getConnectionManager, Repository } from 'typeorm'; -import { DonorIdsNotMatchingError, DonorNotFoundError } from '../errors/DonorErrors'; +import { DonorHasDonationsError, DonorIdsNotMatchingError, DonorNotFoundError } from '../errors/DonorErrors'; import { CreateDonor } from '../models/actions/create/CreateDonor'; import { UpdateDonor } from '../models/actions/update/UpdateDonor'; import { Donor } from '../models/entities/Donor'; import { ResponseDonor } from '../models/responses/ResponseDonor'; import { ResponseEmpty } from '../models/responses/ResponseEmpty'; +import { DonationController } from './DonationController'; @JsonController('/donors') @OpenAPI({ security: [{ "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) @@ -23,10 +24,10 @@ export class DonorController { @Get() @Authorized("DONOR:GET") @ResponseSchema(ResponseDonor, { isArray: true }) - @OpenAPI({ description: 'Lists all runners from all teams/orgs.
This includes the runner\'s group and distance ran.' }) + @OpenAPI({ description: 'Lists all donor.
This includes the donor\'s current donation amount.' }) async getAll() { let responseDonors: ResponseDonor[] = new Array(); - const donors = await this.donorRepository.find(); + const donors = await this.donorRepository.find({ relations: ['donations', 'donations.runner', 'donations.runner.scans', 'donations.runner.scans.track'] }); donors.forEach(donor => { responseDonors.push(new ResponseDonor(donor)); }); @@ -38,9 +39,9 @@ export class DonorController { @ResponseSchema(ResponseDonor) @ResponseSchema(DonorNotFoundError, { statusCode: 404 }) @OnUndefined(DonorNotFoundError) - @OpenAPI({ description: 'Lists all information about the runner whose id got provided.' }) + @OpenAPI({ description: 'Lists all information about the donor whose id got provided.
This includes the donor\'s current donation amount.' }) async getOne(@Param('id') id: number) { - let donor = await this.donorRepository.findOne({ id: id }) + let donor = await this.donorRepository.findOne({ id: id }, { relations: ['donations', 'donations.runner', 'donations.runner.scans', 'donations.runner.scans.track'] }) if (!donor) { throw new DonorNotFoundError(); } return new ResponseDonor(donor); } @@ -48,7 +49,7 @@ export class DonorController { @Post() @Authorized("DONOR:CREATE") @ResponseSchema(ResponseDonor) - @OpenAPI({ description: 'Create a new runner.
Please remeber to provide the runner\'s group\'s id.' }) + @OpenAPI({ description: 'Create a new donor.' }) async post(@Body({ validate: true }) createRunner: CreateDonor) { let donor; try { @@ -58,7 +59,7 @@ export class DonorController { } donor = await this.donorRepository.save(donor) - return new ResponseDonor(await this.donorRepository.findOne(donor)); + return new ResponseDonor(await this.donorRepository.findOne(donor, { relations: ['donations', 'donations.runner', 'donations.runner.scans', 'donations.runner.scans.track'] })); } @Put('/:id') @@ -66,7 +67,7 @@ export class DonorController { @ResponseSchema(ResponseDonor) @ResponseSchema(DonorNotFoundError, { statusCode: 404 }) @ResponseSchema(DonorIdsNotMatchingError, { statusCode: 406 }) - @OpenAPI({ description: "Update the runner whose id you provided.
Please remember that ids can't be changed." }) + @OpenAPI({ description: "Update the donor whose id you provided.
Please remember that ids can't be changed." }) async put(@Param('id') id: number, @Body({ validate: true }) donor: UpdateDonor) { let oldDonor = await this.donorRepository.findOne({ id: id }); @@ -79,7 +80,7 @@ export class DonorController { } await this.donorRepository.save(await donor.update(oldDonor)); - return new ResponseDonor(await this.donorRepository.findOne({ id: id })); + return new ResponseDonor(await this.donorRepository.findOne({ id: id }, { relations: ['donations', 'donations.runner', 'donations.runner.scans', 'donations.runner.scans.track'] })); } @Delete('/:id') @@ -87,17 +88,24 @@ export class DonorController { @ResponseSchema(ResponseDonor) @ResponseSchema(ResponseEmpty, { statusCode: 204 }) @OnUndefined(204) - @OpenAPI({ description: 'Delete the runner whose id you provided.
If no runner with this id exists it will just return 204(no content).' }) + @OpenAPI({ description: 'Delete the donor whose id you provided.
If no donor with this id exists it will just return 204(no content).
If the donor still has donations associated this will fail, please provide the query param ?force=true to delete the donor with all associated donations.' }) async remove(@Param("id") id: number, @QueryParam("force") force: boolean) { let donor = await this.donorRepository.findOne({ id: id }); if (!donor) { return null; } - const responseDonor = await this.donorRepository.findOne(donor); + const responseDonor = await this.donorRepository.findOne(donor, { relations: ['donations', 'donations.runner', 'donations.runner.scans', 'donations.runner.scans.track'] }); if (!donor) { throw new DonorNotFoundError(); } - //TODO: DELETE DONATIONS AND WARN FOR FORCE (https://git.odit.services/lfk/backend/issues/66) + const donorDonations = (await this.donorRepository.findOne({ id: donor.id }, { relations: ["donations"] })).donations; + if (donorDonations.length > 0 && !force) { + throw new DonorHasDonationsError(); + } + const donationController = new DonationController(); + for (let donation of donorDonations) { + await donationController.remove(donation.id, force); + } await this.donorRepository.delete(donor); return new ResponseDonor(responseDonor); diff --git a/src/controllers/RunnerController.ts b/src/controllers/RunnerController.ts index 2d83a02..389697b 100644 --- a/src/controllers/RunnerController.ts +++ b/src/controllers/RunnerController.ts @@ -1,13 +1,14 @@ import { Authorized, Body, Delete, Get, JsonController, OnUndefined, Param, Post, Put, QueryParam } from 'routing-controllers'; import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi'; import { getConnectionManager, Repository } from 'typeorm'; -import { RunnerGroupNeededError, RunnerIdsNotMatchingError, RunnerNotFoundError } from '../errors/RunnerErrors'; +import { RunnerGroupNeededError, RunnerHasDistanceDonationsError, RunnerIdsNotMatchingError, RunnerNotFoundError } from '../errors/RunnerErrors'; import { RunnerGroupNotFoundError } from '../errors/RunnerGroupErrors'; import { CreateRunner } from '../models/actions/create/CreateRunner'; import { UpdateRunner } from '../models/actions/update/UpdateRunner'; import { Runner } from '../models/entities/Runner'; import { ResponseEmpty } from '../models/responses/ResponseEmpty'; import { ResponseRunner } from '../models/responses/ResponseRunner'; +import { DonationController } from './DonationController'; import { RunnerCardController } from './RunnerCardController'; import { ScanController } from './ScanController'; @@ -91,6 +92,7 @@ export class RunnerController { @Authorized("RUNNER:DELETE") @ResponseSchema(ResponseRunner) @ResponseSchema(ResponseEmpty, { statusCode: 204 }) + @ResponseSchema(RunnerHasDistanceDonationsError, { statusCode: 406 }) @OnUndefined(204) @OpenAPI({ description: 'Delete the runner whose id you provided.
This will also delete all scans and cards associated with the runner.
If no runner with this id exists it will just return 204(no content).' }) async remove(@Param("id") id: number, @QueryParam("force") force: boolean) { @@ -102,10 +104,19 @@ export class RunnerController { throw new RunnerNotFoundError(); } + const runnerDonations = (await this.runnerRepository.findOne({ id: runner.id }, { relations: ["distanceDonations"] })).distanceDonations; + if (runnerDonations.length > 0 && !force) { + throw new RunnerHasDistanceDonationsError(); + } + const donationController = new DonationController(); + for (let donation of runnerDonations) { + await donationController.remove(donation.id, force); + } + const runnerCards = (await this.runnerRepository.findOne({ id: runner.id }, { relations: ["cards"] })).cards; const cardController = new RunnerCardController; - for (let scan of runnerCards) { - await cardController.remove(scan.id, force); + for (let card of runnerCards) { + await cardController.remove(card.id, force); } const runnerScans = (await this.runnerRepository.findOne({ id: runner.id }, { relations: ["scans"] })).scans; diff --git a/src/controllers/StatusController.ts b/src/controllers/StatusController.ts index b867429..9f83c26 100644 --- a/src/controllers/StatusController.ts +++ b/src/controllers/StatusController.ts @@ -1,11 +1,12 @@ import { Get, JsonController } from 'routing-controllers'; import { OpenAPI } from 'routing-controllers-openapi'; import { getConnection } from 'typeorm'; +import { config } from '../config'; -@JsonController('/status') +@JsonController() export class StatusController { - @Get() + @Get('/status') @OpenAPI({ description: "A very basic status/health endpoint that just checks if the database connection is available.
The available information depth will be expanded later." }) get() { let connection; @@ -19,4 +20,12 @@ export class StatusController { "database connection": "✔" }; } + + @Get('/version') + @OpenAPI({ description: "A very basic endpoint that just returns the curent package version." }) + getVersion() { + return { + "version": config.version + } + } } \ No newline at end of file diff --git a/src/controllers/UserController.ts b/src/controllers/UserController.ts index 57083db..846653f 100644 --- a/src/controllers/UserController.ts +++ b/src/controllers/UserController.ts @@ -1,13 +1,14 @@ import { Authorized, Body, Delete, Get, JsonController, OnUndefined, Param, Post, Put, QueryParam } from 'routing-controllers'; import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi'; import { getConnectionManager, Repository } from 'typeorm'; -import { UserIdsNotMatchingError, UserNotFoundError } from '../errors/UserErrors'; +import { UserIdsNotMatchingError, UsernameContainsIllegalCharacterError, UserNotFoundError } from '../errors/UserErrors'; import { UserGroupNotFoundError } from '../errors/UserGroupErrors'; import { CreateUser } from '../models/actions/create/CreateUser'; import { UpdateUser } from '../models/actions/update/UpdateUser'; import { User } from '../models/entities/User'; import { ResponseEmpty } from '../models/responses/ResponseEmpty'; import { ResponseUser } from '../models/responses/ResponseUser'; +import { ResponseUserPermissions } from '../models/responses/ResponseUserPermissions'; import { PermissionController } from './PermissionController'; @@ -26,7 +27,7 @@ export class UserController { @Get() @Authorized("USER:GET") @ResponseSchema(ResponseUser, { isArray: true }) - @OpenAPI({ description: 'Lists all users.
This includes their groups and permissions directly granted to them (if existing/associated).' }) + @OpenAPI({ description: 'Lists all users.
This includes their groups and permissions granted to them.' }) async getAll() { let responseUsers: ResponseUser[] = new Array(); const users = await this.userRepository.find({ relations: ['permissions', 'groups', 'groups.permissions'] }); @@ -41,17 +42,30 @@ export class UserController { @ResponseSchema(ResponseUser) @ResponseSchema(UserNotFoundError, { statusCode: 404 }) @OnUndefined(UserNotFoundError) - @OpenAPI({ description: 'Lists all information about the user whose id got provided.
Please remember that only permissions granted directly to the user will show up here, not permissions inherited from groups.' }) + @OpenAPI({ description: 'Lists all information about the user whose id got provided.
Please remember that all permissions granted to the user will show up here.' }) async getOne(@Param('id') id: number) { let user = await this.userRepository.findOne({ id: id }, { relations: ['permissions', 'groups', 'groups.permissions'] }) if (!user) { throw new UserNotFoundError(); } return new ResponseUser(user); } + @Get('/:id/permissions') + @Authorized("USER:GET") + @ResponseSchema(ResponseUser) + @ResponseSchema(UserNotFoundError, { statusCode: 404 }) + @OnUndefined(UserNotFoundError) + @OpenAPI({ description: 'Lists all permissions granted to the user sorted into directly granted and inherited as permission response objects.' }) + async getPermissions(@Param('id') id: number) { + let user = await this.userRepository.findOne({ id: id }, { relations: ['permissions', 'groups', 'groups.permissions', 'permissions.principal', 'groups.permissions.principal'] }) + if (!user) { throw new UserNotFoundError(); } + return new ResponseUserPermissions(user); + } + @Post() @Authorized("USER:CREATE") @ResponseSchema(ResponseUser) - @ResponseSchema(UserGroupNotFoundError) + @ResponseSchema(UserGroupNotFoundError, { statusCode: 404 }) + @ResponseSchema(UsernameContainsIllegalCharacterError, { statusCode: 406 }) @OpenAPI({ description: 'Create a new user.
If you want to grant permissions to the user you have to create them seperately by posting to /api/permissions after creating the user.' }) async post(@Body({ validate: true }) createUser: CreateUser) { let user; @@ -62,7 +76,7 @@ export class UserController { } user = await this.userRepository.save(user) - return new ResponseUser(await this.userRepository.findOne({ id: user.id }, { relations: ['permissions', 'groups'] })); + return new ResponseUser(await this.userRepository.findOne({ id: user.id }, { relations: ['permissions', 'groups', 'groups.permissions'] })); } @Put('/:id') @@ -70,6 +84,7 @@ export class UserController { @ResponseSchema(ResponseUser) @ResponseSchema(UserNotFoundError, { statusCode: 404 }) @ResponseSchema(UserIdsNotMatchingError, { statusCode: 406 }) + @ResponseSchema(UsernameContainsIllegalCharacterError, { statusCode: 406 }) @OpenAPI({ description: "Update the user whose id you provided.
To change the permissions directly granted to the user please use /api/permissions instead.
Please remember that ids can't be changed." }) async put(@Param('id') id: number, @Body({ validate: true }) updateUser: UpdateUser) { let oldUser = await this.userRepository.findOne({ id: id }); @@ -83,7 +98,7 @@ export class UserController { } await this.userRepository.save(await updateUser.update(oldUser)); - return new ResponseUser(await this.userRepository.findOne({ id: id }, { relations: ['permissions', 'groups'] })); + return new ResponseUser(await this.userRepository.findOne({ id: id }, { relations: ['permissions', 'groups', 'groups.permissions'] })); } @Delete('/:id') @@ -95,7 +110,7 @@ export class UserController { async remove(@Param("id") id: number, @QueryParam("force") force: boolean) { let user = await this.userRepository.findOne({ id: id }); if (!user) { return null; } - const responseUser = await this.userRepository.findOne({ id: id }, { relations: ['permissions', 'groups'] });; + const responseUser = await this.userRepository.findOne({ id: id }, { relations: ['permissions', 'groups', 'groups.permissions'] });; const permissionControler = new PermissionController(); for (let permission of responseUser.permissions) { diff --git a/src/errors/DonationErrors.ts b/src/errors/DonationErrors.ts new file mode 100644 index 0000000..2c69800 --- /dev/null +++ b/src/errors/DonationErrors.ts @@ -0,0 +1,25 @@ +import { IsString } from 'class-validator'; +import { NotAcceptableError, NotFoundError } from 'routing-controllers'; + +/** + * Error to throw when a Donation couldn't be found. + */ +export class DonationNotFoundError extends NotFoundError { + @IsString() + name = "DonationNotFoundError" + + @IsString() + message = "Donation not found!" +} + +/** + * Error to throw when two Donations' ids don't match. + * Usually occurs when a user tries to change a Donation's id. + */ +export class DonationIdsNotMatchingError extends NotAcceptableError { + @IsString() + name = "DonationIdsNotMatchingError" + + @IsString() + message = "The ids don't match! \n And if you wanted to change a Donation's id: This isn't allowed!" +} \ No newline at end of file diff --git a/src/errors/DonorErrors.ts b/src/errors/DonorErrors.ts index 0cd534e..bdf505a 100644 --- a/src/errors/DonorErrors.ts +++ b/src/errors/DonorErrors.ts @@ -33,4 +33,15 @@ export class DonorReceiptAddressNeededError extends NotAcceptableError { @IsString() message = "An address is needed to create a receipt for a donor. \n You didn't provide one." +} + +/** +* Error to throw when a donor still has donations associated. +*/ +export class DonorHasDonationsError extends NotAcceptableError { + @IsString() + name = "DonorHasDonationsError" + + @IsString() + message = "This donor still has donations associated with it. \n If you want to delete this donor with all it's donations and teams add `?force` to your query." } \ No newline at end of file diff --git a/src/errors/RunnerErrors.ts b/src/errors/RunnerErrors.ts index b60a70d..4dad85f 100644 --- a/src/errors/RunnerErrors.ts +++ b/src/errors/RunnerErrors.ts @@ -33,4 +33,15 @@ export class RunnerGroupNeededError extends NotAcceptableError { @IsString() message = "Runner's need to be part of one group (team or organisation)! \n You provided neither." +} + +/** +* Error to throw when a runner still has distance donations associated. +*/ +export class RunnerHasDistanceDonationsError extends NotAcceptableError { + @IsString() + name = "RunnerHasDistanceDonationsError" + + @IsString() + message = "This runner still has distance donations associated with it. \n If you want to delete this runner with all it's donations and teams add `?force` to your query." } \ No newline at end of file diff --git a/src/errors/UserErrors.ts b/src/errors/UserErrors.ts index 37f2987..5d2b659 100644 --- a/src/errors/UserErrors.ts +++ b/src/errors/UserErrors.ts @@ -4,7 +4,7 @@ import { NotAcceptableError, NotFoundError } from 'routing-controllers'; /** * Error to throw when no username or email is set. - * We somehow need to identify you :) + * We somehow need to identify you on login. */ export class UsernameOrEmailNeededError extends NotFoundError { @IsString() @@ -14,6 +14,30 @@ export class UsernameOrEmailNeededError extends NotFoundError { message = "No username or email is set!" } +/** + * Error to throw when no username contains illegal characters. + * Right now the only one is "@" but this could change in the future. + */ +export class UsernameContainsIllegalCharacterError extends NotAcceptableError { + @IsString() + name = "UsernameContainsIllegalCharacterError" + + @IsString() + message = "The provided username contains illegal characters! \n Right now the following characters are considered illegal: '@'" +} + +/** + * Error to throw when no email is set. + * We somehow need to identify you :) + */ +export class UserEmailNeededError extends NotFoundError { + @IsString() + name = "UserEmailNeededError" + + @IsString() + message = "No email is set! \n You have to provide email addresses for users (used for password reset among others)." +} + /** * Error to throw when a user couldn't be found. */ diff --git a/src/models/actions/create/CreateDistanceDonation.ts b/src/models/actions/create/CreateDistanceDonation.ts new file mode 100644 index 0000000..e212068 --- /dev/null +++ b/src/models/actions/create/CreateDistanceDonation.ts @@ -0,0 +1,52 @@ +import { IsInt, IsPositive } from 'class-validator'; +import { getConnection } from 'typeorm'; +import { RunnerNotFoundError } from '../../../errors/RunnerErrors'; +import { DistanceDonation } from '../../entities/DistanceDonation'; +import { Runner } from '../../entities/Runner'; +import { CreateDonation } from './CreateDonation'; + +/** + * This class is used to create a new FixedDonation entity from a json body (post request). + */ +export class CreateDistanceDonation extends CreateDonation { + + /** + * The donation's associated runner. + * This is important to link the runner's distance ran to the donation. + */ + @IsInt() + @IsPositive() + runner: number; + + /** + * The donation's amount per distance (full kilometer aka 1000 meters). + * The unit is your currency's smallest unit (default: euro cent). + */ + @IsInt() + @IsPositive() + amountPerDistance: number; + + /** + * Creates a new FixedDonation entity from this. + */ + public async toEntity(): Promise { + let newDonation = new DistanceDonation; + + newDonation.amountPerDistance = this.amountPerDistance; + newDonation.donor = await this.getDonor(); + newDonation.runner = await this.getRunner(); + + return newDonation; + } + + /** + * Gets a runner based on the runner id provided via this.runner. + */ + public async getRunner(): Promise { + const runner = await getConnection().getRepository(Runner).findOne({ id: this.runner }); + if (!runner) { + throw new RunnerNotFoundError(); + } + return runner; + } +} \ No newline at end of file diff --git a/src/models/actions/create/CreateDonation.ts b/src/models/actions/create/CreateDonation.ts new file mode 100644 index 0000000..3b9218f --- /dev/null +++ b/src/models/actions/create/CreateDonation.ts @@ -0,0 +1,34 @@ +import { IsInt, IsPositive } from 'class-validator'; +import { getConnection } from 'typeorm'; +import { DonorNotFoundError } from '../../../errors/DonorErrors'; +import { Donation } from '../../entities/Donation'; +import { Donor } from '../../entities/Donor'; + +/** + * This class is used to create a new Donation entity from a json body (post request). + */ +export abstract class CreateDonation { + /** + * The donation's associated donor. + * This is important to link donations to donors. + */ + @IsInt() + @IsPositive() + donor: number; + + /** + * Creates a new Donation entity from this. + */ + public abstract toEntity(): Promise; + + /** + * Gets a donor based on the donor id provided via this.donor. + */ + public async getDonor(): Promise { + const donor = await getConnection().getRepository(Donor).findOne({ id: this.donor }); + if (!donor) { + throw new DonorNotFoundError(); + } + return donor; + } +} \ No newline at end of file diff --git a/src/models/actions/create/CreateFixedDonation.ts b/src/models/actions/create/CreateFixedDonation.ts new file mode 100644 index 0000000..4d73f50 --- /dev/null +++ b/src/models/actions/create/CreateFixedDonation.ts @@ -0,0 +1,28 @@ +import { IsInt, IsPositive } from 'class-validator'; +import { FixedDonation } from '../../entities/FixedDonation'; +import { CreateDonation } from './CreateDonation'; + +/** + * This class is used to create a new FixedDonation entity from a json body (post request). + */ +export class CreateFixedDonation extends CreateDonation { + /** + * The donation's amount. + * The unit is your currency's smallest unit (default: euro cent). + */ + @IsInt() + @IsPositive() + amount: number; + + /** + * Creates a new FixedDonation entity from this. + */ + public async toEntity(): Promise { + let newDonation = new FixedDonation; + + newDonation.amount = this.amount; + newDonation.donor = await this.getDonor(); + + return newDonation; + } +} \ No newline at end of file diff --git a/src/models/actions/create/CreateUser.ts b/src/models/actions/create/CreateUser.ts index a5f20c2..1942e59 100644 --- a/src/models/actions/create/CreateUser.ts +++ b/src/models/actions/create/CreateUser.ts @@ -1,9 +1,9 @@ import * as argon2 from "argon2"; -import { IsBoolean, IsEmail, IsOptional, IsPhoneNumber, IsString, IsUrl } from 'class-validator'; +import { IsBoolean, IsEmail, IsNotEmpty, IsOptional, IsPhoneNumber, IsString, IsUrl } from 'class-validator'; import { getConnectionManager } from 'typeorm'; import * as uuid from 'uuid'; import { config } from '../../../config'; -import { UsernameOrEmailNeededError } from '../../../errors/UserErrors'; +import { UserEmailNeededError, UsernameContainsIllegalCharacterError } from '../../../errors/UserErrors'; import { UserGroupNotFoundError } from '../../../errors/UserGroupErrors'; import { User } from '../../entities/User'; import { UserGroup } from '../../entities/UserGroup'; @@ -33,7 +33,7 @@ export class CreateUser { /** * The new user's username. - * You have to provide at least one of: {email, username}. + * You have to provide a email addres, so this is optional. */ @IsOptional() @IsString() @@ -41,12 +41,11 @@ export class CreateUser { /** * The new user's email address. - * You have to provide at least one of: {email, username}. */ @IsEmail() @IsString() - @IsOptional() - email?: string; + @IsNotEmpty() + email: string; /** * The new user's phone number. @@ -92,9 +91,10 @@ export class CreateUser { public async toEntity(): Promise { let newUser: User = new User(); - if (this.email === undefined && this.username === undefined) { - throw new UsernameOrEmailNeededError(); + if (!this.email) { + throw new UserEmailNeededError(); } + if (this.username.includes("@")) { throw new UsernameContainsIllegalCharacterError(); } newUser.email = this.email newUser.username = this.username diff --git a/src/models/actions/update/UpdateDistanceDonation.ts b/src/models/actions/update/UpdateDistanceDonation.ts new file mode 100644 index 0000000..85a5473 --- /dev/null +++ b/src/models/actions/update/UpdateDistanceDonation.ts @@ -0,0 +1,51 @@ +import { IsInt, IsPositive } from 'class-validator'; +import { getConnection } from 'typeorm'; +import { RunnerNotFoundError } from '../../../errors/RunnerErrors'; +import { DistanceDonation } from '../../entities/DistanceDonation'; +import { Runner } from '../../entities/Runner'; +import { UpdateDonation } from './UpdateDonation'; + +/** + * This class is used to update a DistanceDonation entity (via put request). + */ +export class UpdateDistanceDonation extends UpdateDonation { + + /** + * The donation's associated runner. + * This is important to link the runner's distance ran to the donation. + */ + @IsInt() + @IsPositive() + runner: number; + + /** + * The donation's amount per distance (full kilometer aka 1000 meters). + * The unit is your currency's smallest unit (default: euro cent). + */ + @IsInt() + @IsPositive() + amountPerDistance: number; + + /** + * Update a DistanceDonation entity based on this. + * @param donation The donation that shall be updated. + */ + public async update(donation: DistanceDonation): Promise { + donation.amountPerDistance = this.amountPerDistance; + donation.donor = await this.getDonor(); + donation.runner = await this.getRunner(); + + return donation; + } + + /** + * Gets a runner based on the runner id provided via this.runner. + */ + public async getRunner(): Promise { + const runner = await getConnection().getRepository(Runner).findOne({ id: this.runner }); + if (!runner) { + throw new RunnerNotFoundError(); + } + return runner; + } +} \ No newline at end of file diff --git a/src/models/actions/update/UpdateDonation.ts b/src/models/actions/update/UpdateDonation.ts new file mode 100644 index 0000000..7f10f97 --- /dev/null +++ b/src/models/actions/update/UpdateDonation.ts @@ -0,0 +1,41 @@ +import { IsInt, IsPositive } from 'class-validator'; +import { getConnection } from 'typeorm'; +import { DonorNotFoundError } from '../../../errors/DonorErrors'; +import { Donation } from '../../entities/Donation'; +import { Donor } from '../../entities/Donor'; + +/** + * This class is used to update a Donation entity (via put request). + */ +export abstract class UpdateDonation { + /** + * The updated donation's id. + * This shouldn't have changed but it is here in case anyone ever wants to enable id changes (whyever they would want to). + */ + @IsInt() + id: number; + + /** + * The updated donation's associated donor. + * This is important to link donations to donors. + */ + @IsInt() + @IsPositive() + donor: number; + + /** + * Creates a new Donation entity from this. + */ + public abstract update(donation: Donation): Promise; + + /** + * Gets a donor based on the donor id provided via this.donor. + */ + public async getDonor(): Promise { + const donor = await getConnection().getRepository(Donor).findOne({ id: this.donor }); + if (!donor) { + throw new DonorNotFoundError(); + } + return donor; + } +} \ No newline at end of file diff --git a/src/models/actions/update/UpdateFixedDonation.ts b/src/models/actions/update/UpdateFixedDonation.ts new file mode 100644 index 0000000..5e31068 --- /dev/null +++ b/src/models/actions/update/UpdateFixedDonation.ts @@ -0,0 +1,27 @@ +import { IsInt, IsPositive } from 'class-validator'; +import { FixedDonation } from '../../entities/FixedDonation'; +import { UpdateDonation } from './UpdateDonation'; + +/** + * This class is used to update a FixedDonation entity (via put request). + */ +export class UpdateFixedDonation extends UpdateDonation { + /** + * The updated donation's amount. + * The unit is your currency's smallest unit (default: euro cent). + */ + @IsInt() + @IsPositive() + amount: number; + + /** + * Update a FixedDonation entity based on this. + * @param donation The donation that shall be updated. + */ + public async update(donation: FixedDonation): Promise { + donation.amount = this.amount; + donation.donor = await this.getDonor(); + + return donation; + } +} \ No newline at end of file diff --git a/src/models/actions/update/UpdateUser.ts b/src/models/actions/update/UpdateUser.ts index 59d95a4..2797b34 100644 --- a/src/models/actions/update/UpdateUser.ts +++ b/src/models/actions/update/UpdateUser.ts @@ -1,8 +1,8 @@ import * as argon2 from "argon2"; -import { IsBoolean, IsEmail, IsInt, IsOptional, IsPhoneNumber, IsString, IsUrl } from 'class-validator'; +import { IsBoolean, IsEmail, IsInt, IsNotEmpty, IsOptional, IsPhoneNumber, IsString, IsUrl } from 'class-validator'; import { getConnectionManager } from 'typeorm'; import { config } from '../../../config'; -import { UsernameOrEmailNeededError } from '../../../errors/AuthError'; +import { UserEmailNeededError, UsernameContainsIllegalCharacterError } from '../../../errors/UserErrors'; import { UserGroupNotFoundError } from '../../../errors/UserGroupErrors'; import { User } from '../../entities/User'; import { UserGroup } from '../../entities/UserGroup'; @@ -40,7 +40,7 @@ export class UpdateUser { /** * The updated user's username. - * You have to provide at least one of: {email, username}. + * You have to provide a email addres, so this is optional. */ @IsOptional() @IsString() @@ -48,12 +48,11 @@ export class UpdateUser { /** * The updated user's email address. - * You have to provide at least one of: {email, username}. */ @IsEmail() @IsString() - @IsOptional() - email?: string; + @IsNotEmpty() + email: string; /** * The updated user's phone number. @@ -99,16 +98,18 @@ export class UpdateUser { * @param user The user that shall be updated. */ public async update(user: User): Promise { - user.email = this.email; - user.username = this.username; - if ((user.email === undefined || user.email === null) && (user.username === undefined || user.username === null)) { - throw new UsernameOrEmailNeededError(); + if (!this.email) { + throw new UserEmailNeededError(); } + if (this.username.includes("@")) { throw new UsernameContainsIllegalCharacterError(); } + if (this.password) { user.password = await argon2.hash(this.password + user.uuid); user.refreshTokenCount = user.refreshTokenCount + 1; } + user.email = this.email; + user.username = this.username; user.enabled = this.enabled; user.firstname = this.firstname user.middlename = this.middlename diff --git a/src/models/entities/DistanceDonation.ts b/src/models/entities/DistanceDonation.ts index 6b9ba5d..a9b323e 100644 --- a/src/models/entities/DistanceDonation.ts +++ b/src/models/entities/DistanceDonation.ts @@ -1,5 +1,6 @@ import { IsInt, IsNotEmpty, IsPositive } from "class-validator"; import { ChildEntity, Column, ManyToOne } from "typeorm"; +import { ResponseDistanceDonation } from '../responses/ResponseDistanceDonation'; import { Donation } from "./Donation"; import { Runner } from "./Runner"; @@ -31,7 +32,7 @@ export class DistanceDonation extends Donation { * Get's calculated from the runner's distance ran and the amount donated per kilometer. */ public get amount(): number { - let calculatedAmount = -1; + let calculatedAmount = 0; try { calculatedAmount = this.amountPerDistance * (this.runner.distance / 1000); } catch (error) { @@ -43,7 +44,7 @@ export class DistanceDonation extends Donation { /** * Turns this entity into it's response class. */ - public toResponse() { - return new Error("NotImplemented"); + public toResponse(): ResponseDistanceDonation { + return new ResponseDistanceDonation(this); } } diff --git a/src/models/entities/Donation.ts b/src/models/entities/Donation.ts index 46d7d45..1dd023d 100644 --- a/src/models/entities/Donation.ts +++ b/src/models/entities/Donation.ts @@ -3,6 +3,7 @@ import { IsNotEmpty } from "class-validator"; import { Entity, ManyToOne, PrimaryGeneratedColumn, TableInheritance } from "typeorm"; +import { ResponseDonation } from '../responses/ResponseDonation'; import { Donor } from './Donor'; /** @@ -31,12 +32,13 @@ export abstract class Donation { * The donation's amount in cents (or whatever your currency's smallest unit is.). * The exact implementation may differ for each type of donation. */ - abstract amount: number; + public abstract get amount(): number; + /** * Turns this entity into it's response class. */ - public toResponse() { - return new Error("NotImplemented"); + public toResponse(): ResponseDonation { + return new ResponseDonation(this); } } \ No newline at end of file diff --git a/src/models/entities/Donor.ts b/src/models/entities/Donor.ts index 01b365c..acf5536 100644 --- a/src/models/entities/Donor.ts +++ b/src/models/entities/Donor.ts @@ -1,4 +1,4 @@ -import { IsBoolean } from "class-validator"; +import { IsBoolean, IsInt } from "class-validator"; import { ChildEntity, Column, OneToMany } from "typeorm"; import { ResponseDonor } from '../responses/ResponseDonor'; import { Donation } from './Donation'; @@ -24,6 +24,15 @@ export class Donor extends Participant { @OneToMany(() => Donation, donation => donation.donor, { nullable: true }) donations: Donation[]; + /** + * Returns the total donations of a donor based on his linked donations. + */ + @IsInt() + public get donationAmount(): number { + if (!this.donations) { return 0; } + return this.donations.reduce((sum, current) => sum + current.amount, 0); + } + /** * Turns this entity into it's response class. */ diff --git a/src/models/entities/FixedDonation.ts b/src/models/entities/FixedDonation.ts index 6a32066..c6454d4 100644 --- a/src/models/entities/FixedDonation.ts +++ b/src/models/entities/FixedDonation.ts @@ -1,5 +1,6 @@ import { IsInt, IsPositive } from "class-validator"; import { ChildEntity, Column } from "typeorm"; +import { ResponseDonation } from '../responses/ResponseDonation'; import { Donation } from "./Donation"; /** @@ -11,16 +12,33 @@ export class FixedDonation extends Donation { /** * The donation's amount in cents (or whatever your currency's smallest unit is.). + * This is the "real" value used by fixed donations. */ @Column() @IsInt() @IsPositive() - amount: number; + private _amount: number; + + /** + * The donation's amount in cents (or whatever your currency's smallest unit is.). + */ + @IsInt() + @IsPositive() + public get amount(): number { + return this._amount; + } + + /** + * The donation's amount in cents (or whatever your currency's smallest unit is.). + */ + public set amount(value: number) { + this._amount = value; + } /** * Turns this entity into it's response class. */ - public toResponse() { - return new Error("NotImplemented"); + public toResponse(): ResponseDonation { + return new ResponseDonation(this); } } \ No newline at end of file diff --git a/src/models/entities/User.ts b/src/models/entities/User.ts index 94e091c..c9111ff 100644 --- a/src/models/entities/User.ts +++ b/src/models/entities/User.ts @@ -3,6 +3,7 @@ import { ChildEntity, Column, JoinTable, ManyToMany, OneToMany } from "typeorm"; import { config } from '../../config'; import { ResponsePrincipal } from '../responses/ResponsePrincipal'; import { ResponseUser } from '../responses/ResponseUser'; +import { Permission } from './Permission'; import { Principal } from './Principal'; import { UserAction } from './UserAction'; import { UserGroup } from './UserGroup'; @@ -25,9 +26,10 @@ export class User extends Principal { * The user's e-mail address. * Either username or email has to be set (otherwise the user couldn't log in). */ - @Column({ nullable: true, unique: true }) + @Column({ nullable: false, unique: true }) @IsEmail() - email?: string; + @IsNotEmpty() + email: string; /** * The user's phone number. @@ -128,8 +130,24 @@ export class User extends Principal { @OneToMany(() => UserAction, action => action.user, { nullable: true }) actions: UserAction[] + /** + * Resolves all permissions granted to this user through groups. + */ + public get inheritedPermissions(): Permission[] { + let returnPermissions: Permission[] = new Array(); + + if (!this.groups) { return returnPermissions; } + for (let group of this.groups) { + for (let permission of group.permissions) { + returnPermissions.push(permission); + } + } + return returnPermissions; + } + /** * Resolves all permissions granted to this user through groups or directly to the string enum format. + * Also deduplicates the array. */ public get allPermissions(): string[] { let returnPermissions: string[] = new Array(); diff --git a/src/models/enums/PermissionTargets.ts b/src/models/enums/PermissionTargets.ts index 551ea5c..86c547d 100644 --- a/src/models/enums/PermissionTargets.ts +++ b/src/models/enums/PermissionTargets.ts @@ -13,5 +13,6 @@ export enum PermissionTarget { DONOR = 'DONOR', SCAN = 'SCAN', STATION = 'STATION', - CARD = 'CARD' + CARD = 'CARD', + DONATION = 'DONATION' } \ No newline at end of file diff --git a/src/models/responses/ResponseDistanceDonation.ts b/src/models/responses/ResponseDistanceDonation.ts new file mode 100644 index 0000000..388ece0 --- /dev/null +++ b/src/models/responses/ResponseDistanceDonation.ts @@ -0,0 +1,35 @@ +import { IsInt, IsObject, IsPositive } from 'class-validator'; +import { DistanceDonation } from '../entities/DistanceDonation'; +import { ResponseDonation } from './ResponseDonation'; +import { ResponseRunner } from './ResponseRunner'; + +/** + * Defines the distance donation response. +*/ +export class ResponseDistanceDonation extends ResponseDonation { + + /** + * The donation's associated runner. + * Used as the source of the donation's distance. + */ + @IsObject() + runner: ResponseRunner; + + /** + * The donation's amount donated per distance. + * The amount the donor set to be donated per kilometer that the runner ran. + */ + @IsInt() + @IsPositive() + amountPerDistance: number; + + /** + * Creates a ResponseDistanceDonation object from a scan. + * @param donation The distance donation the response shall be build for. + */ + public constructor(donation: DistanceDonation) { + super(donation); + this.runner = donation.runner.toResponse(); + this.amountPerDistance = donation.amountPerDistance; + } +} diff --git a/src/models/responses/ResponseDonation.ts b/src/models/responses/ResponseDonation.ts new file mode 100644 index 0000000..c2789e3 --- /dev/null +++ b/src/models/responses/ResponseDonation.ts @@ -0,0 +1,37 @@ +import { IsInt, IsNotEmpty, IsPositive } from "class-validator"; +import { Donation } from '../entities/Donation'; +import { ResponseDonor } from './ResponseDonor'; + +/** + * Defines the donation response. +*/ +export class ResponseDonation { + /** + * The donation's id. + */ + @IsInt() + @IsPositive() + id: number; + + /** + * The donation's donor. + */ + @IsNotEmpty() + donor: ResponseDonor; + + /** + * The donation's amount in the smalles unit of your currency (default: euro cent). + */ + @IsInt() + amount: number; + + /** + * Creates a ResponseDonation object from a scan. + * @param donation The donation the response shall be build for. + */ + public constructor(donation: Donation) { + this.id = donation.id; + this.donor = donation.donor.toResponse(); + this.amount = donation.amount; + } +} diff --git a/src/models/responses/ResponseDonor.ts b/src/models/responses/ResponseDonor.ts index 89fea60..5f659f9 100644 --- a/src/models/responses/ResponseDonor.ts +++ b/src/models/responses/ResponseDonor.ts @@ -1,5 +1,5 @@ import { - IsBoolean + IsBoolean, IsInt } from "class-validator"; import { Donor } from '../entities/Donor'; import { ResponseParticipant } from './ResponseParticipant'; @@ -15,6 +15,12 @@ export class ResponseDonor extends ResponseParticipant { @IsBoolean() receiptNeeded: boolean; + /** + * Returns the total donations of a donor based on his linked donations. + */ + @IsInt() + donationAmount: number; + /** * Creates a ResponseRunner object from a runner. * @param runner The user the response shall be build for. @@ -22,5 +28,6 @@ export class ResponseDonor extends ResponseParticipant { public constructor(donor: Donor) { super(donor); this.receiptNeeded = donor.receiptNeeded; + this.donationAmount = donor.donationAmount; } } diff --git a/src/models/responses/ResponseUser.ts b/src/models/responses/ResponseUser.ts index 3da5434..526d537 100644 --- a/src/models/responses/ResponseUser.ts +++ b/src/models/responses/ResponseUser.ts @@ -70,6 +70,7 @@ export class ResponseUser extends ResponsePrincipal { /** * The user's permissions. + * Directly granted or inherited converted to their string form and deduplicated. */ @IsArray() @IsOptional() diff --git a/src/models/responses/ResponseUserPermissions.ts b/src/models/responses/ResponseUserPermissions.ts new file mode 100644 index 0000000..d5a8a7b --- /dev/null +++ b/src/models/responses/ResponseUserPermissions.ts @@ -0,0 +1,40 @@ +import { + IsArray, + + + IsOptional +} from "class-validator"; +import { User } from '../entities/User'; +import { ResponsePermission } from './ResponsePermission'; + +/** + * Defines the user permission response (get /api/users/:id/permissions). +*/ +export class ResponseUserPermissions { + /** + * The permissions directly granted to the user. + */ + @IsArray() + @IsOptional() + directlyGranted: ResponsePermission[] = new Array(); + + /** + * The permissions directly inherited the user. + */ + @IsArray() + @IsOptional() + inherited: ResponsePermission[] = new Array(); + + /** + * Creates a ResponseUserPermissions object from a user. + * @param user The user the response shall be build for. + */ + public constructor(user: User) { + for (let permission of user.permissions) { + this.directlyGranted.push(permission.toResponse()); + } + for (let permission of user.inheritedPermissions) { + this.inherited.push(permission.toResponse()); + } + } +} diff --git a/src/seeds/SeedUsers.ts b/src/seeds/SeedUsers.ts index e70ef84..26fc233 100644 --- a/src/seeds/SeedUsers.ts +++ b/src/seeds/SeedUsers.ts @@ -33,6 +33,7 @@ export default class SeedUsers implements Seeder { initialUser.lastname = "demo"; initialUser.username = "demo"; initialUser.password = "demo"; + initialUser.email = "demo@dev.lauf-fuer-kaya.de" initialUser.groups = group; return await connection.getRepository(User).save(await initialUser.toEntity()); } diff --git a/src/tests/auth/auth_logout.spec.ts b/src/tests/auth/auth_logout.spec.ts index 7c846c1..2594f26 100644 --- a/src/tests/auth/auth_logout.spec.ts +++ b/src/tests/auth/auth_logout.spec.ts @@ -14,7 +14,8 @@ beforeAll(async () => { "middlename": "demo_logout", "lastname": "demo_logout", "username": "demo_logout", - "password": "demo_logout" + "password": "demo_logout", + "email": "demo_logout@dev.lauf-fuer-kaya.de" }, { headers: { "authorization": "Bearer " + res_login.data["access_token"] }, validateStatus: undefined diff --git a/src/tests/auth/auth_refresh.spec.ts b/src/tests/auth/auth_refresh.spec.ts index 02d2a02..bd875ba 100644 --- a/src/tests/auth/auth_refresh.spec.ts +++ b/src/tests/auth/auth_refresh.spec.ts @@ -14,7 +14,8 @@ beforeAll(async () => { "middlename": "demo_refresh", "lastname": "demo_refresh", "username": "demo_refresh", - "password": "demo_refresh" + "password": "demo_refresh", + "email": "demo_refresh@dev.lauf-fuer-kaya.de" }, { headers: { "authorization": "Bearer " + res_login.data["access_token"] }, validateStatus: undefined diff --git a/src/tests/auth/auth_reset.spec.ts b/src/tests/auth/auth_reset.spec.ts index 2ebb8ed..47c61e6 100644 --- a/src/tests/auth/auth_reset.spec.ts +++ b/src/tests/auth/auth_reset.spec.ts @@ -14,7 +14,8 @@ beforeAll(async () => { "middlename": "demo_reset", "lastname": "demo_reset", "username": "demo_reset", - "password": "demo_reset" + "password": "demo_reset", + "email": "demo_reset@dev.lauf-fuer-kaya.de" }, { headers: { "authorization": "Bearer " + res_login.data["access_token"] }, validateStatus: undefined @@ -24,7 +25,8 @@ beforeAll(async () => { "middlename": "demo_reset2", "lastname": "demo_reset2", "username": "demo_reset2", - "password": "demo_reset2" + "password": "demo_reset2", + "email": "demo_reset1@dev.lauf-fuer-kaya.de" }, { headers: { "authorization": "Bearer " + res_login.data["access_token"] }, validateStatus: undefined diff --git a/src/tests/donations/donations_add.spec.ts b/src/tests/donations/donations_add.spec.ts new file mode 100644 index 0000000..523b767 --- /dev/null +++ b/src/tests/donations/donations_add.spec.ts @@ -0,0 +1,236 @@ +import axios from 'axios'; +import { config } from '../../config'; +const base = "http://localhost:" + config.internal_port + +let access_token; +let axios_config; + +beforeAll(async () => { + const res = await axios.post(base + '/api/auth/login', { username: "demo", password: "demo" }); + access_token = res.data["access_token"]; + axios_config = { + headers: { "authorization": "Bearer " + access_token }, + validateStatus: undefined + }; +}); + +describe('POST /api/donations illegally', () => { + it('posting to a non-existant endpoint should return 4040', async () => { + const res1 = await axios.post(base + '/api/donations', null, axios_config); + expect(res1.status).toEqual(404); + }); +}); +// --------------- +describe('POST /api/donations/fixed illegally', () => { + let added_donor; + it('creating a new donor with only needed params should return 200', async () => { + const res = await axios.post(base + '/api/donors', { + "firstname": "first", + "lastname": "last" + }, axios_config); + added_donor = res.data + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('no input should return 400', async () => { + const res = await axios.post(base + '/api/donations/fixed', null, axios_config); + expect(res.status).toEqual(400); + expect(res.headers['content-type']).toContain("application/json") + }); + it('no donor should return 400', async () => { + const res = await axios.post(base + '/api/donations/fixed', { + "amount": 100 + }, axios_config); + expect(res.status).toEqual(400); + expect(res.headers['content-type']).toContain("application/json") + }); + it('no amount should return 400', async () => { + const res = await axios.post(base + '/api/donations/fixed', { + "donor": added_donor.id + }, axios_config); + expect(res.status).toEqual(400); + expect(res.headers['content-type']).toContain("application/json") + }); + it('illegal amount input should return 400', async () => { + const res = await axios.post(base + '/api/donations/fixed', { + "donor": added_donor.id, + "amount": -1 + }, axios_config); + expect(res.status).toEqual(400); + expect(res.headers['content-type']).toContain("application/json") + }); + it('invalid donor input should return 404', async () => { + const res = await axios.post(base + '/api/donations/fixed', { + "donor": 999999999999999999999999, + "amount": 100 + }, axios_config); + expect(res.status).toEqual(404); + expect(res.headers['content-type']).toContain("application/json") + }); +}); +// --------------- +describe('POST /api/donations/distance illegally', () => { + let added_donor; + let added_org; + let added_runner; + it('creating a new donor with only needed params should return 200', async () => { + const res = await axios.post(base + '/api/donors', { + "firstname": "first", + "lastname": "last" + }, axios_config); + added_donor = res.data + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new org with just a name should return 200', async () => { + const res = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + added_org = res.data + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new runner with only needed params should return 200', async () => { + const res = await axios.post(base + '/api/runners', { + "firstname": "first", + "lastname": "last", + "group": added_org.id + }, axios_config); + added_runner = res.data; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('no input should return 400', async () => { + const res = await axios.post(base + '/api/donations/distance', null, axios_config); + expect(res.status).toEqual(400); + expect(res.headers['content-type']).toContain("application/json") + }); + it('no donor should return 400', async () => { + const res = await axios.post(base + '/api/donations/distance', { + "runner": added_runner.id, + "amountPerDistance": 100, + }, axios_config); + expect(res.status).toEqual(400); + expect(res.headers['content-type']).toContain("application/json") + }); + it('no amountPerDistance should return 400', async () => { + const res = await axios.post(base + '/api/donations/distance', { + "runner": added_runner.id, + "donor": added_donor.id + }, axios_config); + expect(res.status).toEqual(400); + expect(res.headers['content-type']).toContain("application/json") + }); + it('no runner should return 400', async () => { + const res = await axios.post(base + '/api/donations/distance', { + "amountPerDistance": 100, + "donor": added_donor.id + }, axios_config); + expect(res.status).toEqual(400); + expect(res.headers['content-type']).toContain("application/json") + }); + it('illegal amountPerDistance input should return 400', async () => { + const res = await axios.post(base + '/api/donations/distance', { + "runner": added_runner.id, + "amountPerDistance": -1, + "donor": added_donor.id + }, axios_config); + expect(res.status).toEqual(400); + expect(res.headers['content-type']).toContain("application/json") + }); + it('invalid donor input should return 404', async () => { + const res = await axios.post(base + '/api/donations/distance', { + "donor": 999999999999999999999999, + "runner": added_runner.id, + "amountPerDistance": 100, + }, axios_config); + expect(res.status).toEqual(404); + expect(res.headers['content-type']).toContain("application/json") + }); + it('invalid runner input should return 404', async () => { + const res = await axios.post(base + '/api/donations/distance', { + "donor": added_donor.id, + "runner": 999999999999999999999999, + "amountPerDistance": 100, + }, axios_config); + expect(res.status).toEqual(404); + expect(res.headers['content-type']).toContain("application/json") + }); +}); +// --------------- +describe('POST /api/donations/fixed successfully', () => { + let added_donor; + it('creating a new donor with only needed params should return 200', async () => { + const res = await axios.post(base + '/api/donors', { + "firstname": "first", + "lastname": "last" + }, axios_config); + added_donor = res.data + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new fixed donation should return 200', async () => { + const res = await axios.post(base + '/api/donations/fixed', { + "donor": added_donor.id, + "amount": 1000 + }, axios_config); + delete res.data.id; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + expect(res.data).toEqual({ + "donor": added_donor, + "amount": 1000 + }); + }); +}); +// --------------- +describe('POST /api/donations/distance successfully', () => { + let added_donor; + let added_org; + let added_runner; + let added_donation; + it('creating a new donor with only needed params should return 200', async () => { + const res = await axios.post(base + '/api/donors', { + "firstname": "first", + "lastname": "last" + }, axios_config); + added_donor = res.data + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new org with just a name should return 200', async () => { + const res = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + added_org = res.data + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new runner with only needed params should return 200', async () => { + const res = await axios.post(base + '/api/runners', { + "firstname": "first", + "lastname": "last", + "group": added_org.id + }, axios_config); + delete res.data.group; + added_runner = res.data; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new fixed donation should return 200', async () => { + const res = await axios.post(base + '/api/donations/distance', { + "runner": added_runner.id, + "amountPerDistance": 100, + "donor": added_donor.id + }, axios_config); + delete res.data.id; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + expect(res.data).toEqual({ + "donor": added_donor, + "amountPerDistance": 100, + "runner": added_runner, + "amount": 0 + }) + }); +}); \ No newline at end of file diff --git a/src/tests/donations/donations_delete.spec.ts b/src/tests/donations/donations_delete.spec.ts new file mode 100644 index 0000000..c238836 --- /dev/null +++ b/src/tests/donations/donations_delete.spec.ts @@ -0,0 +1,113 @@ +import axios from 'axios'; +import { config } from '../../config'; +const base = "http://localhost:" + config.internal_port + +let access_token; +let axios_config; + +beforeAll(async () => { + const res = await axios.post(base + '/api/auth/login', { username: "demo", password: "demo" }); + access_token = res.data["access_token"]; + axios_config = { + headers: { "authorization": "Bearer " + access_token }, + validateStatus: undefined + }; +}); + +describe('DELETE donation (non-existant)', () => { + it('delete', async () => { + const res = await axios.delete(base + '/api/donations/0', axios_config); + expect(res.status).toEqual(204); + }); +}); +// --------------- +describe('DELETE fixed donation', () => { + let added_donor; + let added_donation; + it('creating a new donor with only needed params should return 200', async () => { + const res = await axios.post(base + '/api/donors', { + "firstname": "first", + "lastname": "last" + }, axios_config); + added_donor = res.data + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new fixed donation should return 200', async () => { + const res = await axios.post(base + '/api/donations/fixed', { + "donor": added_donor.id, + "amount": 1000 + }, axios_config); + added_donation = res.data; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('delete donation', async () => { + const res = await axios.delete(base + '/api/donations/' + added_donation.id, axios_config); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + expect(res.data).toEqual(added_donation); + }); + it('check if donation really was deleted', async () => { + const res = await axios.get(base + '/api/donations/' + added_donation.id, axios_config); + expect(res.status).toEqual(404); + expect(res.headers['content-type']).toContain("application/json") + }); +}); +// --------------- +describe('DELETE distance donation', () => { + let added_donor; + let added_org; + let added_runner; + let added_donation; + it('creating a new donor with only needed params should return 200', async () => { + const res = await axios.post(base + '/api/donors', { + "firstname": "first", + "lastname": "last" + }, axios_config); + added_donor = res.data + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new org with just a name should return 200', async () => { + const res = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + added_org = res.data + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new runner with only needed params should return 200', async () => { + const res = await axios.post(base + '/api/runners', { + "firstname": "first", + "lastname": "last", + "group": added_org.id + }, axios_config); + added_runner = res.data; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new distance donation should return 200', async () => { + const res = await axios.post(base + '/api/donations/distance', { + "runner": added_runner.id, + "amountPerDistance": 100, + "donor": added_donor.id + }, axios_config); + delete res.data.runner.distance; + added_donation = res.data; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('delete donation', async () => { + const res = await axios.delete(base + '/api/donations/' + added_donation.id, axios_config); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + delete res.data.runner.distance; + expect(res.data).toEqual(added_donation); + }); + it('check if donation really was deleted', async () => { + const res = await axios.get(base + '/api/donations/' + added_donation.id, axios_config); + expect(res.status).toEqual(404); + expect(res.headers['content-type']).toContain("application/json") + }); +}); \ No newline at end of file diff --git a/src/tests/donations/donations_get.spec.ts b/src/tests/donations/donations_get.spec.ts new file mode 100644 index 0000000..8dd1a0f --- /dev/null +++ b/src/tests/donations/donations_get.spec.ts @@ -0,0 +1,108 @@ +import axios from 'axios'; +import { config } from '../../config'; +const base = "http://localhost:" + config.internal_port + +let access_token; +let axios_config; + +beforeAll(async () => { + const res = await axios.post(base + '/api/auth/login', { username: "demo", password: "demo" }); + access_token = res.data["access_token"]; + axios_config = { + headers: { "authorization": "Bearer " + access_token }, + validateStatus: undefined + }; +}); + +describe('GET /api/donations sucessfully', () => { + it('basic get should return 200', async () => { + const res = await axios.get(base + '/api/donations', axios_config); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); +}); +// --------------- +describe('GET /api/donations illegally', () => { + it('get for non-existant track should return 404', async () => { + const res = await axios.get(base + '/api/donations/-1', axios_config); + expect(res.status).toEqual(404); + expect(res.headers['content-type']).toContain("application/json") + }); +}); +// --------------- +describe('adding + getting fixed donation', () => { + let added_donor; + let added_donation; + it('creating a new donor with only needed params should return 200', async () => { + const res = await axios.post(base + '/api/donors', { + "firstname": "first", + "lastname": "last" + }, axios_config); + added_donor = res.data + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new fixed donation should return 200', async () => { + const res = await axios.post(base + '/api/donations/fixed', { + "donor": added_donor.id, + "amount": 1000 + }, axios_config); + added_donation = res.data; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('check if donation was added (no parameter validation)', async () => { + const res = await axios.get(base + '/api/donations/' + added_donation.id, axios_config); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + }); +}); +// --------------- +describe('adding + getting distance donation', () => { + let added_donor; + let added_org; + let added_runner; + let added_donation; + it('creating a new donor with only needed params should return 200', async () => { + const res = await axios.post(base + '/api/donors', { + "firstname": "first", + "lastname": "last" + }, axios_config); + added_donor = res.data + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new org with just a name should return 200', async () => { + const res = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + added_org = res.data + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new runner with only needed params should return 200', async () => { + const res = await axios.post(base + '/api/runners', { + "firstname": "first", + "lastname": "last", + "group": added_org.id + }, axios_config); + added_runner = res.data; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new fixed donation should return 200', async () => { + const res = await axios.post(base + '/api/donations/distance', { + "runner": added_runner.id, + "amountPerDistance": 100, + "donor": added_donor.id + }, axios_config); + added_donation = res.data; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('check if donation was added (no parameter validation)', async () => { + const res = await axios.get(base + '/api/donations/' + added_donation.id, axios_config); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + }); +}); \ No newline at end of file diff --git a/src/tests/donations/donations_update.spec.ts b/src/tests/donations/donations_update.spec.ts new file mode 100644 index 0000000..2df6914 --- /dev/null +++ b/src/tests/donations/donations_update.spec.ts @@ -0,0 +1,343 @@ +import axios from 'axios'; +import { config } from '../../config'; +const base = "http://localhost:" + config.internal_port + +let access_token; +let axios_config; + +beforeAll(async () => { + const res = await axios.post(base + '/api/auth/login', { username: "demo", password: "demo" }); + access_token = res.data["access_token"]; + axios_config = { + headers: { "authorization": "Bearer " + access_token }, + validateStatus: undefined + }; +}); + +describe('adding + updating fixed donation illegally', () => { + let added_donor; + let added_donation; + it('creating a new donor with only needed params should return 200', async () => { + const res = await axios.post(base + '/api/donors', { + "firstname": "first", + "lastname": "last" + }, axios_config); + added_donor = res.data + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new fixed donation should return 200', async () => { + const res = await axios.post(base + '/api/donations/fixed', { + "donor": added_donor.id, + "amount": 1000 + }, axios_config); + added_donation = res.data; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('updating empty should return 400', async () => { + const res = await axios.put(base + '/api/donations/fixed/' + added_donation.id, null, axios_config); + expect(res.status).toEqual(400); + expect(res.headers['content-type']).toContain("application/json") + }); + it('updating with wrong id should return 406', async () => { + const res = await axios.put(base + '/api/donations/fixed/' + added_donation.id, { + "id": added_donation.id + 1, + "donor": added_donor.id, + "amount": 100 + }, axios_config); + expect(res.status).toEqual(406); + expect(res.headers['content-type']).toContain("application/json") + }); + it('updating with negative amount should return 400', async () => { + const res = await axios.put(base + '/api/donations/fixed/' + added_donation.id, { + "id": added_donation.id, + "donor": added_donor.id, + "amount": -1 + }, axios_config); + expect(res.status).toEqual(400); + expect(res.headers['content-type']).toContain("application/json") + }); + it('updating with invalid donor should return 404', async () => { + const res = await axios.put(base + '/api/donations/fixed/' + added_donation.id, { + "id": added_donation.id, + "donor": 9999999999999999999, + "amount": 100 + }, axios_config); + expect(res.status).toEqual(404); + expect(res.headers['content-type']).toContain("application/json") + }); +}); +// --------------- +describe('adding + updating distance donation illegally', () => { + let added_donor; + let added_org; + let added_runner; + let added_donation; + it('creating a new donor with only needed params should return 200', async () => { + const res = await axios.post(base + '/api/donors', { + "firstname": "first", + "lastname": "last" + }, axios_config); + added_donor = res.data + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new org with just a name should return 200', async () => { + const res = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + added_org = res.data + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new runner with only needed params should return 200', async () => { + const res = await axios.post(base + '/api/runners', { + "firstname": "first", + "lastname": "last", + "group": added_org.id + }, axios_config); + added_runner = res.data; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new distance donation should return 200', async () => { + const res = await axios.post(base + '/api/donations/distance', { + "runner": added_runner.id, + "amountPerDistance": 100, + "donor": added_donor.id + }, axios_config); + added_donation = res.data; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('updating empty should return 400', async () => { + const res = await axios.put(base + '/api/donations/distance/' + added_donation.id, null, axios_config); + expect(res.status).toEqual(400); + expect(res.headers['content-type']).toContain("application/json") + }); + it('updating with wrong id should return 406', async () => { + const res = await axios.put(base + '/api/donations/distance/' + added_donation.id, { + "id": added_donation.id + 1, + "runner": added_runner.id, + "amountPerDistance": 100, + "donor": added_donor.id + }, axios_config); + expect(res.status).toEqual(406); + expect(res.headers['content-type']).toContain("application/json") + }); + it('updating with negative amountPerDistance should return 400', async () => { + const res = await axios.put(base + '/api/donations/distance/' + added_donation.id, { + "id": added_donation.id, + "runner": added_runner.id, + "amountPerDistance": -1, + "donor": added_donor.id + }, axios_config); + expect(res.status).toEqual(400); + expect(res.headers['content-type']).toContain("application/json") + }); + it('updating with invalid donor should return 404', async () => { + const res = await axios.put(base + '/api/donations/distance/' + added_donation.id, { + "id": added_donation.id, + "runner": added_runner.id, + "amountPerDistance": 100, + "donor": 9999999999999999999 + }, axios_config); + expect(res.status).toEqual(404); + expect(res.headers['content-type']).toContain("application/json") + }); + it('updating with invalid runner should return 404', async () => { + const res = await axios.put(base + '/api/donations/distance/' + added_donation.id, { + "id": added_donation.id, + "runner": 9999999999999999999, + "amountPerDistance": 100, + "donor": added_donor.id + }, axios_config); + expect(res.status).toEqual(404); + expect(res.headers['content-type']).toContain("application/json") + }); +}); +// --------------- +describe('adding + updating fixed donation valid', () => { + let added_donor; + let added_donor2; + let added_donation; + it('creating a new donor with only needed params should return 200', async () => { + const res = await axios.post(base + '/api/donors', { + "firstname": "first", + "lastname": "last" + }, axios_config); + added_donor = res.data + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new donor with only needed params should return 200', async () => { + const res = await axios.post(base + '/api/donors', { + "firstname": "first", + "lastname": "last" + }, axios_config); + delete res.data.donationAmount; + added_donor2 = res.data + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new fixed donation should return 200', async () => { + const res = await axios.post(base + '/api/donations/fixed', { + "donor": added_donor.id, + "amount": 1000 + }, axios_config); + delete res.data.donor.donationAmount; + added_donation = res.data; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('updating nothing should return 200', async () => { + const res = await axios.put(base + '/api/donations/fixed/' + added_donation.id, { + "id": added_donation.id, + "donor": added_donor.id, + "amount": 1000 + }, axios_config); + delete res.data.donor.donationAmount; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + expect(res.data).toEqual(added_donation); + }); + it('updating amount should return 200', async () => { + const res = await axios.put(base + '/api/donations/fixed/' + added_donation.id, { + "id": added_donation.id, + "donor": added_donor.id, + "amount": 42 + }, axios_config); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + expect(res.data.amount).toEqual(42); + }); + it('updating donor should return 200', async () => { + const res = await axios.put(base + '/api/donations/fixed/' + added_donation.id, { + "id": added_donation.id, + "donor": added_donor2.id, + "amount": 42 + }, axios_config); + delete res.data.donor.donationAmount; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + expect(res.data.donor).toEqual(added_donor2); + }); +}); +// --------------- +describe('adding + updating distance donation valid', () => { + let added_donor; + let added_donor2; + let added_org; + let added_runner; + let added_runner2; + let added_donation; + it('creating a new donor with only needed params should return 200', async () => { + const res = await axios.post(base + '/api/donors', { + "firstname": "first", + "lastname": "last" + }, axios_config); + delete res.data.donationAmount; + added_donor = res.data + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new donor with only needed params should return 200', async () => { + const res = await axios.post(base + '/api/donors', { + "firstname": "first", + "lastname": "last" + }, axios_config); + delete res.data.donationAmount; + added_donor2 = res.data + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new org with just a name should return 200', async () => { + const res = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + added_org = res.data + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new runner with only needed params should return 200', async () => { + const res = await axios.post(base + '/api/runners', { + "firstname": "first", + "lastname": "last", + "group": added_org.id + }, axios_config); + added_runner = res.data; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new runner with only needed params should return 200', async () => { + const res = await axios.post(base + '/api/runners', { + "firstname": "first", + "lastname": "last", + "group": added_org.id + }, axios_config); + delete res.data.group; + added_runner2 = res.data; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new distance donation should return 200', async () => { + const res = await axios.post(base + '/api/donations/distance', { + "runner": added_runner.id, + "amountPerDistance": 100, + "donor": added_donor.id + }, axios_config); + delete res.data.donor.donationAmount; + added_donation = res.data; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('updating nothing should return 200', async () => { + const res = await axios.put(base + '/api/donations/distance/' + added_donation.id, { + "id": added_donation.id, + "runner": added_runner.id, + "amountPerDistance": 100, + "donor": added_donor.id + }, axios_config); + delete res.data.donor.donationAmount; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + expect(res.data).toEqual(added_donation); + }); + it('updating amount should return 200', async () => { + const res = await axios.put(base + '/api/donations/distance/' + added_donation.id, { + "id": added_donation.id, + "runner": added_runner.id, + "amountPerDistance": 69, + "donor": added_donor.id + }, axios_config); + delete res.data.donor.donationAmount; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + expect(res.data.amountPerDistance).toEqual(69); + }); + it('updating runner should return 200', async () => { + const res = await axios.put(base + '/api/donations/distance/' + added_donation.id, { + "id": added_donation.id, + "runner": added_runner2.id, + "amountPerDistance": 69, + "donor": added_donor.id + }, axios_config); + delete res.data.runner.group; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + expect(res.data.runner).toEqual(added_runner2); + }); + it('updating donor should return 200', async () => { + const res = await axios.put(base + '/api/donations/distance/' + added_donation.id, { + "id": added_donation.id, + "runner": added_runner2.id, + "amountPerDistance": 69, + "donor": added_donor2.id + }, axios_config); + delete res.data.donor.donationAmount; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + expect(res.data.donor).toEqual(added_donor2); + }); +}); \ No newline at end of file diff --git a/src/tests/donors/donor_delete.spec.ts b/src/tests/donors/donor_delete.spec.ts index 63e10fe..344dc20 100644 --- a/src/tests/donors/donor_delete.spec.ts +++ b/src/tests/donors/donor_delete.spec.ts @@ -44,4 +44,114 @@ describe('add+delete', () => { expect(res4.status).toEqual(404); expect(res4.headers['content-type']).toContain("application/json") }); +}); +// --------------- +describe('DELETE donor with donations invalid', () => { + let added_donor; + let added_org; + let added_runner; + it('creating a new donor with only needed params should return 200', async () => { + const res = await axios.post(base + '/api/donors', { + "firstname": "first", + "lastname": "last" + }, axios_config); + added_donor = res.data + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new org with just a name should return 200', async () => { + const res = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + added_org = res.data + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new runner with only needed params should return 200', async () => { + const res = await axios.post(base + '/api/runners', { + "firstname": "first", + "lastname": "last", + "group": added_org.id + }, axios_config); + added_runner = res.data; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new fixed donation should return 200', async () => { + const res = await axios.post(base + '/api/donations/fixed', { + "donor": added_donor.id, + "amount": 1000 + }, axios_config); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new distance donation should return 200', async () => { + const res = await axios.post(base + '/api/donations/distance', { + "runner": added_runner.id, + "amountPerDistance": 100, + "donor": added_donor.id + }, axios_config); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('delete donor w/o force', async () => { + const res = await axios.delete(base + '/api/donors/' + added_donor.id, axios_config); + expect(res.status).toEqual(406); + expect(res.headers['content-type']).toContain("application/json") + }); +}); +// --------------- +describe('DELETE donor with donations valid', () => { + let added_donor; + let added_org; + let added_runner; + it('creating a new donor with only needed params should return 200', async () => { + const res = await axios.post(base + '/api/donors', { + "firstname": "first", + "lastname": "last" + }, axios_config); + added_donor = res.data + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new org with just a name should return 200', async () => { + const res = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + added_org = res.data + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new runner with only needed params should return 200', async () => { + const res = await axios.post(base + '/api/runners', { + "firstname": "first", + "lastname": "last", + "group": added_org.id + }, axios_config); + added_runner = res.data; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new fixed donation should return 200', async () => { + const res = await axios.post(base + '/api/donations/fixed', { + "donor": added_donor.id, + "amount": 1000 + }, axios_config); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new distance donation should return 200', async () => { + const res = await axios.post(base + '/api/donations/distance', { + "runner": added_runner.id, + "amountPerDistance": 100, + "donor": added_donor.id + }, axios_config); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('delete donor w/ force ', async () => { + const res = await axios.delete(base + '/api/donors/' + added_donor.id + "?force=true", axios_config); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); }); \ No newline at end of file diff --git a/src/tests/runners/runner_delete.spec.ts b/src/tests/runners/runner_delete.spec.ts index 36e72e7..de96333 100644 --- a/src/tests/runners/runner_delete.spec.ts +++ b/src/tests/runners/runner_delete.spec.ts @@ -55,4 +55,98 @@ describe('add+delete', () => { expect(res4.status).toEqual(404); expect(res4.headers['content-type']).toContain("application/json") }); +}); +// --------------- +describe('DELETE donor with donations invalid', () => { + let added_donor; + let added_org; + let added_runner; + it('creating a new donor with only needed params should return 200', async () => { + const res = await axios.post(base + '/api/donors', { + "firstname": "first", + "lastname": "last" + }, axios_config); + added_donor = res.data + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new org with just a name should return 200', async () => { + const res = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + added_org = res.data + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new runner with only needed params should return 200', async () => { + const res = await axios.post(base + '/api/runners', { + "firstname": "first", + "lastname": "last", + "group": added_org.id + }, axios_config); + added_runner = res.data; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new distance donation should return 200', async () => { + const res = await axios.post(base + '/api/donations/distance', { + "runner": added_runner.id, + "amountPerDistance": 100, + "donor": added_donor.id + }, axios_config); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('delete runner w/o force', async () => { + const res = await axios.delete(base + '/api/runners/' + added_runner.id, axios_config); + expect(res.status).toEqual(406); + expect(res.headers['content-type']).toContain("application/json") + }); +}); +// --------------- +describe('DELETE donor with donations valid', () => { + let added_donor; + let added_org; + let added_runner; + it('creating a new donor with only needed params should return 200', async () => { + const res = await axios.post(base + '/api/donors', { + "firstname": "first", + "lastname": "last" + }, axios_config); + added_donor = res.data + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new org with just a name should return 200', async () => { + const res = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + added_org = res.data + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new runner with only needed params should return 200', async () => { + const res = await axios.post(base + '/api/runners', { + "firstname": "first", + "lastname": "last", + "group": added_org.id + }, axios_config); + added_runner = res.data; + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('creating a new distance donation should return 200', async () => { + const res = await axios.post(base + '/api/donations/distance', { + "runner": added_runner.id, + "amountPerDistance": 100, + "donor": added_donor.id + }, axios_config); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); + it('delete donor w/ force ', async () => { + const res = await axios.delete(base + '/api/runners/' + added_runner.id + "?force=true", axios_config); + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + }); }); \ No newline at end of file