Compare commits
	
		
			2 Commits
		
	
	
		
			c7a925b997
			...
			840da350e4
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 840da350e4 | |||
| bd94c42eae | 
| @@ -70,6 +70,9 @@ class AuthServiceABC(ABC): | |||||||
|     @abstractmethod |     @abstractmethod | ||||||
|     async def login_async(self, user_dto: AuthUserDTO) -> TokenDTO: pass |     async def login_async(self, user_dto: AuthUserDTO) -> TokenDTO: pass | ||||||
|  |  | ||||||
|  |     @abstractmethod | ||||||
|  |     async def login_discord_async(self, oauth_dto: AuthUserDTO) -> TokenDTO: pass | ||||||
|  |  | ||||||
|     @abstractmethod |     @abstractmethod | ||||||
|     async def refresh_async(self, token_dto: TokenDTO) -> TokenDTO: pass |     async def refresh_async(self, token_dto: TokenDTO) -> TokenDTO: pass | ||||||
|  |  | ||||||
|   | |||||||
| @@ -82,8 +82,18 @@ class AuthDiscordController: | |||||||
|         ), response['id']) |         ), response['id']) | ||||||
|         return jsonify(result.to_dict()) |         return jsonify(result.to_dict()) | ||||||
|  |  | ||||||
|     @Route.post(f'{BasePath}/register') |     @Route.get(f'{BasePath}/login') | ||||||
|     async def discord_register(self): |     async def discord_login(self) -> Response: | ||||||
|         dto: OAuthDTO = JSONProcessor.process(OAuthDTO, request.get_json(force=True, silent=True)) |         response = self._get_user_from_discord_response() | ||||||
|         await self._auth_service.add_auth_user_by_oauth_async(dto) |         dto = AuthUserDTO( | ||||||
|         return '', 200 |             0, | ||||||
|  |             response['username'], | ||||||
|  |             response['discriminator'], | ||||||
|  |             response['email'], | ||||||
|  |             str(uuid.uuid4()), | ||||||
|  |             None, | ||||||
|  |             AuthRoleEnum.normal | ||||||
|  |         ) | ||||||
|  |  | ||||||
|  |         result = await self._auth_service.login_discord_async(dto) | ||||||
|  |         return jsonify(result.to_dict()) | ||||||
|   | |||||||
| @@ -460,6 +460,24 @@ class AuthService(AuthServiceABC): | |||||||
|         self._db.save_changes() |         self._db.save_changes() | ||||||
|         return TokenDTO(token, refresh_token) |         return TokenDTO(token, refresh_token) | ||||||
|  |  | ||||||
|  |     async def login_discord_async(self, user_dto: AuthUserDTO) -> TokenDTO: | ||||||
|  |         if user_dto is None: | ||||||
|  |             raise ServiceException(ServiceErrorCode.InvalidData, 'User not set') | ||||||
|  |  | ||||||
|  |         db_user = self._auth_users.find_auth_user_by_email(user_dto.email) | ||||||
|  |         if db_user is None: | ||||||
|  |             await self.add_auth_user_async(user_dto) | ||||||
|  |             # raise ServiceException(ServiceErrorCode.InvalidUser, f'User not found') | ||||||
|  |  | ||||||
|  |         db_user = self._auth_users.get_auth_user_by_email(user_dto.email) | ||||||
|  |         token = self.generate_token(db_user) | ||||||
|  |         refresh_token = self._create_and_save_refresh_token(db_user) | ||||||
|  |         if db_user.forgot_password_id is not None: | ||||||
|  |             db_user.forgot_password_id = None | ||||||
|  |  | ||||||
|  |         self._db.save_changes() | ||||||
|  |         return TokenDTO(token, refresh_token) | ||||||
|  |  | ||||||
|     async def refresh_async(self, token_dto: TokenDTO) -> TokenDTO: |     async def refresh_async(self, token_dto: TokenDTO) -> TokenDTO: | ||||||
|         if token_dto is None: |         if token_dto is None: | ||||||
|             raise ServiceException(ServiceErrorCode.InvalidData, f'Token not set') |             raise ServiceException(ServiceErrorCode.InvalidData, f'Token not set') | ||||||
|   | |||||||
							
								
								
									
										134
									
								
								kdb-web/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										134
									
								
								kdb-web/package-lock.json
									
									
									
										generated
									
									
									
								
							| @@ -1,12 +1,12 @@ | |||||||
| { | { | ||||||
|     "name": "kdb-web", |     "name": "kdb-web", | ||||||
|     "version": "0.3.dev70", |     "version": "0.3.0", | ||||||
|     "lockfileVersion": 2, |     "lockfileVersion": 2, | ||||||
|     "requires": true, |     "requires": true, | ||||||
|     "packages": { |     "packages": { | ||||||
|         "": { |         "": { | ||||||
|             "name": "kdb-web", |             "name": "kdb-web", | ||||||
|             "version": "0.3.dev70", |             "version": "0.3.0", | ||||||
|             "dependencies": { |             "dependencies": { | ||||||
|                 "@angular/animations": "^14.0.0", |                 "@angular/animations": "^14.0.0", | ||||||
|                 "@angular/common": "^14.0.0", |                 "@angular/common": "^14.0.0", | ||||||
| @@ -25,7 +25,6 @@ | |||||||
|                 "primeng": "^14.1.2", |                 "primeng": "^14.1.2", | ||||||
|                 "rxjs": "~7.5.0", |                 "rxjs": "~7.5.0", | ||||||
|                 "socket.io-client": "^4.5.3", |                 "socket.io-client": "^4.5.3", | ||||||
|                 "tslib": "^2.3.0", |  | ||||||
|                 "zone.js": "~0.11.4" |                 "zone.js": "~0.11.4" | ||||||
|             }, |             }, | ||||||
|             "devDependencies": { |             "devDependencies": { | ||||||
| @@ -33,14 +32,14 @@ | |||||||
|                 "@angular/cli": "~14.0.0", |                 "@angular/cli": "~14.0.0", | ||||||
|                 "@angular/compiler-cli": "^14.0.0", |                 "@angular/compiler-cli": "^14.0.0", | ||||||
|                 "@types/jasmine": "~4.0.0", |                 "@types/jasmine": "~4.0.0", | ||||||
|                 "@types/node": "^18.8.3", |                 "@types/node": "^18.11.9", | ||||||
|                 "jasmine-core": "~4.1.0", |                 "jasmine-core": "~4.1.0", | ||||||
|                 "karma": "~6.3.0", |                 "karma": "~6.3.0", | ||||||
|                 "karma-chrome-launcher": "~3.1.0", |                 "karma-chrome-launcher": "~3.1.0", | ||||||
|                 "karma-coverage": "~2.2.0", |                 "karma-coverage": "~2.2.0", | ||||||
|                 "karma-jasmine": "~5.0.0", |                 "karma-jasmine": "~5.0.0", | ||||||
|                 "karma-jasmine-html-reporter": "~1.7.0", |                 "karma-jasmine-html-reporter": "~1.7.0", | ||||||
|                 "ts-node": "~8.3.0", |                 "tslib": "^2.4.1", | ||||||
|                 "typescript": "~4.7.2" |                 "typescript": "~4.7.2" | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
| @@ -222,6 +221,12 @@ | |||||||
|             "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", |             "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", | ||||||
|             "dev": true |             "dev": true | ||||||
|         }, |         }, | ||||||
|  |         "node_modules/@angular-devkit/build-angular/node_modules/tslib": { | ||||||
|  |             "version": "2.4.0", | ||||||
|  |             "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", | ||||||
|  |             "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", | ||||||
|  |             "dev": true | ||||||
|  |         }, | ||||||
|         "node_modules/@angular-devkit/build-webpack": { |         "node_modules/@angular-devkit/build-webpack": { | ||||||
|             "version": "0.1402.6", |             "version": "0.1402.6", | ||||||
|             "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1402.6.tgz", |             "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1402.6.tgz", | ||||||
| @@ -3200,9 +3205,9 @@ | |||||||
|             "dev": true |             "dev": true | ||||||
|         }, |         }, | ||||||
|         "node_modules/@types/node": { |         "node_modules/@types/node": { | ||||||
|             "version": "18.11.0", |             "version": "18.11.9", | ||||||
|             "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.0.tgz", |             "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", | ||||||
|             "integrity": "sha512-IOXCvVRToe7e0ny7HpT/X9Rb2RYtElG1a+VshjwT00HxrM2dWBApHQoqsI6WiY7Q03vdf2bCrIGzVrkF/5t10w==", |             "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", | ||||||
|             "dev": true |             "dev": true | ||||||
|         }, |         }, | ||||||
|         "node_modules/@types/parse-json": { |         "node_modules/@types/parse-json": { | ||||||
| @@ -3705,12 +3710,6 @@ | |||||||
|                 "node": "^12.13.0 || ^14.15.0 || >=16.0.0" |                 "node": "^12.13.0 || ^14.15.0 || >=16.0.0" | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
|         "node_modules/arg": { |  | ||||||
|             "version": "4.1.3", |  | ||||||
|             "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", |  | ||||||
|             "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", |  | ||||||
|             "dev": true |  | ||||||
|         }, |  | ||||||
|         "node_modules/argparse": { |         "node_modules/argparse": { | ||||||
|             "version": "1.0.10", |             "version": "1.0.10", | ||||||
|             "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", |             "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", | ||||||
| @@ -4982,15 +4981,6 @@ | |||||||
|             "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", |             "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", | ||||||
|             "dev": true |             "dev": true | ||||||
|         }, |         }, | ||||||
|         "node_modules/diff": { |  | ||||||
|             "version": "4.0.2", |  | ||||||
|             "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", |  | ||||||
|             "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", |  | ||||||
|             "dev": true, |  | ||||||
|             "engines": { |  | ||||||
|                 "node": ">=0.3.1" |  | ||||||
|             } |  | ||||||
|         }, |  | ||||||
|         "node_modules/dir-glob": { |         "node_modules/dir-glob": { | ||||||
|             "version": "3.0.1", |             "version": "3.0.1", | ||||||
|             "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", |             "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", | ||||||
| @@ -7881,12 +7871,6 @@ | |||||||
|                 "semver": "bin/semver.js" |                 "semver": "bin/semver.js" | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
|         "node_modules/make-error": { |  | ||||||
|             "version": "1.3.6", |  | ||||||
|             "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", |  | ||||||
|             "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", |  | ||||||
|             "dev": true |  | ||||||
|         }, |  | ||||||
|         "node_modules/make-fetch-happen": { |         "node_modules/make-fetch-happen": { | ||||||
|             "version": "9.1.0", |             "version": "9.1.0", | ||||||
|             "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", |             "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", | ||||||
| @@ -11730,32 +11714,10 @@ | |||||||
|                 "tree-kill": "cli.js" |                 "tree-kill": "cli.js" | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
|         "node_modules/ts-node": { |  | ||||||
|             "version": "8.3.0", |  | ||||||
|             "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.3.0.tgz", |  | ||||||
|             "integrity": "sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ==", |  | ||||||
|             "dev": true, |  | ||||||
|             "dependencies": { |  | ||||||
|                 "arg": "^4.1.0", |  | ||||||
|                 "diff": "^4.0.1", |  | ||||||
|                 "make-error": "^1.1.1", |  | ||||||
|                 "source-map-support": "^0.5.6", |  | ||||||
|                 "yn": "^3.0.0" |  | ||||||
|             }, |  | ||||||
|             "bin": { |  | ||||||
|                 "ts-node": "dist/bin.js" |  | ||||||
|             }, |  | ||||||
|             "engines": { |  | ||||||
|                 "node": ">=4.2.0" |  | ||||||
|             }, |  | ||||||
|             "peerDependencies": { |  | ||||||
|                 "typescript": ">=2.0" |  | ||||||
|             } |  | ||||||
|         }, |  | ||||||
|         "node_modules/tslib": { |         "node_modules/tslib": { | ||||||
|             "version": "2.4.0", |             "version": "2.4.1", | ||||||
|             "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", |             "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", | ||||||
|             "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" |             "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" | ||||||
|         }, |         }, | ||||||
|         "node_modules/type-fest": { |         "node_modules/type-fest": { | ||||||
|             "version": "0.21.3", |             "version": "0.21.3", | ||||||
| @@ -12510,15 +12472,6 @@ | |||||||
|                 "node": ">=12" |                 "node": ">=12" | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
|         "node_modules/yn": { |  | ||||||
|             "version": "3.1.1", |  | ||||||
|             "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", |  | ||||||
|             "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", |  | ||||||
|             "dev": true, |  | ||||||
|             "engines": { |  | ||||||
|                 "node": ">=6" |  | ||||||
|             } |  | ||||||
|         }, |  | ||||||
|         "node_modules/zone.js": { |         "node_modules/zone.js": { | ||||||
|             "version": "0.11.8", |             "version": "0.11.8", | ||||||
|             "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.8.tgz", |             "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.8.tgz", | ||||||
| @@ -12659,6 +12612,12 @@ | |||||||
|                             "dev": true |                             "dev": true | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|  |                 }, | ||||||
|  |                 "tslib": { | ||||||
|  |                     "version": "2.4.0", | ||||||
|  |                     "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", | ||||||
|  |                     "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", | ||||||
|  |                     "dev": true | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
| @@ -14719,9 +14678,9 @@ | |||||||
|             "dev": true |             "dev": true | ||||||
|         }, |         }, | ||||||
|         "@types/node": { |         "@types/node": { | ||||||
|             "version": "18.11.0", |             "version": "18.11.9", | ||||||
|             "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.0.tgz", |             "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", | ||||||
|             "integrity": "sha512-IOXCvVRToe7e0ny7HpT/X9Rb2RYtElG1a+VshjwT00HxrM2dWBApHQoqsI6WiY7Q03vdf2bCrIGzVrkF/5t10w==", |             "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", | ||||||
|             "dev": true |             "dev": true | ||||||
|         }, |         }, | ||||||
|         "@types/parse-json": { |         "@types/parse-json": { | ||||||
| @@ -15153,12 +15112,6 @@ | |||||||
|                 "readable-stream": "^3.6.0" |                 "readable-stream": "^3.6.0" | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
|         "arg": { |  | ||||||
|             "version": "4.1.3", |  | ||||||
|             "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", |  | ||||||
|             "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", |  | ||||||
|             "dev": true |  | ||||||
|         }, |  | ||||||
|         "argparse": { |         "argparse": { | ||||||
|             "version": "1.0.10", |             "version": "1.0.10", | ||||||
|             "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", |             "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", | ||||||
| @@ -16095,12 +16048,6 @@ | |||||||
|             "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", |             "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", | ||||||
|             "dev": true |             "dev": true | ||||||
|         }, |         }, | ||||||
|         "diff": { |  | ||||||
|             "version": "4.0.2", |  | ||||||
|             "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", |  | ||||||
|             "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", |  | ||||||
|             "dev": true |  | ||||||
|         }, |  | ||||||
|         "dir-glob": { |         "dir-glob": { | ||||||
|             "version": "3.0.1", |             "version": "3.0.1", | ||||||
|             "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", |             "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", | ||||||
| @@ -18187,12 +18134,6 @@ | |||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
|         "make-error": { |  | ||||||
|             "version": "1.3.6", |  | ||||||
|             "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", |  | ||||||
|             "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", |  | ||||||
|             "dev": true |  | ||||||
|         }, |  | ||||||
|         "make-fetch-happen": { |         "make-fetch-happen": { | ||||||
|             "version": "9.1.0", |             "version": "9.1.0", | ||||||
|             "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", |             "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", | ||||||
| @@ -20975,23 +20916,10 @@ | |||||||
|             "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", |             "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", | ||||||
|             "dev": true |             "dev": true | ||||||
|         }, |         }, | ||||||
|         "ts-node": { |  | ||||||
|             "version": "8.3.0", |  | ||||||
|             "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.3.0.tgz", |  | ||||||
|             "integrity": "sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ==", |  | ||||||
|             "dev": true, |  | ||||||
|             "requires": { |  | ||||||
|                 "arg": "^4.1.0", |  | ||||||
|                 "diff": "^4.0.1", |  | ||||||
|                 "make-error": "^1.1.1", |  | ||||||
|                 "source-map-support": "^0.5.6", |  | ||||||
|                 "yn": "^3.0.0" |  | ||||||
|             } |  | ||||||
|         }, |  | ||||||
|         "tslib": { |         "tslib": { | ||||||
|             "version": "2.4.0", |             "version": "2.4.1", | ||||||
|             "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", |             "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", | ||||||
|             "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" |             "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" | ||||||
|         }, |         }, | ||||||
|         "type-fest": { |         "type-fest": { | ||||||
|             "version": "0.21.3", |             "version": "0.21.3", | ||||||
| @@ -21518,12 +21446,6 @@ | |||||||
|             "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", |             "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", | ||||||
|             "dev": true |             "dev": true | ||||||
|         }, |         }, | ||||||
|         "yn": { |  | ||||||
|             "version": "3.1.1", |  | ||||||
|             "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", |  | ||||||
|             "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", |  | ||||||
|             "dev": true |  | ||||||
|         }, |  | ||||||
|         "zone.js": { |         "zone.js": { | ||||||
|             "version": "0.11.8", |             "version": "0.11.8", | ||||||
|             "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.8.tgz", |             "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.8.tgz", | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| { | { | ||||||
|     "name": "kdb-web", |     "name": "kdb-web", | ||||||
|     "version": "0.3.0", |     "version": "0.3.dev128", | ||||||
|     "scripts": { |     "scripts": { | ||||||
|         "ng": "ng", |         "ng": "ng", | ||||||
|         "update-version": "ts-node-esm update-version.ts", |         "update-version": "ts-node-esm update-version.ts", | ||||||
| @@ -33,7 +33,6 @@ | |||||||
|         "primeng": "^14.1.2", |         "primeng": "^14.1.2", | ||||||
|         "rxjs": "~7.5.0", |         "rxjs": "~7.5.0", | ||||||
|         "socket.io-client": "^4.5.3", |         "socket.io-client": "^4.5.3", | ||||||
|         "tslib": "^2.3.0", |  | ||||||
|         "zone.js": "~0.11.4" |         "zone.js": "~0.11.4" | ||||||
|     }, |     }, | ||||||
|     "devDependencies": { |     "devDependencies": { | ||||||
| @@ -41,13 +40,14 @@ | |||||||
|         "@angular/cli": "~14.0.0", |         "@angular/cli": "~14.0.0", | ||||||
|         "@angular/compiler-cli": "^14.0.0", |         "@angular/compiler-cli": "^14.0.0", | ||||||
|         "@types/jasmine": "~4.0.0", |         "@types/jasmine": "~4.0.0", | ||||||
|         "@types/node": "^18.8.3", |         "@types/node": "^18.11.9", | ||||||
|         "jasmine-core": "~4.1.0", |         "jasmine-core": "~4.1.0", | ||||||
|         "karma": "~6.3.0", |         "karma": "~6.3.0", | ||||||
|         "karma-chrome-launcher": "~3.1.0", |         "karma-chrome-launcher": "~3.1.0", | ||||||
|         "karma-coverage": "~2.2.0", |         "karma-coverage": "~2.2.0", | ||||||
|         "karma-jasmine": "~5.0.0", |         "karma-jasmine": "~5.0.0", | ||||||
|         "karma-jasmine-html-reporter": "~1.7.0", |         "karma-jasmine-html-reporter": "~1.7.0", | ||||||
|  |         "tslib": "^2.4.1", | ||||||
|         "typescript": "~4.7.2" |         "typescript": "~4.7.2" | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -1,60 +1,65 @@ | |||||||
| <section class="login-wrapper"> | <section class="login-wrapper"> | ||||||
|     <div class="login-form-wrapper"> |   <div class="login-form-wrapper"> | ||||||
|         <div class="login-form"> |     <div class="login-form"> | ||||||
|             <form [formGroup]="loginForm"> |       <form [formGroup]="loginForm"> | ||||||
|                 <h1>{{'auth.header' | translate}}</h1> |         <h1>{{'auth.header' | translate}}</h1> | ||||||
|                 <div class="input-field"> |         <div class="input-field"> | ||||||
|                     <input type="email" pInputText formControlName="email" placeholder="{{'auth.login.e_mail' | translate}}" [ngClass]="{ 'invalid-feedback-input': submitted && ( |           <input type="email" pInputText formControlName="email" placeholder="{{'auth.login.e_mail' | translate}}" [ngClass]="{ 'invalid-feedback-input': submitted && ( | ||||||
|                             (loginForm.controls.email.errors && loginForm.controls.email.errors['required'] || authUserAtrErrors.email.required) || |                             (loginForm.controls.email.errors && loginForm.controls.email.errors['required'] || authUserAtrErrors.email.required) || | ||||||
|                             (authUserAtrErrors.email.wrongData) || |                             (authUserAtrErrors.email.wrongData) || | ||||||
|                             (authUserAtrErrors.email.notConfirmed) |                             (authUserAtrErrors.email.notConfirmed) | ||||||
|                         )}" autocomplete="username email"> |                         )}" autocomplete="username email"> | ||||||
|                     <div *ngIf="submitted" class="invalid-feedback"> |           <div *ngIf="submitted" class="invalid-feedback"> | ||||||
|                         <div |             <div | ||||||
|                             *ngIf="loginForm.controls.email.errors && loginForm.controls.email.errors['required'] || authUserAtrErrors.email.required"> |               *ngIf="loginForm.controls.email.errors && loginForm.controls.email.errors['required'] || authUserAtrErrors.email.required"> | ||||||
|                             {{'auth.login.e_mail_required' | translate}}</div> |               {{'auth.login.e_mail_required' | translate}}</div> | ||||||
|                         <div *ngIf="authUserAtrErrors.email.wrongData">{{'auth.login.user_not_found' | translate}}</div> |             <div *ngIf="authUserAtrErrors.email.wrongData">{{'auth.login.user_not_found' | translate}}</div> | ||||||
|                         <div *ngIf="authUserAtrErrors.email.notConfirmed">{{'auth.login.e_mail_not_confirmed' | translate}}</div> |             <div *ngIf="authUserAtrErrors.email.notConfirmed">{{'auth.login.e_mail_not_confirmed' | translate}}</div> | ||||||
|                     </div> |           </div> | ||||||
|                 </div> |         </div> | ||||||
|                 <div class="input-field"> |         <div class="input-field"> | ||||||
|                     <!-- |           <!-- | ||||||
|                         !! WARNING !! |               !! WARNING !! | ||||||
|                         Bugfix from https://github.com/primefaces/primeng/issues/10788 |               Bugfix from https://github.com/primefaces/primeng/issues/10788 | ||||||
|                         styleClass="p-password p-component p-inputwrapper p-input-icon-right" |               styleClass="p-password p-component p-inputwrapper p-input-icon-right" | ||||||
|                         Remove after update! |               Remove after update! | ||||||
|                     --> |           --> | ||||||
|                     <p-password type="password" formControlName="password" placeholder="{{'auth.login.password' | translate}}" [ngClass]="{ 'invalid-feedback-input': submitted && ( |           <p-password type="password" formControlName="password" placeholder="{{'auth.login.password' | translate}}" [ngClass]="{ 'invalid-feedback-input': submitted && ( | ||||||
|                             (loginForm.controls.password.errors && loginForm.controls.password.errors['required'] || authUserAtrErrors.password.required) || |                             (loginForm.controls.password.errors && loginForm.controls.password.errors['required'] || authUserAtrErrors.password.required) || | ||||||
|                             (authUserAtrErrors.password.wrongData) |                             (authUserAtrErrors.password.wrongData) | ||||||
|                         )}" autocomplete="current-password" [toggleMask]="true" [feedback]="false" |                         )}" autocomplete="current-password" [toggleMask]="true" [feedback]="false" | ||||||
|                         styleClass="p-password p-component p-inputwrapper p-input-icon-right" |                       styleClass="p-password p-component p-inputwrapper p-input-icon-right" | ||||||
|                         ></p-password> |           ></p-password> | ||||||
|                     <div *ngIf="submitted" class="invalid-feedback"> |           <div *ngIf="submitted" class="invalid-feedback"> | ||||||
|                         <div |             <div | ||||||
|                             *ngIf="loginForm.controls.password.errors && loginForm.controls.password.errors['required'] || authUserAtrErrors.password.required"> |               *ngIf="loginForm.controls.password.errors && loginForm.controls.password.errors['required'] || authUserAtrErrors.password.required"> | ||||||
|                             {{'auth.login.password_required' | translate}}</div> |               {{'auth.login.password_required' | translate}}</div> | ||||||
|                         <div *ngIf="authUserAtrErrors.password.wrongData">{{'auth.login.wrong_password' | translate}}</div> |             <div *ngIf="authUserAtrErrors.password.wrongData">{{'auth.login.wrong_password' | translate}}</div> | ||||||
|                     </div> |           </div> | ||||||
|                 </div> |  | ||||||
|                 <div class="login-form-submit"> |  | ||||||
|                     <button pButton label="{{'auth.login.login' | translate}}" class="btn login-form-submit-btn" (click)="login()" |  | ||||||
|                         [disabled]="loginForm.invalid"></button> |  | ||||||
|                 </div> |  | ||||||
|                 <div class="login-form-sub-button-wrapper"> |  | ||||||
|                     <div class="login-form-sub-btn-wrapper"> |  | ||||||
|                         <button pButton label="{{'auth.login.register' | translate}}" class="btn login-form-sub-btn" |  | ||||||
|                             (click)="register()"></button> |  | ||||||
|                     </div> |  | ||||||
|                     <div class="login-form-sub-btn-wrapper"> |  | ||||||
|                         <button pButton label="{{'auth.login.forgot_password' | translate}}" |  | ||||||
|                             class="btn login-form-sub-btn login-form-sub-login-btn p-button-text" |  | ||||||
|                             (click)="forgotPassword()"></button> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
|             </form> |  | ||||||
|         </div> |         </div> | ||||||
|  |         <div class="login-form-submit"> | ||||||
|  |           <button pButton label="{{'auth.login.login' | translate}}" class="btn login-form-submit-btn" (click)="login()" | ||||||
|  |                   [disabled]="loginForm.invalid"></button> | ||||||
|  |         </div> | ||||||
|  |         <div class="login-form-sub-button-wrapper" *ngIf="!code && !state"> | ||||||
|  |           <div class="login-form-sub-btn-wrapper"> | ||||||
|  |             <button pButton label="{{'auth.login.login_with_discord' | translate}}" class="btn login-form-sub-btn" (click)="discordLogin()"></button> | ||||||
|  |           </div> | ||||||
|  |         </div> | ||||||
|  |         <div class="login-form-sub-button-wrapper"> | ||||||
|  |           <div class="login-form-sub-btn-wrapper"> | ||||||
|  |             <button pButton label="{{'auth.login.register' | translate}}" class="btn login-form-sub-btn" | ||||||
|  |                     (click)="register()"></button> | ||||||
|  |           </div> | ||||||
|  |           <div class="login-form-sub-btn-wrapper"> | ||||||
|  |             <button pButton label="{{'auth.login.forgot_password' | translate}}" | ||||||
|  |                     class="btn login-form-sub-btn login-form-sub-login-btn p-button-text" | ||||||
|  |                     (click)="forgotPassword()"></button> | ||||||
|  |           </div> | ||||||
|  |         </div> | ||||||
|  |       </form> | ||||||
|     </div> |     </div> | ||||||
|  |   </div> | ||||||
|  |  | ||||||
|     <app-auth-header></app-auth-header> |   <app-auth-header></app-auth-header> | ||||||
| </section> | </section> | ||||||
|   | |||||||
| @@ -1,20 +1,21 @@ | |||||||
| import { Component, OnInit } from '@angular/core'; | import { Component, OnInit } from "@angular/core"; | ||||||
| import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; | import { FormBuilder, FormControl, FormGroup, Validators } from "@angular/forms"; | ||||||
| import { AuthService } from 'src/app/services/auth/auth.service'; | import { AuthService } from "src/app/services/auth/auth.service"; | ||||||
| import { AuthUserDTO } from 'src/app/models/auth/auth-user.dto'; | import { AuthUserDTO } from "src/app/models/auth/auth-user.dto"; | ||||||
| import { Router } from '@angular/router'; | import { ActivatedRoute, Router } from "@angular/router"; | ||||||
| import { catchError } from 'rxjs/operators'; | import { catchError } from "rxjs/operators"; | ||||||
| import { ErrorDTO } from 'src/app/models/error/error-dto'; | import { ErrorDTO } from "src/app/models/error/error-dto"; | ||||||
| import { AuthErrorMessages } from 'src/app/models/auth/auth-error-messages.enum'; | import { AuthErrorMessages } from "src/app/models/auth/auth-error-messages.enum"; | ||||||
| import { ServiceErrorCode } from 'src/app/models/error/service-error-code.enum'; | import { ServiceErrorCode } from "src/app/models/error/service-error-code.enum"; | ||||||
| import { AuthUserAtrErrors } from 'src/app/models/auth/auth-user-atr-errors'; | import { AuthUserAtrErrors } from "src/app/models/auth/auth-user-atr-errors"; | ||||||
| import { SpinnerService } from 'src/app/services/spinner/spinner.service'; | import { SpinnerService } from "src/app/services/spinner/spinner.service"; | ||||||
| import { ThemeService } from 'src/app/services/theme/theme.service'; | import { ThemeService } from "src/app/services/theme/theme.service"; | ||||||
|  | import { throwError } from "rxjs"; | ||||||
|  |  | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-login', |   selector: "app-login", | ||||||
|   templateUrl: './login.component.html', |   templateUrl: "./login.component.html", | ||||||
|   styleUrls: ['./login.component.scss'] |   styleUrls: ["./login.component.scss"] | ||||||
| }) | }) | ||||||
| export class LoginComponent implements OnInit { | export class LoginComponent implements OnInit { | ||||||
|  |  | ||||||
| @@ -25,45 +26,83 @@ export class LoginComponent implements OnInit { | |||||||
|   submitted = false; |   submitted = false; | ||||||
|  |  | ||||||
|   authUserAtrErrors!: AuthUserAtrErrors; |   authUserAtrErrors!: AuthUserAtrErrors; | ||||||
|  |   code!: string; | ||||||
|  |   state!: string; | ||||||
|  |   user!: AuthUserDTO; | ||||||
|  |   oAuthId!: string; | ||||||
|  |  | ||||||
|   constructor( |   constructor( | ||||||
|     private authService: AuthService, |     private authService: AuthService, | ||||||
|     private formBuilder: FormBuilder, |     private formBuilder: FormBuilder, | ||||||
|     private router: Router, |     private router: Router, | ||||||
|     private spinnerService: SpinnerService, |     private spinnerService: SpinnerService, | ||||||
|     private themeService: ThemeService |     private themeService: ThemeService, | ||||||
|   ) { } |     private route: ActivatedRoute | ||||||
|  |   ) { | ||||||
|  |   } | ||||||
|  |  | ||||||
|   ngOnInit(): void { |   ngOnInit(): void { | ||||||
|     this.spinnerService.showSpinner(); |     this.spinnerService.showSpinner(); | ||||||
|     this.authService.isUserLoggedInAsync().then(result => { |     this.authService.isUserLoggedInAsync().then(result => { | ||||||
|       if (result) { |       if (result) { | ||||||
|         this.router.navigate(['/dashboard']); |         this.router.navigate(["/dashboard"]); | ||||||
|  |         return; | ||||||
|       } |       } | ||||||
|  |  | ||||||
|  |       this.checkDiscordLogin(); | ||||||
|       this.initLoginForm(); |       this.initLoginForm(); | ||||||
|       this.resetStateFlags(); |       this.resetStateFlags(); | ||||||
|       this.spinnerService.hideSpinner(); |       this.spinnerService.hideSpinner(); | ||||||
|     }); |     }); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   checkDiscordLogin() { | ||||||
|  |     this.route.queryParams.pipe(catchError(err => { | ||||||
|  |       this.spinnerService.hideSpinner(); | ||||||
|  |       this.router.navigate(["auth", "login"]).then(() => { | ||||||
|  |       }); | ||||||
|  |       return throwError(() => err); | ||||||
|  |     })).subscribe(params => { | ||||||
|  |         if (!params["code"] || !params["state"]) { | ||||||
|  |           this.spinnerService.hideSpinner(); | ||||||
|  |           return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         this.code = params["code"]; | ||||||
|  |         this.state = params["state"]; | ||||||
|  |         this.authService.discordLogin(this.code, this.state).pipe(catchError(err => { | ||||||
|  |           this.spinnerService.hideSpinner(); | ||||||
|  |           this.router.navigate(["auth", "login"]).then(() => { | ||||||
|  |           }); | ||||||
|  |           return throwError(() => err); | ||||||
|  |         })).subscribe(token => { | ||||||
|  |           this.authService.saveToken(token); | ||||||
|  |           this.themeService.loadTheme(); | ||||||
|  |           this.themeService.loadMenu(); | ||||||
|  |           this.spinnerService.hideSpinner(); | ||||||
|  |           this.router.navigate(["/dashboard"]); | ||||||
|  |         }); | ||||||
|  |       } | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   resetStateFlags(): void { |   resetStateFlags(): void { | ||||||
|     this.authUserAtrErrors = new AuthUserAtrErrors(); |     this.authUserAtrErrors = new AuthUserAtrErrors(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   initLoginForm(): void { |   initLoginForm(): void { | ||||||
|     this.loginForm = this.formBuilder.group({ |     this.loginForm = this.formBuilder.group({ | ||||||
|       email: ['', [Validators.required, Validators.email]], |       email: ["", [Validators.required, Validators.email]], | ||||||
|       password: ['', [Validators.required, Validators.minLength(8)]] |       password: ["", [Validators.required, Validators.minLength(8)]] | ||||||
|     }); |     }); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   register(): void { |   register(): void { | ||||||
|     this.router.navigate(['/auth/register']); |     this.router.navigate(["/auth/register"]); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   forgotPassword(): void { |   forgotPassword(): void { | ||||||
|     this.router.navigate(['/auth/forgot-password']); |     this.router.navigate(["/auth/forgot-password"]); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   login(): void { |   login(): void { | ||||||
| @@ -76,8 +115,8 @@ export class LoginComponent implements OnInit { | |||||||
|  |  | ||||||
|     this.spinnerService.showSpinner(); |     this.spinnerService.showSpinner(); | ||||||
|     const user: AuthUserDTO = { |     const user: AuthUserDTO = { | ||||||
|       firstName: '', |       firstName: "", | ||||||
|       lastName: '', |       lastName: "", | ||||||
|       email: this.loginForm.value.email ?? null, |       email: this.loginForm.value.email ?? null, | ||||||
|       password: this.loginForm.value.password ?? null |       password: this.loginForm.value.password ?? null | ||||||
|     }; |     }; | ||||||
| @@ -107,8 +146,14 @@ export class LoginComponent implements OnInit { | |||||||
|         this.themeService.loadTheme(); |         this.themeService.loadTheme(); | ||||||
|         this.themeService.loadMenu(); |         this.themeService.loadMenu(); | ||||||
|         this.spinnerService.hideSpinner(); |         this.spinnerService.hideSpinner(); | ||||||
|         this.router.navigate(['/dashboard']); |         this.router.navigate(["/dashboard"]); | ||||||
|       }); |       }); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   discordLogin() { | ||||||
|  |     this.authService.getDiscordAuthURL().subscribe(url => { | ||||||
|  |       window.location.href = url.loginUrl; | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -72,12 +72,6 @@ | |||||||
|                   [disabled]="loginForm.invalid"></button> |                   [disabled]="loginForm.invalid"></button> | ||||||
|         </div> |         </div> | ||||||
|  |  | ||||||
|         <div class="login-form-sub-button-wrapper" *ngIf="!code && !state"> |  | ||||||
|           <div class="login-form-sub-btn-wrapper"> |  | ||||||
|             <button pButton label="{{'auth.register.register_with_discord' | translate}}" class="btn login-form-sub-btn" (click)="discordLogin()"></button> |  | ||||||
|           </div> |  | ||||||
|         </div> |  | ||||||
|  |  | ||||||
|         <div class="login-form-sub-button-wrapper"> |         <div class="login-form-sub-button-wrapper"> | ||||||
|           <div class="login-form-sub-btn-wrapper"> |           <div class="login-form-sub-btn-wrapper"> | ||||||
|             <button pButton label="{{'auth.register.login' | translate}}" class="btn login-form-sub-btn" (click)="login()"></button> |             <button pButton label="{{'auth.register.login' | translate}}" class="btn login-form-sub-btn" (click)="login()"></button> | ||||||
|   | |||||||
| @@ -34,14 +34,6 @@ export class RegistrationComponent implements OnInit { | |||||||
|     password: false |     password: false | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
|   showEMailConfirmation = false; |  | ||||||
|   showEMailConfirmationError = false; |  | ||||||
|  |  | ||||||
|   code!: string; |  | ||||||
|   state!: string; |  | ||||||
|   user!: AuthUserDTO; |  | ||||||
|   oAuthId!: string; |  | ||||||
|  |  | ||||||
|   constructor( |   constructor( | ||||||
|     private authService: AuthService, |     private authService: AuthService, | ||||||
|     private formBuilder: FormBuilder, |     private formBuilder: FormBuilder, | ||||||
| @@ -62,48 +54,7 @@ export class RegistrationComponent implements OnInit { | |||||||
|     this.confirmEMail(); |     this.confirmEMail(); | ||||||
|     this.initData(); |     this.initData(); | ||||||
|     this.spinnerService.showSpinner(); |     this.spinnerService.showSpinner(); | ||||||
|     this.route.queryParams.pipe(catchError(err => { |     this.initData(); | ||||||
|       this.spinnerService.hideSpinner(); |  | ||||||
|       this.router.navigate(["auth", "login"]).then(() => { |  | ||||||
|       }); |  | ||||||
|       return throwError(() => err); |  | ||||||
|     })).subscribe(params => { |  | ||||||
|         if (!params["code"] || !params["state"]) { |  | ||||||
|           this.spinnerService.hideSpinner(); |  | ||||||
|           return; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         if (this.user) { |  | ||||||
|           this.spinnerService.hideSpinner(); |  | ||||||
|           return; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         this.code = params["code"]; |  | ||||||
|         this.state = params["state"]; |  | ||||||
|         this.authService.discordCreateUser(this.code, this.state).pipe(catchError(err => { |  | ||||||
|           this.spinnerService.hideSpinner(); |  | ||||||
|           this.router.navigate(["auth", "login"]).then(() => { |  | ||||||
|           }); |  | ||||||
|           return throwError(() => err); |  | ||||||
|         })).subscribe(oAuthDTO => { |  | ||||||
|             if (oAuthDTO) { |  | ||||||
|               this.user = oAuthDTO.user; |  | ||||||
|               this.oAuthId = oAuthDTO.oAuthId; |  | ||||||
|             } |  | ||||||
|             if (this.user && !this.oAuthId) { |  | ||||||
|               this.router.navigate(["auth", "login"]).then(() => { |  | ||||||
|               }); |  | ||||||
|               return; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             this.router.navigate(["auth", "register"]).then(() => { |  | ||||||
|             }); |  | ||||||
|             this.initData(); |  | ||||||
|           } |  | ||||||
|         ); |  | ||||||
|         this.initData(); |  | ||||||
|       } |  | ||||||
|     ); |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   initData() { |   initData() { | ||||||
| @@ -126,18 +77,13 @@ export class RegistrationComponent implements OnInit { | |||||||
|  |  | ||||||
|   initLoginForm(): void { |   initLoginForm(): void { | ||||||
|     this.loginForm = this.formBuilder.group({ |     this.loginForm = this.formBuilder.group({ | ||||||
|       firstName: [this.user ? this.user.firstName : "", Validators.required], |       firstName: ["", Validators.required], | ||||||
|       lastName: [this.user ? this.user.lastName : "", Validators.required], |       lastName: ["", Validators.required], | ||||||
|       email: [this.user ? this.user.email : "", [Validators.required, Validators.email]], |       email: ["", [Validators.required, Validators.email]], | ||||||
|       emailRepeat: [this.user ? this.user.email : "", [Validators.required, Validators.email]], |       emailRepeat: ["", [Validators.required, Validators.email]], | ||||||
|       password: [this.user ? this.user.password : "", [Validators.required, Validators.minLength(8)]], |       password: ["", [Validators.required, Validators.minLength(8)]], | ||||||
|       passwordRepeat: [this.user ? this.user.password : "", [Validators.required, Validators.minLength(8)]] |       passwordRepeat: ["", [Validators.required, Validators.minLength(8)]] | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     if (this.user) { |  | ||||||
|       this.loginForm.controls.email.disable(); |  | ||||||
|       this.loginForm.controls.emailRepeat.disable(); |  | ||||||
|     } |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   register(): void { |   register(): void { | ||||||
| @@ -160,42 +106,10 @@ export class RegistrationComponent implements OnInit { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     this.spinnerService.showSpinner(); |     this.spinnerService.showSpinner(); | ||||||
|     if (this.user && this.oAuthId) { |  | ||||||
|       this.registerWithOAuth(); |  | ||||||
|       return; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     this.registerLocal(); |     this.registerLocal(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   private registerWithOAuth() { |  | ||||||
|     const oAuthDTO: OAuthDTO = { |  | ||||||
|       user: { |  | ||||||
|         firstName: this.loginForm.value.firstName ?? this.user.firstName, |  | ||||||
|         lastName: this.loginForm.value.lastName ?? this.user.lastName, |  | ||||||
|         email: this.loginForm.value.email ?? this.user.email, |  | ||||||
|         password: this.loginForm.value.password ?? null |  | ||||||
|       }, |  | ||||||
|       oAuthId: this.oAuthId |  | ||||||
|     }; |  | ||||||
|     this.authService.discordRegister(oAuthDTO) |  | ||||||
|       .pipe(catchError(error => { |  | ||||||
|         if (error.error !== null) { |  | ||||||
|           const err: ErrorDTO = error.error; |  | ||||||
|  |  | ||||||
|           if (err.errorCode === ServiceErrorCode.InvalidUser && err.message === AuthErrorMessages.UserAlreadyExists) { |  | ||||||
|             this.authUserAtrErrors.email.wrongData = true; |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|         this.spinnerService.hideSpinner(); |  | ||||||
|         throw error; |  | ||||||
|       })) |  | ||||||
|       .subscribe(resp => { |  | ||||||
|         this.spinnerService.hideSpinner(); |  | ||||||
|         this.router.navigate(["/auth/login"]); |  | ||||||
|       }); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   private registerLocal() { |   private registerLocal() { | ||||||
|     const user: AuthUserDTO = { |     const user: AuthUserDTO = { | ||||||
|       firstName: this.loginForm.value.firstName ?? null, |       firstName: this.loginForm.value.firstName ?? null, | ||||||
| @@ -237,10 +151,4 @@ export class RegistrationComponent implements OnInit { | |||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   discordLogin() { |  | ||||||
|     this.authService.getDiscordAuthURL().subscribe(url => { |  | ||||||
|       window.location.href = url.loginUrl; |  | ||||||
|     }); |  | ||||||
|   } |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -167,6 +167,7 @@ export class AuthService { | |||||||
|       }) |       }) | ||||||
|     }); |     }); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   discordCreateUser(code: string, state: string) { |   discordCreateUser(code: string, state: string) { | ||||||
|     return this.http.get<OAuthDTO>(`${this.appsettings.getApiURL()}/api/auth/discord/create-user?code=${code}&state=${state}`, { |     return this.http.get<OAuthDTO>(`${this.appsettings.getApiURL()}/api/auth/discord/create-user?code=${code}&state=${state}`, { | ||||||
|       headers: new HttpHeaders({ |       headers: new HttpHeaders({ | ||||||
| @@ -175,6 +176,14 @@ export class AuthService { | |||||||
|     }); |     }); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   discordLogin(code: string, state: string): Observable<TokenDTO> { | ||||||
|  |     return this.http.get<TokenDTO>(`${this.appsettings.getApiURL()}/api/auth/discord/login?code=${code}&state=${state}`, { | ||||||
|  |       headers: new HttpHeaders({ | ||||||
|  |         'Content-Type': 'application/json' | ||||||
|  |       }) | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   // /api/auth/discord/register?code= |   // /api/auth/discord/register?code= | ||||||
|   discordRegister(oAuthDTO: OAuthDTO) { |   discordRegister(oAuthDTO: OAuthDTO) { | ||||||
|     return this.http.post(`${this.appsettings.getApiURL()}/api/auth/discord/register`, oAuthDTO, { |     return this.http.post(`${this.appsettings.getApiURL()}/api/auth/discord/register`, oAuthDTO, { | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ | |||||||
|     "WebVersion": { |     "WebVersion": { | ||||||
|         "Major": "0", |         "Major": "0", | ||||||
|         "Minor": "3", |         "Minor": "3", | ||||||
|         "Micro": "dev70" |         "Micro": "dev128" | ||||||
|     }, |     }, | ||||||
|     "Themes": [ |     "Themes": [ | ||||||
|         { |         { | ||||||
|   | |||||||
| @@ -93,6 +93,7 @@ | |||||||
|       "e_mail": "E-Mail", |       "e_mail": "E-Mail", | ||||||
|       "password": "Passwort", |       "password": "Passwort", | ||||||
|       "login": "Einloggen", |       "login": "Einloggen", | ||||||
|  |       "login_with_discord": "Mit Discord Einloggen", | ||||||
|       "register": "Registrieren", |       "register": "Registrieren", | ||||||
|       "forgot_password": "Passwort vergessen?", |       "forgot_password": "Passwort vergessen?", | ||||||
|       "e_mail_required": "E-Mail benötigt", |       "e_mail_required": "E-Mail benötigt", | ||||||
|   | |||||||
| @@ -373,7 +373,7 @@ footer { | |||||||
|     .login-form-wrapper, |     .login-form-wrapper, | ||||||
|     .auth-header { |     .auth-header { | ||||||
|         width: 350px; |         width: 350px; | ||||||
|         height: 350px; |         height: 450px; | ||||||
|  |  | ||||||
|         display: flex; |         display: flex; | ||||||
|         justify-content: center; |         justify-content: center; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user