Compare commits

..

14 Commits

Author SHA1 Message Date
2b641faa29 📖New license file version [CI SKIP] [skip ci] 2023-02-02 11:52:17 +00:00
9fa8b93c08 🧾New changelog file version [CI SKIP] [skip ci] 2023-02-02 11:51:42 +00:00
4b676bc853 Merge pull request 'feature/197-duplicate_runner_mail' (#198) from feature/197-duplicate_runner_mail into dev
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #198
2023-02-02 11:51:23 +00:00
4433ddb1e1 Updated logo url
All checks were successful
continuous-integration/drone/pr Build is passing
2023-02-02 11:24:04 +01:00
39aa7598b7 Updated tests for new login in selfservice
All checks were successful
continuous-integration/drone/pr Build is passing
ref #197
2023-02-02 11:18:45 +01:00
19a290c3a9 Fixed typo 2023-02-02 11:17:18 +01:00
9bc80aac8a Updated selfservice tests to prevent email duplication
ref #197
2023-02-02 11:14:48 +01:00
e184673963 Added faker for testing
ref #197
2023-02-02 11:10:04 +01:00
68cd746a9f Added selfservice runner create check to prevent duplicate email
ref #197
2023-02-02 11:08:36 +01:00
69651d9f6c Rename selfservice forgot to login
ref #197
2023-02-02 11:03:12 +01:00
6fd246f43c 📖New license file version [CI SKIP] [skip ci] 2023-02-02 09:24:02 +00:00
ae14d6c74f 🧾New changelog file version [CI SKIP] [skip ci] 2023-02-02 09:23:34 +00:00
2fa56b82d1 Add git for changelog fun
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-02 10:23:11 +01:00
9cc66eebdf depends_on: ["clone"]
Some checks failed
continuous-integration/drone/push Build is failing
2023-02-02 10:21:19 +01:00
11 changed files with 277 additions and 133 deletions

View File

@@ -61,6 +61,7 @@ steps:
- git clone $DRONE_REMOTE_URL . - git clone $DRONE_REMOTE_URL .
- git checkout dev - git checkout dev
- name: build dev - name: build dev
depends_on: ["clone"]
image: registry.odit.services/library/drone-kaniko image: registry.odit.services/library/drone-kaniko
settings: settings:
username: username:
@@ -81,6 +82,7 @@ steps:
depends_on: ["clone"] depends_on: ["clone"]
image: registry.odit.services/hub/library/node:19.5.0-alpine3.16 image: registry.odit.services/hub/library/node:19.5.0-alpine3.16
commands: commands:
- apk add git
- npx auto-changelog --commit-limit false -p -u --hide-credit - npx auto-changelog --commit-limit false -p -u --hide-credit
- name: push new changelog to repo - name: push new changelog to repo
depends_on: ["run changelog export"] depends_on: ["run changelog export"]
@@ -134,6 +136,7 @@ steps:
- git merge main - git merge main
- git checkout main - git checkout main
- name: build latest - name: build latest
depends_on: ["clone"]
image: registry.odit.services/library/drone-kaniko image: registry.odit.services/library/drone-kaniko
settings: settings:
username: username:
@@ -173,6 +176,7 @@ name: build:tags
steps: steps:
- name: build $DRONE_TAG - name: build $DRONE_TAG
depends_on: ["clone"]
image: registry.odit.services/library/drone-kaniko image: registry.odit.services/library/drone-kaniko
settings: settings:
username: username:

View File

@@ -2,8 +2,39 @@
All notable changes to this project will be documented in this file. Dates are displayed in UTC. All notable changes to this project will be documented in this file. Dates are displayed in UTC.
#### [v0.12.0](https://git.odit.services/lfk/backend/compare/v0.12.0...v0.12.0)
- Merge pull request 'feature/197-duplicate_runner_mail' (#198) from feature/197-duplicate_runner_mail into dev [`4b676bc`](https://git.odit.services/lfk/backend/commit/4b676bc85336c2d494e9e74823d38deec5cc0400)
- Added faker for testing [`e184673`](https://git.odit.services/lfk/backend/commit/e1846739638905aab6ba7e059fd2cbf8ff467bf3)
- Updated selfservice tests to prevent email duplication [`9bc80aa`](https://git.odit.services/lfk/backend/commit/9bc80aac8aab9b4dedc26c9bc3ce705d7fe9c0bf)
- 🧾New changelog file version [CI SKIP] [skip ci] [`ae14d6c`](https://git.odit.services/lfk/backend/commit/ae14d6c74f9205440b41ca5fdbd052ca449148fc)
- Added selfservice runner create check to prevent duplicate email [`68cd746`](https://git.odit.services/lfk/backend/commit/68cd746a9f3360b3630a9ba570213d2aa62497b4)
- Updated tests for new login in selfservice [`39aa759`](https://git.odit.services/lfk/backend/commit/39aa7598b7cd0ecb0f077f50ebdd31c6e205f06d)
- Updated logo url [`4433ddb`](https://git.odit.services/lfk/backend/commit/4433ddb1e15a35481728670e22049200644bf337)
- depends_on: ["clone"] [`9cc66ee`](https://git.odit.services/lfk/backend/commit/9cc66eebdfe8e7a2888bbc97197d1756ff44de30)
- Fixed typo [`19a290c`](https://git.odit.services/lfk/backend/commit/19a290c3a931ead0d9ae9ebb0985bfbaac54df59)
- Rename selfservice forgot to login [`69651d9`](https://git.odit.services/lfk/backend/commit/69651d9f6cd826b6d4720f164897a2a72a57c851)
- 📖New license file version [CI SKIP] [skip ci] [`6fd246f`](https://git.odit.services/lfk/backend/commit/6fd246f43cb3f4d0ccb6e017ee699889ba17daac)
- Add git for changelog fun [`2fa56b8`](https://git.odit.services/lfk/backend/commit/2fa56b82d1e082a1deae943e5fca5101f24e3ef5)
#### [v0.12.0](https://git.odit.services/lfk/backend/compare/v0.11.1...v0.12.0)
> 2 February 2023
- Pinned versions [`a6d5693`](https://git.odit.services/lfk/backend/commit/a6d5693ccdeb25b15a09af8f7438142114268807)
- Drone -> Kaniko based builds [`0e78951`](https://git.odit.services/lfk/backend/commit/0e789513008085d0db94fc3b2dd9e74a5e583049)
- Drone images to odit registry [`6ad56b3`](https://git.odit.services/lfk/backend/commit/6ad56b31269bf19a740c1b6b1a303a8a9d7d59d0)
- Bumped container base images [`d95c6d3`](https://git.odit.services/lfk/backend/commit/d95c6d33657f6aa977a8ebfefad7e199bb1cc9c3)
- Enabled tag via release script [`9217421`](https://git.odit.services/lfk/backend/commit/92174212213f874e41c9472a927bcf87b963ac94)
- Pinned pnpm for builds [`4570845`](https://git.odit.services/lfk/backend/commit/4570845b3e1bd00c228fe1b09b658c24e20aba7f)
- 🚀Bumped version to v0.12.0 [`4c10e20`](https://git.odit.services/lfk/backend/commit/4c10e20b91a8101ee37b230373ceb3e024582b41)
- Ignore pnpm lock [`1f2c8ab`](https://git.odit.services/lfk/backend/commit/1f2c8abb22f3ff1e61b7350b517bd699c3e315f6)
- 🧾New changelog file version [CI SKIP] [skip ci] [`31b258b`](https://git.odit.services/lfk/backend/commit/31b258b4ce82213144160a4233b7fd127e456776)
#### [v0.11.1](https://git.odit.services/lfk/backend/compare/v0.11.0...v0.11.1) #### [v0.11.1](https://git.odit.services/lfk/backend/compare/v0.11.0...v0.11.1)
> 22 April 2021
- Merge pull request 'Release 0.11.1' (#196) from dev into main [`f19f280`](https://git.odit.services/lfk/backend/commit/f19f2808d88414f1877c01f10996dac68b6f9617) - Merge pull request 'Release 0.11.1' (#196) from dev into main [`f19f280`](https://git.odit.services/lfk/backend/commit/f19f2808d88414f1877c01f10996dac68b6f9617)
- 🧾New changelog file version [CI SKIP] [skip ci] [`2229cdf`](https://git.odit.services/lfk/backend/commit/2229cdf20db1a98f9f76a99fa9d3f463cdf6d804) - 🧾New changelog file version [CI SKIP] [skip ci] [`2229cdf`](https://git.odit.services/lfk/backend/commit/2229cdf20db1a98f9f76a99fa9d3f463cdf6d804)
- 🧾New changelog file version [CI SKIP] [skip ci] [`348fe52`](https://git.odit.services/lfk/backend/commit/348fe52c42cfa32239b703041820f725e147154e) - 🧾New changelog file version [CI SKIP] [skip ci] [`348fe52`](https://git.odit.services/lfk/backend/commit/348fe52c42cfa32239b703041820f725e147154e)

View File

@@ -454,7 +454,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
## License Text ## License Text
MIT License MIT License
Copyright (c) 2010 - 2021 Brian Carlson Copyright (c) 2010 - 2020 Brian Carlson
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
@@ -696,6 +696,75 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# @faker-js/faker
**Author**: undefined
**Repo**: [object Object]
**License**: MIT
**Description**: Generate massive amounts of fake contextual data
## License Text
Faker - Copyright (c) 2022
This software consists of voluntary contributions made by many individuals.
For exact contribution history, see the revision history
available at https://github.com/faker-js/faker
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
===
From: https://github.com/faker-js/faker/commit/a9f98046c7d5eeaabe12fc587024c06d683800b8
To: https://github.com/faker-js/faker/commit/29234378807c4141588861f69421bf20b5ac635e
Based on faker.js, copyright Marak Squires and contributor, what follows below is the original license.
===
faker.js - Copyright (c) 2020
Marak Squires
http://github.com/marak/faker.js/
faker.js was inspired by and has used data definitions from:
* https://github.com/stympy/faker/ - Copyright (c) 2007-2010 Benjamin Curtis
* http://search.cpan.org/~jasonk/Data-Faker-0.07/ - Copyright 2004-2005 by Jason Kohles
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# @odit/license-exporter # @odit/license-exporter
**Author**: ODIT.Services **Author**: ODIT.Services
**Repo**: [object Object] **Repo**: [object Object]

View File

@@ -1,108 +1,109 @@
{ {
"name": "@odit/lfk-backend", "name": "@odit/lfk-backend",
"version": "0.12.0", "version": "0.12.0",
"main": "src/app.ts", "main": "src/app.ts",
"repository": "https://git.odit.services/lfk/backend", "repository": "https://git.odit.services/lfk/backend",
"author": { "author": {
"name": "ODIT.Services", "name": "ODIT.Services",
"email": "info@odit.services", "email": "info@odit.services",
"url": "https://odit.services" "url": "https://odit.services"
}, },
"contributors": [ "contributors": [
{ {
"name": "Philipp Dormann", "name": "Philipp Dormann",
"email": "philipp@philippdormann.de", "email": "philipp@philippdormann.de",
"url": "https://philippdormann.de" "url": "https://philippdormann.de"
}, },
{ {
"name": "Nicolai Ort", "name": "Nicolai Ort",
"email": "info@nicolai-ort.com", "email": "info@nicolai-ort.com",
"url": "https://nicolai-ort.com" "url": "https://nicolai-ort.com"
} }
], ],
"license": "CC-BY-NC-SA-4.0", "license": "CC-BY-NC-SA-4.0",
"dependencies": { "dependencies": {
"@odit/class-validator-jsonschema": "2.1.1", "@odit/class-validator-jsonschema": "2.1.1",
"argon2": "0.27.1", "argon2": "0.27.1",
"axios": "0.21.1", "axios": "0.21.1",
"body-parser": "1.19.0", "body-parser": "1.19.0",
"check-password-strength": "2.0.2", "check-password-strength": "2.0.2",
"class-transformer": "0.3.1", "class-transformer": "0.3.1",
"class-validator": "0.13.1", "class-validator": "0.13.1",
"consola": "2.15.0", "consola": "2.15.0",
"cookie": "0.4.1", "cookie": "0.4.1",
"cookie-parser": "1.4.5", "cookie-parser": "1.4.5",
"cors": "2.8.5", "cors": "2.8.5",
"csvtojson": "2.0.10", "csvtojson": "2.0.10",
"dotenv": "8.2.0", "dotenv": "8.2.0",
"express": "4.17.1", "express": "4.17.1",
"jsonwebtoken": "8.5.1", "jsonwebtoken": "8.5.1",
"libphonenumber-js": "1.9.9", "libphonenumber-js": "1.9.9",
"mysql": "2.18.1", "mysql": "2.18.1",
"pg": "8.5.1", "pg": "8.5.1",
"reflect-metadata": "0.1.13", "reflect-metadata": "0.1.13",
"routing-controllers": "0.9.0-alpha.6", "routing-controllers": "0.9.0-alpha.6",
"routing-controllers-openapi": "2.2.0", "routing-controllers-openapi": "2.2.0",
"sqlite3": "5.0.0", "sqlite3": "5.0.0",
"typeorm": "0.2.30", "typeorm": "0.2.30",
"typeorm-routing-controllers-extensions": "0.2.0", "typeorm-routing-controllers-extensions": "0.2.0",
"typeorm-seeding": "1.6.1", "typeorm-seeding": "1.6.1",
"uuid": "8.3.2", "uuid": "8.3.2",
"validator": "13.5.2" "validator": "13.5.2"
}, },
"devDependencies": { "devDependencies": {
"@odit/license-exporter": "0.0.9", "@faker-js/faker": "^7.6.0",
"@types/cors": "2.8.9", "@odit/license-exporter": "0.0.9",
"@types/csvtojson": "1.1.5", "@types/cors": "2.8.9",
"@types/express": "4.17.11", "@types/csvtojson": "1.1.5",
"@types/jest": "26.0.20", "@types/express": "4.17.11",
"@types/jsonwebtoken": "8.5.0", "@types/jest": "26.0.20",
"@types/node": "14.14.22", "@types/jsonwebtoken": "8.5.0",
"@types/uuid": "8.3.0", "@types/node": "14.14.22",
"cp-cli": "2.0.0", "@types/uuid": "8.3.0",
"jest": "26.6.3", "cp-cli": "2.0.0",
"nodemon": "2.0.7", "jest": "26.6.3",
"release-it": "14.2.2", "nodemon": "2.0.7",
"rimraf": "3.0.2", "release-it": "14.2.2",
"start-server-and-test": "1.11.7", "rimraf": "3.0.2",
"ts-jest": "26.5.0", "start-server-and-test": "1.11.7",
"ts-node": "9.1.1", "ts-jest": "26.5.0",
"typedoc": "0.20.19", "ts-node": "9.1.1",
"typescript": "4.1.3" "typedoc": "0.20.19",
}, "typescript": "4.1.3"
"scripts": { },
"dev": "nodemon src/app.ts", "scripts": {
"build": "rimraf ./dist && tsc && cp-cli ./src/static ./dist/static", "dev": "nodemon src/app.ts",
"docs": "typedoc --out docs src", "build": "rimraf ./dist && tsc && cp-cli ./src/static ./dist/static",
"test": "jest", "docs": "typedoc --out docs src",
"test:watch": "jest --watchAll", "test": "jest",
"test:ci:generate_env": "ts-node scripts/create_testenv.ts", "test:watch": "jest --watchAll",
"test:ci:run": "start-server-and-test dev http://localhost:4010/api/docs/openapi.json test", "test:ci:generate_env": "ts-node scripts/create_testenv.ts",
"test:ci": "npm run test:ci:generate_env && npm run test:ci:run", "test:ci:run": "start-server-and-test dev http://localhost:4010/api/docs/openapi.json test",
"seed": "ts-node ./node_modules/typeorm/cli.js schema:sync && ts-node ./node_modules/typeorm-seeding/dist/cli.js seed", "test:ci": "npm run test:ci:generate_env && npm run test:ci:run",
"openapi:export": "ts-node scripts/openapi_export.ts", "seed": "ts-node ./node_modules/typeorm/cli.js schema:sync && ts-node ./node_modules/typeorm-seeding/dist/cli.js seed",
"licenses:export": "license-exporter --markdown", "openapi:export": "ts-node scripts/openapi_export.ts",
"release": "release-it --only-version" "licenses:export": "license-exporter --markdown",
}, "release": "release-it --only-version"
"release-it": { },
"git": { "release-it": {
"commit": true, "git": {
"requireCleanWorkingDir": false, "commit": true,
"commitMessage": "🚀Bumped version to v${version}", "requireCleanWorkingDir": false,
"requireBranch": "dev", "commitMessage": "🚀Bumped version to v${version}",
"push": true, "requireBranch": "dev",
"tag": true, "push": true,
"tagName": "v${version}", "tag": true,
"tagAnnotation": "v${version}" "tagName": "v${version}",
}, "tagAnnotation": "v${version}"
"npm": { },
"publish": false "npm": {
} "publish": false
}, }
"nodemonConfig": { },
"ignore": [ "nodemonConfig": {
"src/tests/*", "ignore": [
"docs/*" "src/tests/*",
] "docs/*"
} ]
} }
}

View File

@@ -1,6 +1,6 @@
import { Request } from "express"; import { Request } from "express";
import * as jwt from "jsonwebtoken"; import * as jwt from "jsonwebtoken";
import { Body, Delete, Get, JsonController, OnUndefined, Param, Post, QueryParam, Req, UseBefore } from 'routing-controllers'; import { BadRequestError, Body, Delete, Get, JsonController, OnUndefined, Param, Post, QueryParam, Req, UseBefore } from 'routing-controllers';
import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi'; import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi';
import { getConnectionManager, Repository } from 'typeorm'; import { getConnectionManager, Repository } from 'typeorm';
import { config } from '../config'; import { config } from '../config';
@@ -116,7 +116,7 @@ export class RunnerSelfServiceController {
return scan.toResponse(); return scan.toResponse();
} }
@Post('/runners/forgot') @Post('/runners/login')
@ResponseSchema(RunnerNotFoundError, { statusCode: 404 }) @ResponseSchema(RunnerNotFoundError, { statusCode: 404 })
@OnUndefined(ResponseEmpty) @OnUndefined(ResponseEmpty)
@OpenAPI({ description: 'Use this endpoint to reuqest a new selfservice token/link to be sent to your mail address (rate limited to one mail every 24hrs).' }) @OpenAPI({ description: 'Use this endpoint to reuqest a new selfservice token/link to be sent to your mail address (rate limited to one mail every 24hrs).' })
@@ -148,8 +148,11 @@ export class RunnerSelfServiceController {
@OpenAPI({ description: 'Create a new selfservice runner in the citizen org. <br> This endpoint shoud be used to allow "everyday citizen" to register themselves. <br> You have to provide a mail address, b/c the future we\'ll implement email verification.' }) @OpenAPI({ description: 'Create a new selfservice runner in the citizen org. <br> This endpoint shoud be used to allow "everyday citizen" to register themselves. <br> You have to provide a mail address, b/c the future we\'ll implement email verification.' })
async registerRunner(@Body({ validate: true }) createRunner: CreateSelfServiceCitizenRunner, @QueryParam("locale") locale: string = "en") { async registerRunner(@Body({ validate: true }) createRunner: CreateSelfServiceCitizenRunner, @QueryParam("locale") locale: string = "en") {
let runner = await createRunner.toEntity(); let runner = await createRunner.toEntity();
if (await this.getRunnerExistsByMail(runner.email)) {
throw new BadRequestError("E-Mail already registered")
}
runner = await this.runnerRepository.save(runner); runner = await this.runnerRepository.save(runner);
let response = new ResponseSelfServiceRunner(await this.runnerRepository.findOne(runner, { relations: ['scans', 'group', 'group.parentGroup', 'scans.track', 'cards', 'distanceDonations', 'distanceDonations.donor', 'distanceDonations.runner', 'distanceDonations.runner.scans', 'distanceDonations.runner.scans.track'] })); let response = new ResponseSelfServiceRunner(await this.runnerRepository.findOne(runner, { relations: ['scans', 'group', 'group.parentGroup', 'scans.track', 'cards', 'distanceDonations', 'distanceDonations.donor', 'distanceDonations.runner', 'distanceDonations.runner.scans', 'distanceDonations.runner.scans.track'] }));
response.token = JwtCreator.createSelfService(runner); response.token = JwtCreator.createSelfService(runner);
@@ -170,6 +173,9 @@ export class RunnerSelfServiceController {
const org = await this.getOrgansisation(token); const org = await this.getOrgansisation(token);
let runner = await createRunner.toEntity(org); let runner = await createRunner.toEntity(org);
if (await this.getRunnerExistsByMail(runner.email)) {
throw new BadRequestError("E-Mail already registered")
}
runner = await this.runnerRepository.save(runner); runner = await this.runnerRepository.save(runner);
let response = new ResponseSelfServiceRunner(await this.runnerRepository.findOne(runner, { relations: ['scans', 'group', 'group.parentGroup', 'scans.track', 'cards', 'distanceDonations', 'distanceDonations.donor', 'distanceDonations.runner', 'distanceDonations.runner.scans', 'distanceDonations.runner.scans.track'] })); let response = new ResponseSelfServiceRunner(await this.runnerRepository.findOne(runner, { relations: ['scans', 'group', 'group.parentGroup', 'scans.track', 'cards', 'distanceDonations', 'distanceDonations.donor', 'distanceDonations.runner', 'distanceDonations.runner.scans', 'distanceDonations.runner.scans.track'] }));
@@ -225,4 +231,14 @@ export class RunnerSelfServiceController {
return organization; return organization;
} }
/**
* Checks if a runner already exists
* @param email The runner's email address
* @returns Boolean (true if exists, false if not)
*/
private async getRunnerExistsByMail(email: string): Promise<boolean> {
const runner = await this.runnerRepository.findOne({ email });
return runner != undefined
}
} }

View File

@@ -114,7 +114,7 @@ export class CreateUser {
newUser.groups = await this.getGroups(); newUser.groups = await this.getGroups();
newUser.enabled = this.enabled; newUser.enabled = this.enabled;
if (!this.profilePic) { newUser.profilePic = `https://dev.lauf-fuer-kaya.de/lfk-logo.png`; } if (!this.profilePic) { newUser.profilePic = `https://lauf-fuer-kaya.de/lfk-logo.png`; }
else { newUser.profilePic = this.profilePic; } else { newUser.profilePic = this.profilePic; }
return newUser; return newUser;

View File

@@ -124,7 +124,7 @@ export class UpdateUser {
user.phone = this.phone; user.phone = this.phone;
user.groups = await this.getGroups(); user.groups = await this.getGroups();
if (!this.profilePic) { user.profilePic = `https://dev.lauf-fuer-kaya.de/lfk-logo.png`; } if (!this.profilePic) { user.profilePic = `https://lauf-fuer-kaya.de/lfk-logo.png`; }
else { user.profilePic = this.profilePic; } else { user.profilePic = this.profilePic; }
return user; return user;

View File

@@ -1,5 +1,7 @@
import { faker } from '@faker-js/faker';
import axios from 'axios'; import axios from 'axios';
import { config } from '../../config'; import { config } from '../../config';
const base = "http://localhost:" + config.internal_port const base = "http://localhost:" + config.internal_port
let access_token; let access_token;
@@ -21,7 +23,7 @@ describe('delete selfservice runner invalid', () => {
const res = await axios.post(base + '/api/runners/register', { const res = await axios.post(base + '/api/runners/register', {
"firstname": "string", "firstname": "string",
"lastname": "string", "lastname": "string",
"email": "user@example.com" "email": faker.internet.exampleEmail(),
}, axios_config); }, axios_config);
added_runner = res.data; added_runner = res.data;
expect(res.status).toEqual(200); expect(res.status).toEqual(200);
@@ -50,7 +52,7 @@ describe('delete selfservice runner valid', () => {
const res = await axios.post(base + '/api/runners/register', { const res = await axios.post(base + '/api/runners/register', {
"firstname": "string", "firstname": "string",
"lastname": "string", "lastname": "string",
"email": "user@example.com" "email": faker.internet.exampleEmail(),
}, axios_config); }, axios_config);
added_runner = res.data; added_runner = res.data;
expect(res.status).toEqual(200); expect(res.status).toEqual(200);

View File

@@ -15,20 +15,20 @@ beforeAll(async () => {
}; };
}); });
describe('POST /api/runners/me/forgot invalid syntax/mail should fail', () => { describe('POST /api/runners/me/login invalid syntax/mail should fail', () => {
it('get without mail return 404', async () => { it('get without mail return 404', async () => {
const res = await axios.post(base + '/api/runners/forgot', null, axios_config); const res = await axios.post(base + '/api/runners/login', null, axios_config);
expect(res.status).toEqual(404); expect(res.status).toEqual(404);
expect(res.headers['content-type']).toContain("application/json"); expect(res.headers['content-type']).toContain("application/json");
}); });
it('get without bs mail return 404', async () => { it('get without bs mail return 404', async () => {
const res = await axios.post(base + '/api/runners/forgot?mail=asdasdasdasdasd@tester.test.dev.lauf-fuer-kaya.de', null, axios_config); const res = await axios.post(base + '/api/runners/login?mail=asdasdasdasdasd@tester.test.dev.lauf-fuer-kaya.de', null, axios_config);
expect(res.status).toEqual(404); expect(res.status).toEqual(404);
expect(res.headers['content-type']).toContain("application/json"); expect(res.headers['content-type']).toContain("application/json");
}); });
}); });
// --------------- // ---------------
describe('POST /api/runners/me/forgot 2 times within timeout should fail', () => { describe('POST /api/runners/me/login 2 times within timeout should fail', () => {
let added_runner; let added_runner;
it('registering as citizen should return 200', async () => { it('registering as citizen should return 200', async () => {
const res = await axios.post(base + '/api/runners/register', { const res = await axios.post(base + '/api/runners/register', {
@@ -42,19 +42,19 @@ describe('POST /api/runners/me/forgot 2 times within timeout should fail', () =>
added_runner = res.data; added_runner = res.data;
}); });
it('post with valid mail should return 200', async () => { it('post with valid mail should return 200', async () => {
const res = await axios.post(base + '/api/runners/forgot?mail=' + added_runner.email, null, axios_config); const res = await axios.post(base + '/api/runners/login?mail=' + added_runner.email, null, axios_config);
expect(res.status).toEqual(200); expect(res.status).toEqual(200);
expect(res.headers['content-type']).toContain("application/json"); expect(res.headers['content-type']).toContain("application/json");
}); });
it('2nd post with valid mail should return 406', async () => { it('2nd post with valid mail should return 406', async () => {
const res = await axios.post(base + '/api/runners/forgot?mail=' + added_runner.email, null, axios_config); const res = await axios.post(base + '/api/runners/login?mail=' + added_runner.email, null, axios_config);
expect(res.status).toEqual(406); expect(res.status).toEqual(406);
expect(res.headers['content-type']).toContain("application/json"); expect(res.headers['content-type']).toContain("application/json");
}); });
}); });
// --------------- // ---------------
describe('POST /api/runners/me/forgot valid should return 200', () => { describe('POST /api/runners/me/login valid should return 200', () => {
let added_runner; let added_runner;
let new_token; let new_token;
it('registering as citizen should return 200', async () => { it('registering as citizen should return 200', async () => {
@@ -69,7 +69,7 @@ describe('POST /api/runners/me/forgot valid should return 200', () => {
added_runner = res.data; added_runner = res.data;
}); });
it('post with valid mail should return 200', async () => { it('post with valid mail should return 200', async () => {
const res = await axios.post(base + '/api/runners/forgot?mail=' + added_runner.email, null, axios_config); const res = await axios.post(base + '/api/runners/login?mail=' + added_runner.email, null, axios_config);
expect(res.status).toEqual(200); expect(res.status).toEqual(200);
expect(res.headers['content-type']).toContain("application/json"); expect(res.headers['content-type']).toContain("application/json");
new_token = res.data.token; new_token = res.data.token;

View File

@@ -1,3 +1,4 @@
import { faker } from '@faker-js/faker';
import axios from 'axios'; import axios from 'axios';
import { config } from '../../config'; import { config } from '../../config';
const base = "http://localhost:" + config.internal_port const base = "http://localhost:" + config.internal_port
@@ -30,7 +31,7 @@ describe('register + get should return 200', () => {
"firstname": "string", "firstname": "string",
"middlename": "string", "middlename": "string",
"lastname": "string", "lastname": "string",
"email": "user@example.com" "email": faker.internet.exampleEmail(),
}, axios_config); }, axios_config);
expect(res.status).toEqual(200); expect(res.status).toEqual(200);
expect(res.headers['content-type']).toContain("application/json"); expect(res.headers['content-type']).toContain("application/json");

View File

@@ -1,3 +1,4 @@
import { faker } from '@faker-js/faker';
import axios from 'axios'; import axios from 'axios';
import { config } from '../../config'; import { config } from '../../config';
const base = "http://localhost:" + config.internal_port const base = "http://localhost:" + config.internal_port
@@ -39,7 +40,7 @@ describe('register invalid citizen', () => {
const res = await axios.post(base + '/api/runners/register', { const res = await axios.post(base + '/api/runners/register', {
"middlename": "string", "middlename": "string",
"lastname": "string", "lastname": "string",
"email": "user@example.com" "email": faker.internet.exampleEmail(),
}, axios_config); }, axios_config);
expect(res.status).toEqual(400); expect(res.status).toEqual(400);
expect(res.headers['content-type']).toContain("application/json"); expect(res.headers['content-type']).toContain("application/json");
@@ -48,7 +49,7 @@ describe('register invalid citizen', () => {
const res = await axios.post(base + '/api/runners/register', { const res = await axios.post(base + '/api/runners/register', {
"firstname": "string", "firstname": "string",
"middlename": "string", "middlename": "string",
"email": "user@example.com" "email": faker.internet.exampleEmail(),
}, axios_config); }, axios_config);
expect(res.status).toEqual(400); expect(res.status).toEqual(400);
expect(res.headers['content-type']).toContain("application/json"); expect(res.headers['content-type']).toContain("application/json");
@@ -59,7 +60,26 @@ describe('register invalid citizen', () => {
"middlename": "string", "middlename": "string",
"lastname": "string", "lastname": "string",
"phone": "peter", "phone": "peter",
"email": "user@example.com" "email": faker.internet.exampleEmail(),
}, axios_config);
expect(res.status).toEqual(400);
expect(res.headers['content-type']).toContain("application/json");
});
it('registering as citizen with duplicate mail should return 400', async () => {
const mail = faker.internet.exampleEmail();
await axios.post(base + '/api/runners/register', {
"firstname": "string",
"middlename": "string",
"lastname": "string",
"phone": "peter",
"email": mail,
}, axios_config);
const res = await axios.post(base + '/api/runners/register', {
"firstname": "string",
"middlename": "string",
"lastname": "string",
"phone": "peter",
"email": mail,
}, axios_config); }, axios_config);
expect(res.status).toEqual(400); expect(res.status).toEqual(400);
expect(res.headers['content-type']).toContain("application/json"); expect(res.headers['content-type']).toContain("application/json");
@@ -71,7 +91,7 @@ describe('register citizen valid', () => {
const res = await axios.post(base + '/api/runners/register', { const res = await axios.post(base + '/api/runners/register', {
"firstname": "string", "firstname": "string",
"lastname": "string", "lastname": "string",
"email": "user@example.com" "email": faker.internet.exampleEmail(),
}, axios_config); }, axios_config);
expect(res.status).toEqual(200); expect(res.status).toEqual(200);
expect(res.headers['content-type']).toContain("application/json"); expect(res.headers['content-type']).toContain("application/json");
@@ -81,7 +101,7 @@ describe('register citizen valid', () => {
"firstname": "string", "firstname": "string",
"middlename": "string", "middlename": "string",
"lastname": "string", "lastname": "string",
"email": "user@example.com", "email": faker.internet.exampleEmail(),
"phone": "+4909132123456", "phone": "+4909132123456",
"address": { "address": {
address1: "Teststreet 1", address1: "Teststreet 1",
@@ -187,7 +207,7 @@ describe('register valid company', () => {
"firstname": "string", "firstname": "string",
"middlename": "string", "middlename": "string",
"lastname": "string", "lastname": "string",
"email": "user@example.com", "email": faker.internet.exampleEmail(),
"phone": "+4909132123456", "phone": "+4909132123456",
"address": { "address": {
address1: "Teststreet 1", address1: "Teststreet 1",
@@ -214,7 +234,7 @@ describe('register valid company', () => {
"firstname": "string", "firstname": "string",
"middlename": "string", "middlename": "string",
"lastname": "string", "lastname": "string",
"email": "user@example.com", "email": faker.internet.exampleEmail(),
"phone": "+4909132123456", "phone": "+4909132123456",
"address": { "address": {
address1: "Teststreet 1", address1: "Teststreet 1",
@@ -232,7 +252,7 @@ describe('register valid company', () => {
"firstname": "string", "firstname": "string",
"middlename": "string", "middlename": "string",
"lastname": "string", "lastname": "string",
"email": "user@example.com", "email": faker.internet.exampleEmail(),
"phone": "+4909132123456", "phone": "+4909132123456",
"address": { "address": {
address1: "Teststreet 1", address1: "Teststreet 1",