From 1ba991e959d248a599e302516b3e4adf7aa7671d Mon Sep 17 00:00:00 2001 From: AlineRinquin <90188226+AlineRinquin@users.noreply.github.com> Date: Wed, 19 Jan 2022 10:57:26 +0100 Subject: [PATCH 1/2] header et side-bar --- src/app/app-routing.module.ts | 36 ++++++++++++++++-- .../components/header/header.component.html | 11 +++++- .../components/header/header.component.scss | 4 ++ .../side-bar/side-bar.component.html | 12 +++++- .../page-account/page-account.component.html | 3 +- .../page-accueil/page-accueil.component.html | 2 +- .../page-add-member.component.html | 2 +- .../page-agenda/page-agenda.component.html | 3 +- .../page-dashboard.component.html | 3 +- .../page-delete-member.component.html | 2 +- .../page-forgot-password.component.html | 3 +- .../page-menu-semaine.component.html | 3 +- .../page-not-found.component.html | 3 +- .../page-repertoire.component.html | 3 +- .../page-reset-password.component.html | 2 +- .../page-signup/page-signup.component.html | 2 +- .../page-to-do-list.component.html | 3 +- .../page-update-member.component.html | 2 +- src/assets/images/logo-organizee.png | Bin 0 -> 48676 bytes 19 files changed, 80 insertions(+), 19 deletions(-) create mode 100644 src/assets/images/logo-organizee.png diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 0297262..fc28081 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -1,10 +1,40 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; +import { PageAccountComponent } from './pages/page-account/page-account.component'; +import { PageAccueilComponent } from './pages/page-accueil/page-accueil.component'; +import { PageAddMemberComponent } from './pages/page-add-member/page-add-member.component'; +import { PageAgendaComponent } from './pages/page-agenda/page-agenda.component'; +import { PageDashboardComponent } from './pages/page-dashboard/page-dashboard.component'; +import { PageDeleteMemberComponent } from './pages/page-delete-member/page-delete-member.component'; +import { PageForgotPasswordComponent } from './pages/page-forgot-password/page-forgot-password.component'; +import { PageMenuSemaineComponent } from './pages/page-menu-semaine/page-menu-semaine.component'; +import { PageNotFoundComponent } from './pages/page-not-found/page-not-found.component'; +import { PageRepertoireComponent } from './pages/page-repertoire/page-repertoire.component'; +import { PageResetPasswordComponent } from './pages/page-reset-password/page-reset-password.component'; +import { PageSignupComponent } from './pages/page-signup/page-signup.component'; +import { PageToDoListComponent } from './pages/page-to-do-list/page-to-do-list.component'; +import { PageUpdateMemberComponent } from './pages/page-update-member/page-update-member.component'; -const routes: Routes = []; +const routes: Routes = [ + { path: '', redirectTo: 'home', pathMatch: 'full' }, + { path: 'compte', component: PageAccountComponent }, + { path: 'accueil', component: PageAccueilComponent }, + { path: 'ajout-membre', component: PageAddMemberComponent }, + { path: 'agenda', component: PageAgendaComponent }, + { path: 'tableau-de-bord', component: PageDashboardComponent }, + { path: 'supprimer-membre', component: PageDeleteMemberComponent }, + { path: 'password-oublie', component: PageForgotPasswordComponent }, + { path: 'menu', component: PageMenuSemaineComponent }, + { path: 'repertoire', component: PageRepertoireComponent }, + { path: 'reinitialisation-password', component: PageResetPasswordComponent }, + { path: 'creation-compte', component: PageSignupComponent }, + { path: 'to-do-list', component: PageToDoListComponent }, + { path: 'modifier-membre', component: PageUpdateMemberComponent }, + { path: '**', component: PageNotFoundComponent }, +]; @NgModule({ imports: [RouterModule.forRoot(routes)], - exports: [RouterModule] + exports: [RouterModule], }) -export class AppRoutingModule { } +export class AppRoutingModule {} diff --git a/src/app/components/header/header.component.html b/src/app/components/header/header.component.html index 4f5a95d..347e558 100644 --- a/src/app/components/header/header.component.html +++ b/src/app/components/header/header.component.html @@ -1 +1,10 @@ -

header works!

+ \ No newline at end of file diff --git a/src/app/components/header/header.component.scss b/src/app/components/header/header.component.scss index e69de29..d03081d 100644 --- a/src/app/components/header/header.component.scss +++ b/src/app/components/header/header.component.scss @@ -0,0 +1,4 @@ +.navbar-brand { + position: absolute; + margin-left: 10%; +} diff --git a/src/app/components/side-bar/side-bar.component.html b/src/app/components/side-bar/side-bar.component.html index 354c895..2d7f65e 100644 --- a/src/app/components/side-bar/side-bar.component.html +++ b/src/app/components/side-bar/side-bar.component.html @@ -1 +1,11 @@ -

side-bar works!

+ diff --git a/src/app/pages/page-account/page-account.component.html b/src/app/pages/page-account/page-account.component.html index ea9a0aa..2d3d7d1 100644 --- a/src/app/pages/page-account/page-account.component.html +++ b/src/app/pages/page-account/page-account.component.html @@ -1 +1,2 @@ -

page-account works!

+ + \ No newline at end of file diff --git a/src/app/pages/page-accueil/page-accueil.component.html b/src/app/pages/page-accueil/page-accueil.component.html index 0c10a7b..e91fa55 100644 --- a/src/app/pages/page-accueil/page-accueil.component.html +++ b/src/app/pages/page-accueil/page-accueil.component.html @@ -1 +1 @@ -

page-accueil works!

+ diff --git a/src/app/pages/page-add-member/page-add-member.component.html b/src/app/pages/page-add-member/page-add-member.component.html index 762e361..e91fa55 100644 --- a/src/app/pages/page-add-member/page-add-member.component.html +++ b/src/app/pages/page-add-member/page-add-member.component.html @@ -1 +1 @@ -

page-add-member works!

+ diff --git a/src/app/pages/page-agenda/page-agenda.component.html b/src/app/pages/page-agenda/page-agenda.component.html index 72d8428..2d3d7d1 100644 --- a/src/app/pages/page-agenda/page-agenda.component.html +++ b/src/app/pages/page-agenda/page-agenda.component.html @@ -1 +1,2 @@ -

page-agenda works!

+ + \ No newline at end of file diff --git a/src/app/pages/page-dashboard/page-dashboard.component.html b/src/app/pages/page-dashboard/page-dashboard.component.html index 61383aa..2d3d7d1 100644 --- a/src/app/pages/page-dashboard/page-dashboard.component.html +++ b/src/app/pages/page-dashboard/page-dashboard.component.html @@ -1 +1,2 @@ -

page-dashboard works!

+ + \ No newline at end of file diff --git a/src/app/pages/page-delete-member/page-delete-member.component.html b/src/app/pages/page-delete-member/page-delete-member.component.html index ac3125c..e91fa55 100644 --- a/src/app/pages/page-delete-member/page-delete-member.component.html +++ b/src/app/pages/page-delete-member/page-delete-member.component.html @@ -1 +1 @@ -

page-delete-member works!

+ diff --git a/src/app/pages/page-forgot-password/page-forgot-password.component.html b/src/app/pages/page-forgot-password/page-forgot-password.component.html index 4b96e7e..dcdb48e 100644 --- a/src/app/pages/page-forgot-password/page-forgot-password.component.html +++ b/src/app/pages/page-forgot-password/page-forgot-password.component.html @@ -1 +1,2 @@ -

page-forgot-password works!

+ + diff --git a/src/app/pages/page-menu-semaine/page-menu-semaine.component.html b/src/app/pages/page-menu-semaine/page-menu-semaine.component.html index 12f35aa..2d3d7d1 100644 --- a/src/app/pages/page-menu-semaine/page-menu-semaine.component.html +++ b/src/app/pages/page-menu-semaine/page-menu-semaine.component.html @@ -1 +1,2 @@ -

page-menu-semaine works!

+ + \ No newline at end of file diff --git a/src/app/pages/page-not-found/page-not-found.component.html b/src/app/pages/page-not-found/page-not-found.component.html index cc75e49..c2ceff3 100644 --- a/src/app/pages/page-not-found/page-not-found.component.html +++ b/src/app/pages/page-not-found/page-not-found.component.html @@ -1 +1,2 @@ -

page-not-found works!

+ +

Error 404 Page Not FOUND!!!!!!!!!!!

\ No newline at end of file diff --git a/src/app/pages/page-repertoire/page-repertoire.component.html b/src/app/pages/page-repertoire/page-repertoire.component.html index 18ca94a..2d3d7d1 100644 --- a/src/app/pages/page-repertoire/page-repertoire.component.html +++ b/src/app/pages/page-repertoire/page-repertoire.component.html @@ -1 +1,2 @@ -

page-repertoire works!

+ + \ No newline at end of file diff --git a/src/app/pages/page-reset-password/page-reset-password.component.html b/src/app/pages/page-reset-password/page-reset-password.component.html index 763cd7f..e91fa55 100644 --- a/src/app/pages/page-reset-password/page-reset-password.component.html +++ b/src/app/pages/page-reset-password/page-reset-password.component.html @@ -1 +1 @@ -

page-reset-password works!

+ diff --git a/src/app/pages/page-signup/page-signup.component.html b/src/app/pages/page-signup/page-signup.component.html index c186c4f..e91fa55 100644 --- a/src/app/pages/page-signup/page-signup.component.html +++ b/src/app/pages/page-signup/page-signup.component.html @@ -1 +1 @@ -

page-signup works!

+ diff --git a/src/app/pages/page-to-do-list/page-to-do-list.component.html b/src/app/pages/page-to-do-list/page-to-do-list.component.html index 289a45d..2d3d7d1 100644 --- a/src/app/pages/page-to-do-list/page-to-do-list.component.html +++ b/src/app/pages/page-to-do-list/page-to-do-list.component.html @@ -1 +1,2 @@ -

page-to-do-list works!

+ + \ No newline at end of file diff --git a/src/app/pages/page-update-member/page-update-member.component.html b/src/app/pages/page-update-member/page-update-member.component.html index 2c55184..e91fa55 100644 --- a/src/app/pages/page-update-member/page-update-member.component.html +++ b/src/app/pages/page-update-member/page-update-member.component.html @@ -1 +1 @@ -

page-update-member works!

+ diff --git a/src/assets/images/logo-organizee.png b/src/assets/images/logo-organizee.png new file mode 100644 index 0000000000000000000000000000000000000000..8ed4e3729ecb2fb7bfde107271bb02a890468675 GIT binary patch literal 48676 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 z zH#{*0+xj)ihd~x3KBqPeZU;WAk8h=z7p*lDQfd6Xye4cFo>a1X6GKe}T*65DP4w-7686!$B=<7!DDH<|bC zdTMW7Ua(VoA|5C#UX#E{UVf(jeJIE4i~!Sb%>iqK zNHBzBB>qZ9@I#Q-xQ6v)vu9EZbxU4EC3DI>Uytv{uqEmG6Ljb}y$!W{mo#1Ta6U-Z z2T!!+z2~1Olws5uwzeRy-|QNXZU|4srrg}a%b{cZ zyUslFel2X$C z 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 Date: Wed, 19 Jan 2022 16:14:55 +0100 Subject: [PATCH 2/2] authentification / signup /signin --- package-lock.json | 5 + package.json | 1 + src/app/app-routing.module.ts | 2 +- src/app/app.module.ts | 10 +- src/app/auth.guard.spec.ts | 16 +++ src/app/auth.guard.ts | 55 +++++++++ .../components/signin/signin.component.html | 46 +++++++- .../components/signin/signin.component.scss | 31 +++++ src/app/components/signin/signin.component.ts | 33 +++++- src/app/models/membre.ts | 10 ++ .../page-accueil/page-accueil.component.html | 1 + .../page-signup/page-signup.component.html | 108 ++++++++++++++++++ .../page-signup/page-signup.component.scss | 32 ++++++ .../page-signup/page-signup.component.ts | 100 +++++++++++++++- src/app/services/auth.service.spec.ts | 16 +++ src/app/services/auth.service.ts | 58 ++++++++++ src/environments/environment.prod.ts | 4 +- src/environments/environment.ts | 4 +- 18 files changed, 517 insertions(+), 15 deletions(-) create mode 100644 src/app/auth.guard.spec.ts create mode 100644 src/app/auth.guard.ts create mode 100644 src/app/models/membre.ts create mode 100644 src/app/services/auth.service.spec.ts create mode 100644 src/app/services/auth.service.ts diff --git a/package-lock.json b/package-lock.json index 30a8de4..f3faaba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5102,6 +5102,11 @@ "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", "dev": true }, + "jwt-decode": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", + "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==" + }, "karma": { "version": "6.3.11", "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.11.tgz", diff --git a/package.json b/package.json index dcf849b..b0cd5d3 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "@angular/platform-browser-dynamic": "~13.0.0", "@angular/router": "~13.0.0", "bootstrap": "^5.1.3", + "jwt-decode": "^3.1.2", "rxjs": "~7.4.0", "tslib": "^2.3.0", "zone.js": "~0.11.4" diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index fc28081..ac4db0b 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -16,7 +16,7 @@ import { PageToDoListComponent } from './pages/page-to-do-list/page-to-do-list.c import { PageUpdateMemberComponent } from './pages/page-update-member/page-update-member.component'; const routes: Routes = [ - { path: '', redirectTo: 'home', pathMatch: 'full' }, + { path: '', redirectTo: 'accueil', pathMatch: 'full' }, { path: 'compte', component: PageAccountComponent }, { path: 'accueil', component: PageAccueilComponent }, { path: 'ajout-membre', component: PageAddMemberComponent }, diff --git a/src/app/app.module.ts b/src/app/app.module.ts index d268cf3..9b55ae7 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -31,6 +31,8 @@ import { CardMenuComponent } from './components/card-menu/card-menu.component'; import { FicheContactComponent } from './components/fiche-contact/fiche-contact.component'; import { PaginationComponent } from './components/pagination/pagination.component'; import { CreneauComponent } from './components/creneau/creneau.component'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { HttpClientModule } from '@angular/common/http'; @NgModule({ declarations: [ @@ -64,7 +66,13 @@ import { CreneauComponent } from './components/creneau/creneau.component'; PaginationComponent, CreneauComponent, ], - imports: [BrowserModule, AppRoutingModule], + imports: [ + BrowserModule, + AppRoutingModule, + ReactiveFormsModule, + HttpClientModule, + FormsModule, + ], providers: [], bootstrap: [AppComponent], }) diff --git a/src/app/auth.guard.spec.ts b/src/app/auth.guard.spec.ts new file mode 100644 index 0000000..68889d2 --- /dev/null +++ b/src/app/auth.guard.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { AuthGuard } from './auth.guard'; + +describe('AuthGuard', () => { + let guard: AuthGuard; + + beforeEach(() => { + TestBed.configureTestingModule({}); + guard = TestBed.inject(AuthGuard); + }); + + it('should be created', () => { + expect(guard).toBeTruthy(); + }); +}); diff --git a/src/app/auth.guard.ts b/src/app/auth.guard.ts new file mode 100644 index 0000000..86d4f28 --- /dev/null +++ b/src/app/auth.guard.ts @@ -0,0 +1,55 @@ +import { Injectable } from '@angular/core'; +import { + ActivatedRouteSnapshot, + CanActivate, + Router, + RouterStateSnapshot, + UrlTree, +} from '@angular/router'; +import { Observable } from 'rxjs'; +import { environment } from 'src/environments/environment'; +import jwt_decode from 'jwt-decode'; + +@Injectable({ + providedIn: 'root', +}) +export class AuthGuard implements CanActivate { + private tokenKey: string; + constructor(private router: Router) { + this.tokenKey = environment.tokenKey; + } + + canActivate( + route: ActivatedRouteSnapshot, + state: RouterStateSnapshot + ): + | Observable + | Promise + | boolean + | UrlTree { + const token = localStorage.getItem(this.tokenKey); + + if (token) { + const decodedToken = jwt_decode(token); + + console.log('decodedToken : ', decodedToken); + + if (decodedToken.exp) { + console.log("Date d'exp decodedToken : ", decodedToken.exp); + const dateExp = new Date(decodedToken.exp * 1000); + if (new Date() >= dateExp) { + // le token a expiré, je n'autorise pas l'accès + this.router.navigate(['account/signin']); + return false; + } + } + + console.log("C'est ok ! "); + return true; + } else { + console.log('You shall not pass !!!!'); + this.router.navigate(['account/signin']); // redirection de notre utilisateur vers une url de notre application (dans notre code TS) + return false; + } + } +} diff --git a/src/app/components/signin/signin.component.html b/src/app/components/signin/signin.component.html index cc1a2e3..626d9da 100644 --- a/src/app/components/signin/signin.component.html +++ b/src/app/components/signin/signin.component.html @@ -1 +1,45 @@ -

signin works!

+ + diff --git a/src/app/components/signin/signin.component.scss b/src/app/components/signin/signin.component.scss index e69de29..153a247 100644 --- a/src/app/components/signin/signin.component.scss +++ b/src/app/components/signin/signin.component.scss @@ -0,0 +1,31 @@ +.signin-form { + height: 100vh; + padding-top: 40px; + background-color: #f5f5f5; +} + +.form-signin { + width: 100%; + max-width: 330px; + padding: 15px; + margin: auto; + .checkbox { + font-weight: 400; + } + + .form-floating:focus-within { + z-index: 2; + } + + input[type="email"] { + margin-bottom: -1px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + } + + input[type="password"] { + margin-bottom: 10px; + border-top-left-radius: 0; + border-top-right-radius: 0; + } +} diff --git a/src/app/components/signin/signin.component.ts b/src/app/components/signin/signin.component.ts index d0789c3..8ec139b 100644 --- a/src/app/components/signin/signin.component.ts +++ b/src/app/components/signin/signin.component.ts @@ -1,15 +1,38 @@ import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { AuthService } from '../../services/auth.service'; +import { + FormBuilder, + FormControl, + FormGroup, + Validators, +} from '@angular/forms'; @Component({ selector: 'app-signin', templateUrl: './signin.component.html', - styleUrls: ['./signin.component.scss'] + styleUrls: ['./signin.component.scss'], }) export class SigninComponent implements OnInit { - - constructor() { } - - ngOnInit(): void { + public errorForm: boolean; + constructor(private authService: AuthService, private router: Router) { + this.errorForm = false; } + ngOnInit(): void {} + + public onSubmit(submittedForm: any): void { + console.log(submittedForm.form.value); + const email = submittedForm.form.value['email']; + const password = submittedForm.form.value['password']; + if (email !== '' && password !== '') { + this.authService.signin(email, password).subscribe((resp) => { + console.log('Component Signin: ', resp); + this.router.navigate(['tableau-de-bord']); + }); + } else { + // afficher une erreur à l'utilisateur + this.errorForm = true; + } + } } diff --git a/src/app/models/membre.ts b/src/app/models/membre.ts new file mode 100644 index 0000000..798a31c --- /dev/null +++ b/src/app/models/membre.ts @@ -0,0 +1,10 @@ +export interface Membre { + firstName: string; + lastName: string; + email: string; + password: string; + dateNaissance: Date; + teamName: string; + profil: boolean; + passwordConfirm: string; +} diff --git a/src/app/pages/page-accueil/page-accueil.component.html b/src/app/pages/page-accueil/page-accueil.component.html index e91fa55..d6d0a80 100644 --- a/src/app/pages/page-accueil/page-accueil.component.html +++ b/src/app/pages/page-accueil/page-accueil.component.html @@ -1 +1,2 @@ + \ No newline at end of file diff --git a/src/app/pages/page-signup/page-signup.component.html b/src/app/pages/page-signup/page-signup.component.html index e91fa55..a81e94b 100644 --- a/src/app/pages/page-signup/page-signup.component.html +++ b/src/app/pages/page-signup/page-signup.component.html @@ -1 +1,109 @@ + diff --git a/src/app/pages/page-signup/page-signup.component.scss b/src/app/pages/page-signup/page-signup.component.scss index e69de29..333e617 100644 --- a/src/app/pages/page-signup/page-signup.component.scss +++ b/src/app/pages/page-signup/page-signup.component.scss @@ -0,0 +1,32 @@ +.login-form { + height: 100vh; + padding-top: 40px; + background-color: #f5f5f5; +} + +.form-signup { + width: 100%; + max-width: 330px; + padding: 15px; + margin: auto; +} + +.form-signup .checkbox { + font-weight: 400; +} + +.form-signup .form-floating:focus-within { + z-index: 2; +} + +.form-signup input[type="email"] { + margin-bottom: -1px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.form-signup input[type="password"] { + margin-bottom: 10px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} diff --git a/src/app/pages/page-signup/page-signup.component.ts b/src/app/pages/page-signup/page-signup.component.ts index 28d1fc4..4a5243a 100644 --- a/src/app/pages/page-signup/page-signup.component.ts +++ b/src/app/pages/page-signup/page-signup.component.ts @@ -1,15 +1,105 @@ import { Component, OnInit } from '@angular/core'; +import { + FormBuilder, + FormControl, + FormGroup, + Validators, +} from '@angular/forms'; +import { Router } from '@angular/router'; +import { Membre } from '../../models/membre'; +import { AuthService } from '../../services/auth.service'; @Component({ selector: 'app-page-signup', templateUrl: './page-signup.component.html', - styleUrls: ['./page-signup.component.scss'] + styleUrls: ['./page-signup.component.scss'], }) export class PageSignupComponent implements OnInit { - - constructor() { } - - ngOnInit(): void { + public signupForm: FormGroup; + constructor( + private authService: AuthService, + private router: Router, + private fb: FormBuilder + ) { + this.signupForm = new FormGroup({}); } + ngOnInit(): void { + // *********************************pensser a changer group car déprécié******************************** + this.signupForm = this.fb.group( + { + firstNameFc: new FormControl('', [Validators.required]), + lastNameFc: new FormControl('', [Validators.required]), + dateNaissanceFc: new FormControl('', [Validators.required]), + teamNameFc: new FormControl('', [Validators.required]), + profilFc: new FormControl('', [Validators.required]), + emailFc: new FormControl('', [ + Validators.email, + Validators.required, + Validators.pattern(/^([\w\.\-_]+)?\w+@[\w-_]+(\.\w+){1,}/gim), + ]), // chercher une meilleure regex + passwordFc: new FormControl('', [ + Validators.minLength(8), + Validators.required, + ]), + passwordConfirmFc: new FormControl('', [ + Validators.minLength(8), + Validators.required, + ]), + }, + { + validator: this.ConfirmedValidator('passwordFc', 'passwordConfirmFc'), + } + ); + } + + public onSubmit(): void { + console.log('value : ', this.signupForm.value); + console.log('form : ', this.signupForm); + const firstNameValue = this.signupForm.value['firstNameFc']; + const lastNameValue = this.signupForm.value['lastNameFc']; + const emailValue = this.signupForm.value['emailFc']; + const passwordValue = this.signupForm.value['passwordFc']; + const dateNaissanceValue = this.signupForm.value['dateNaissanceFc']; + const teamNameValue = this.signupForm.value['teamNameFc']; + const profilValue = this.signupForm.value['profilFc']; + const passwordConfirmValue = this.signupForm.value['passwordConfirmFc']; + + const membre: Membre = { + firstName: firstNameValue, + lastName: lastNameValue, + email: emailValue, + password: passwordValue, + dateNaissance: dateNaissanceValue, + teamName: teamNameValue, + profil: profilValue, + passwordConfirm: passwordConfirmValue, + }; + + if (membre.email !== '' && membre.password !== '') { + this.authService.signup(membre).subscribe((resp) => { + this.router.navigate(['account/signin']); + }); + } else { + // affichage erreur + } + } + + ConfirmedValidator(controlName: string, matchingControlName: string) { + return (formGroup: FormGroup) => { + const control = formGroup.controls[controlName]; + const matchingControl = formGroup.controls[matchingControlName]; + if ( + matchingControl.errors && + !matchingControl.errors['confirmedValidator'] + ) { + return; + } + if (control.value !== matchingControl.value) { + matchingControl.setErrors({ confirmedValidator: true }); + } else { + matchingControl.setErrors(null); + } + }; + } } diff --git a/src/app/services/auth.service.spec.ts b/src/app/services/auth.service.spec.ts new file mode 100644 index 0000000..f1251ca --- /dev/null +++ b/src/app/services/auth.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { AuthService } from './auth.service'; + +describe('AuthService', () => { + let service: AuthService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(AuthService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/services/auth.service.ts b/src/app/services/auth.service.ts new file mode 100644 index 0000000..918bfd9 --- /dev/null +++ b/src/app/services/auth.service.ts @@ -0,0 +1,58 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { map, Observable } from 'rxjs'; +import { environment } from 'src/environments/environment'; +import { Membre } from '../models/membre'; + +@Injectable({ + providedIn: 'root', +}) +export class AuthService { + private apiUrl: string; + private tokenKey: string; + + constructor(private http: HttpClient) { + // On se sert des variables d'environnement de notre application + this.apiUrl = environment.apiUrl; + this.tokenKey = environment.tokenKey; + } + + signup(membre: Membre): Observable { + console.log(membre); + + return this.http.post(`${this.apiUrl}/creation-compte`, membre); + } + + signin(email: string, password: string): Observable { + const body = { + email: email, + password: password, + }; + + console.log('Mon body : ', body); + + // Modifier cette partie ci-dessous : + // - pour pouvoir stocker dans le localstorage notre accesstoken + // - Sous la clé "TOKEN-LBP" + + return this.http.post(`${this.apiUrl}/login`, body).pipe( + map((x: any) => { + console.log('Service : ', x.accessToken); + // Modification à faire ici + localStorage.setItem(this.tokenKey, x.accessToken); + return x; // permet de renvoyer la réponse à l'initiateur (page Signin) après le traitement du map + }) + ); + } + + forgotPassword(email: string, password: string): Observable { + const body = { + email: email, + password: password, + }; + + console.log('Mon body : ', body); + + return this.http.post(`${this.apiUrl}/forgot-psw`, body); + } +} diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index 3612073..4b349b1 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -1,3 +1,5 @@ export const environment = { - production: true + production: true, + apiUrl: '', + tokenKey: '', }; diff --git a/src/environments/environment.ts b/src/environments/environment.ts index f56ff47..ecf1531 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -3,7 +3,9 @@ // The list of file replacements can be found in `angular.json`. export const environment = { - production: false + production: false, + apiUrl: 'http://localhost:3306', + tokenKey: 'TOKEN-ORGANIZEE', }; /*