feat: migrate RegisterComponent to Django Rest

This commit is contained in:
Chneemann 2025-04-05 20:32:07 +02:00
parent b02ebe78ba
commit 4b7912324d
7 changed files with 74 additions and 42 deletions

View file

@ -47,17 +47,17 @@
}} }}
</div> </div>
<input <input
type="mail" type="email"
id="mail" id="email"
name="mail" name="email"
#mail="ngModel" #mail="ngModel"
placeholder="{{ 'register.email' | translate }}" placeholder="{{ 'register.email' | translate }}"
class="custom-input" class="custom-input"
autocomplete="email" autocomplete="email"
[(ngModel)]="registerData.mail" [(ngModel)]="registerData.email"
required required
/> />
@if(!registerData.mail) { @if(!registerData.email) {
<img <img
class="custom-img" class="custom-img"
src="./../../../assets/img/login/mail.svg" src="./../../../assets/img/login/mail.svg"
@ -68,14 +68,14 @@
} }
<div class="error-msg"> <div class="error-msg">
@if(!mail.valid && mail.touched && @if(!mail.valid && mail.touched &&
!checkIfUserEmailIsValid(registerData.mail.toLowerCase()) && !isEmailValid(registerData.email.toLowerCase()) &&
!isButtonDisabled()) { !isButtonDisabled()) {
<p>{{ "register.errorMail0" | translate }}</p> <p>{{ "register.errorMail0" | translate }}</p>
} @else { @if (mail.touched && } @else { @if (mail.touched &&
!checkIfUserEmailIsValid(registerData.mail.toLowerCase()) && !isEmailValid(registerData.email.toLowerCase()) &&
!isButtonDisabled()) { !isButtonDisabled()) {
<p>{{ "register.errorMail1" | translate }}</p> <p>{{ "register.errorMail1" | translate }}</p>
} @else { @if (existEmailOnServer(registerData.mail.toLowerCase()) && } @else { @if (errorHttpMessage === 'Email already exists' &&
!isButtonDisabled()) { !isButtonDisabled()) {
<p>{{ "register.errorMail2" | translate }}</p> <p>{{ "register.errorMail2" | translate }}</p>
} } } } } }
@ -109,7 +109,7 @@
<div class="error-msg"> <div class="error-msg">
@if (!password.valid && password.touched && !isButtonDisabled()) { @if (!password.valid && password.touched && !isButtonDisabled()) {
<p>{{ "register.errorPassword0" | translate }}</p> <p>{{ "register.errorPassword0" | translate }}</p>
} @else { @if (registerData.password.length < 6 && password.touched && } @else { @if (registerData.password.length < 8 && password.touched &&
!isButtonDisabled()) { !isButtonDisabled()) {
<p>{{ "register.errorPassword1" | translate }}</p> <p>{{ "register.errorPassword1" | translate }}</p>
} } } }
@ -181,14 +181,14 @@
[value]="'register.signup' | translate" [value]="'register.signup' | translate"
[disabled]=" [disabled]="
mail.invalid || mail.invalid ||
!registerData.mail || !registerData.email ||
password.invalid || password.invalid ||
!registerData.password || !registerData.password ||
!checkbox.valid || !checkbox.valid ||
isButtonDisabled() || isButtonDisabled() ||
registerData.password.length < 6 || registerData.password.length < 6 ||
registerData.password !== registerData.passwordConfirm || registerData.password !== registerData.passwordConfirm ||
!checkIfUserEmailIsValid(registerData.mail) !isEmailValid(registerData.email)
" "
></app-form-btn> ></app-form-btn>
</div> </div>

View file

@ -10,6 +10,7 @@ import { RouterModule } from '@angular/router';
import { TranslateModule, TranslateService } from '@ngx-translate/core'; import { TranslateModule, TranslateService } from '@ngx-translate/core';
import { ButtonStateService } from '../../../services/button-state.service'; import { ButtonStateService } from '../../../services/button-state.service';
import { LoginLoaderComponent } from '../login-loader/login-loader.component'; import { LoginLoaderComponent } from '../login-loader/login-loader.component';
import { AuthService } from '../../../services/auth.service';
@Component({ @Component({
selector: 'app-register', selector: 'app-register',
@ -29,11 +30,13 @@ import { LoginLoaderComponent } from '../login-loader/login-loader.component';
styleUrl: './register.component.scss', styleUrl: './register.component.scss',
}) })
export class RegisterComponent { export class RegisterComponent {
errorHttpMessage: string = '';
registerData = { registerData = {
name: '', name: '',
firstName: '', firstName: '',
lastName: '', lastName: '',
mail: '', email: '',
password: '', password: '',
passwordConfirm: '', passwordConfirm: '',
checkboxState: '', checkboxState: '',
@ -42,14 +45,23 @@ export class RegisterComponent {
constructor( constructor(
public loginService: LoginService, public loginService: LoginService,
public translateService: TranslateService, public translateService: TranslateService,
private authService: AuthService,
private buttonStateService: ButtonStateService private buttonStateService: ButtonStateService
) {} ) {}
onSubmit(ngForm: NgForm) { async onSubmit(ngForm: NgForm) {
this.buttonStateService.enableButton(); this.buttonStateService.disableButton();
if (ngForm.submitted && ngForm.form.valid) { if (ngForm.submitted && ngForm.form.valid) {
this.splitName(); this.extractFirstAndLastName();
this.loginService.register(this.registerData); try {
await this.authService.register(this.registerData);
this.buttonStateService.enableButton();
} catch (error: any) {
this.errorHttpMessage = error.message;
this.buttonStateService.enableButton();
}
} else {
this.buttonStateService.enableButton();
} }
} }
@ -57,17 +69,13 @@ export class RegisterComponent {
return this.buttonStateService.isButtonDisabled; return this.buttonStateService.isButtonDisabled;
} }
splitName() { extractFirstAndLastName() {
const names = this.registerData.name.split(' '); const names = this.registerData.name.split(' ');
this.registerData.firstName = names[0]; this.registerData.firstName = names[0];
this.registerData.lastName = names.slice(1).join(' '); this.registerData.lastName = names.slice(1).join(' ');
} }
existEmailOnServer(mail: string) { isEmailValid(emailValue: string) {
return false; //TODO
}
checkIfUserEmailIsValid(emailValue: string) {
const emailRegex = /^[\w.%+-]+@[\w.-]+\.[a-zA-Z]{2,}$/; const emailRegex = /^[\w.%+-]+@[\w.-]+\.[a-zA-Z]{2,}$/;
if (emailRegex.test(emailValue)) { if (emailRegex.test(emailValue)) {
return true; return true;

View file

@ -60,6 +60,19 @@ export class AuthService {
} }
} }
async register(credentials: any): Promise<void> {
try {
await lastValueFrom(
this.apiService.request('POST', `/auth/register/`, credentials)
);
this.router.navigate(['/login']);
this.toastNotificationService.registerSuccessToast();
} catch (error: any) {
console.error('Registration failed:', error);
throw new Error(error?.error?.error);
}
}
checkAuthUser(): Observable<boolean> { checkAuthUser(): Observable<boolean> {
return this.apiService.request('GET', `/auth/`).pipe( return this.apiService.request('GET', `/auth/`).pipe(
map(() => true), map(() => true),

View file

@ -37,6 +37,10 @@ export class ErrorNotificationService {
errorMessage = errorMessage =
'The request timed out. Please check your connection and try again later.'; 'The request timed out. Please check your connection and try again later.';
break; break;
case 409:
errorMessage =
'The email is already in use. Please choose a different email or log in if you already have an account.';
break;
case 500: case 500:
errorMessage = errorMessage =
'There was a problem on the server. Please try again later or contact support if the issue persists.'; 'There was a problem on the server. Please try again later or contact support if the issue persists.';

View file

@ -22,6 +22,13 @@ export class ToastNotificationService {
); );
} }
registerSuccessToast(): void {
this.createSuccessToast(
'You have successfully registered. Please log in.',
'Registration Successful'
);
}
showSessionExpiredMessage(): void { showSessionExpiredMessage(): void {
this.createInfoToast( this.createInfoToast(
'Your session has expired, please log in again.', 'Your session has expired, please log in again.',

View file

@ -35,16 +35,16 @@
"passwordConfirm": "Passwort bestätigen", "passwordConfirm": "Passwort bestätigen",
"privacyPolicy0": "Ich akzeptiere die", "privacyPolicy0": "Ich akzeptiere die",
"privacyPolicy1": "Datenschutzerklärung", "privacyPolicy1": "Datenschutzerklärung",
"privacyPolicyError": "Sie müssen die Datenschutzbestimmungen akzeptieren!", "privacyPolicyError": "Sie müssen die Datenschutzbestimmungen akzeptieren",
"errorPattern": "Bitte nur Buchstaben und Leerzeichen verwenden!", "errorPattern": "Bitte nur Buchstaben und Leerzeichen verwenden",
"errorName": "Sie müssen einen Namen eingeben!", "errorName": "Sie müssen einen Namen eingeben",
"errorMail0": "Sie müssen eine E-Mail Adresse eingeben!", "errorMail0": "Sie müssen eine E-Mail Adresse eingeben",
"errorMail1": "Dies ist kein gültiges E-Mail-Format!", "errorMail1": "Dies ist kein gültiges E-Mail-Format",
"errorMail2": "Diese E-Mail existiert bereits!", "errorMail2": "Diese E-Mail existiert bereits",
"errorMail3": "Diese E-Mail existiert nicht!", "errorMail3": "Diese E-Mail existiert nicht",
"errorPassword0": "Sie müssen ein Passwort eingeben!", "errorPassword0": "Sie müssen ein Passwort eingeben",
"errorPassword1": "Das Passwort muss aus mindestens 6 Zeichen bestehen!", "errorPassword1": "Das Passwort muss aus mindestens 8 Zeichen bestehen",
"errorPassword2": "Die Passwörter stimmen nicht überein!" "errorPassword2": "Die Passwörter stimmen nicht überein"
}, },
"loginHeader": { "loginHeader": {
"notAUser": "Kein Join Nutzer?", "notAUser": "Kein Join Nutzer?",

View file

@ -35,16 +35,16 @@
"passwordConfirm": "Confirm Password", "passwordConfirm": "Confirm Password",
"privacyPolicy0": "I accept the", "privacyPolicy0": "I accept the",
"privacyPolicy1": "Privacy policy", "privacyPolicy1": "Privacy policy",
"privacyPolicyError": "You must accept the privacy policy!", "privacyPolicyError": "You must accept the privacy policy",
"errorPattern": "Please use only letters and spaces!", "errorPattern": "Please use only letters and spaces",
"errorName": "You must enter a name!", "errorName": "You must enter a name",
"errorMail0": "You must enter a mail!", "errorMail0": "You must enter a mail",
"errorMail1": "This is not a valid email format!", "errorMail1": "This is not a valid email format",
"errorMail2": "This email already exists!", "errorMail2": "This email already exists",
"errorMail3": "This email does not exist!", "errorMail3": "This email does not exist",
"errorPassword0": "You must enter a password!", "errorPassword0": "You must enter a password",
"errorPassword1": "The password must consist of at least 6 characters!", "errorPassword1": "The password must consist of at least 8 characters",
"errorPassword2": "The passwords don't match!" "errorPassword2": "The passwords don't match"
}, },
"loginHeader": { "loginHeader": {
"notAUser": "Not a Join user?", "notAUser": "Not a Join user?",