Merge pull request 'Add connexion with app' (#5) from front/connexion into feature/front

Reviewed-on: #5
This commit is contained in:
ExostFlash 2025-06-02 08:34:10 +00:00
commit f4e72e80e4
15 changed files with 207 additions and 14 deletions

View file

@ -1,10 +1,19 @@
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router'; import { RouterModule, Routes } from '@angular/router';
const routes: Routes = []; import { authGuard } from './guards/auth.guard';
import { LoginComponent } from './components/essentials/login/login.component';
import { HomeComponent } from './components/home/home.component';
const routes: Routes = [
{ path: 'login', component: LoginComponent },
{ path: '', component: HomeComponent },
{ path: 'home', component: HomeComponent },
];
@NgModule({ @NgModule({
imports: [RouterModule.forRoot(routes)], imports: [RouterModule.forRoot(routes)],
exports: [RouterModule] exports: [RouterModule],
}) })
export class AppRoutingModule {} export class AppRoutingModule {}

View file

@ -1,24 +1,26 @@
import { NgModule } from '@angular/core'; import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser'; import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppRoutingModule } from './app-routing.module'; import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component'; import { AppComponent } from './app.component';
import { HeaderComponent } from './components/essentials/header/header.component'; import { HeaderComponent } from './components/essentials/header/header.component';
import { FooterComponent } from './components/essentials/footer/footer.component'; import { FooterComponent } from './components/essentials/footer/footer.component';
import { HomeComponent } from './components/home/home.component'; import { HomeComponent } from './components/home/home.component';
import { LoginComponent } from './components/essentials/login/login.component';
import { LogoutComponent } from './components/essentials/logout/logout.component';
@NgModule({ @NgModule({
declarations: [ declarations: [
AppComponent, AppComponent,
HeaderComponent, HeaderComponent,
FooterComponent, FooterComponent,
HomeComponent HomeComponent,
], LoginComponent,
imports: [ LogoutComponent,
BrowserModule,
AppRoutingModule
], ],
imports: [BrowserModule, AppRoutingModule, FormsModule],
providers: [], providers: [],
bootstrap: [AppComponent] bootstrap: [AppComponent],
}) })
export class AppModule {} export class AppModule {}

View file

@ -0,0 +1,18 @@
<form (ngSubmit)="onSubmit()">
<input
type="email"
[(ngModel)]="email"
name="email"
placeholder="Email"
required
/>
<input
type="password"
[(ngModel)]="password"
name="password"
placeholder="Mot de passe"
required
/>
<button type="submit">Connexion</button>
<div *ngIf="errorMessage">{{ errorMessage }}</div>
</form>

View file

@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { LoginComponent } from './login.component';
describe('LoginComponent', () => {
let component: LoginComponent;
let fixture: ComponentFixture<LoginComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [LoginComponent]
})
.compileComponents();
fixture = TestBed.createComponent(LoginComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View file

@ -0,0 +1,25 @@
import { Component } from '@angular/core';
import { Router } from '@angular/router';
import { AuthService } from '@services/auth.service';
@Component({
selector: 'app-login',
standalone: false,
templateUrl: './login.component.html',
styleUrl: './login.component.css',
})
export class LoginComponent {
email = '';
password = '';
errorMessage = '';
constructor(private authService: AuthService, private router: Router) {}
onSubmit() {
if (this.authService.login(this.email, this.password)) {
this.router.navigate(['/']);
} else {
this.errorMessage = 'Identifiants incorrects';
}
}
}

View file

@ -0,0 +1 @@
<p>logout works!</p>

View file

@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { LogoutComponent } from './logout.component';
describe('LogoutComponent', () => {
let component: LogoutComponent;
let fixture: ComponentFixture<LogoutComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [LogoutComponent]
})
.compileComponents();
fixture = TestBed.createComponent(LogoutComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View file

@ -0,0 +1,11 @@
import { Component } from '@angular/core';
@Component({
selector: 'app-logout',
standalone: false,
templateUrl: './logout.component.html',
styleUrl: './logout.component.css'
})
export class LogoutComponent {
}

View file

@ -4,8 +4,6 @@ import { Component } from '@angular/core';
selector: 'app-home', selector: 'app-home',
standalone: false, standalone: false,
templateUrl: './home.component.html', templateUrl: './home.component.html',
styleUrl: './home.component.css' styleUrl: './home.component.css',
}) })
export class HomeComponent { export class HomeComponent {}
}

View file

@ -0,0 +1,17 @@
import { TestBed } from '@angular/core/testing';
import { CanActivateFn } from '@angular/router';
import { authGuard } from './auth.guard';
describe('authGuard', () => {
const executeGuard: CanActivateFn = (...guardParameters) =>
TestBed.runInInjectionContext(() => authGuard(...guardParameters));
beforeEach(() => {
TestBed.configureTestingModule({});
});
it('should be created', () => {
expect(executeGuard).toBeTruthy();
});
});

View file

@ -0,0 +1,15 @@
import { inject } from '@angular/core';
import { CanActivateFn, Router } from '@angular/router';
import { AuthService } from '@services/auth.service';
export const authGuard: CanActivateFn = (route, state) => {
const authService = inject(AuthService);
const router = inject(Router);
if (!authService.isAuthenticated()) {
router.navigate(['/login']);
return false;
}
return true;
};

View file

@ -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();
});
});

View file

@ -0,0 +1,35 @@
import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
@Injectable({
providedIn: 'root',
})
export class AuthService {
private isLoggedIn = false;
private readonly hardcodedUser = {
email: 'user@test.com',
password: 'password123',
};
constructor(private router: Router) {}
login(email: string, password: string): boolean {
if (
email === this.hardcodedUser.email &&
password === this.hardcodedUser.password
) {
this.isLoggedIn = true;
return true;
}
return false;
}
logout(): void {
this.isLoggedIn = false;
this.router.navigate(['/login']);
}
isAuthenticated(): boolean {
return this.isLoggedIn;
}
}