resolution merge
This commit is contained in:
commit
9148c51a1f
12632
package-lock.json
generated
12632
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -21,6 +21,7 @@
|
|||||||
"@angular/router": "~13.0.0",
|
"@angular/router": "~13.0.0",
|
||||||
"bootstrap": "^5.1.3",
|
"bootstrap": "^5.1.3",
|
||||||
"bootstrap-icons": "^1.7.2",
|
"bootstrap-icons": "^1.7.2",
|
||||||
|
"jwt-decode": "^3.1.2",
|
||||||
"rxjs": "~7.4.0",
|
"rxjs": "~7.4.0",
|
||||||
"tslib": "^2.3.0",
|
"tslib": "^2.3.0",
|
||||||
"zone.js": "~0.11.4"
|
"zone.js": "~0.11.4"
|
||||||
|
@ -8,6 +8,7 @@ import { PageNotFoundComponent } from './pages/page-not-found/page-not-found.com
|
|||||||
import { FiltersPageComponent } from './pages/filters-page/filters-page.component';
|
import { FiltersPageComponent } from './pages/filters-page/filters-page.component';
|
||||||
import { SigninComponent } from './pages/signin/signin.component';
|
import { SigninComponent } from './pages/signin/signin.component';
|
||||||
import { AdminPageComponent } from './pages/admin-page/admin-page.component';
|
import { AdminPageComponent } from './pages/admin-page/admin-page.component';
|
||||||
|
import { AuthGuard } from './services/auth.guard';
|
||||||
|
|
||||||
const routes: Routes = [
|
const routes: Routes = [
|
||||||
{ path: '', redirectTo: 'home', pathMatch: 'full' },
|
{ path: '', redirectTo: 'home', pathMatch: 'full' },
|
||||||
@ -16,7 +17,7 @@ const routes: Routes = [
|
|||||||
{ path: 'favoris', component: FavorisUserComponent },
|
{ path: 'favoris', component: FavorisUserComponent },
|
||||||
{ path: 'filtres', component: FiltersPageComponent },
|
{ path: 'filtres', component: FiltersPageComponent },
|
||||||
{ path: 'Deconnexion', redirectTo: 'home'},
|
{ path: 'Deconnexion', redirectTo: 'home'},
|
||||||
{path: 'restaurants',component: RestoPageComponent},
|
{path: 'restaurants', canActivate: [AuthGuard], component: RestoPageComponent},
|
||||||
{path: 'page-not-found',component: PageNotFoundComponent},
|
{path: 'page-not-found',component: PageNotFoundComponent},
|
||||||
{path: 'signin', component: SigninComponent},
|
{path: 'signin', component: SigninComponent},
|
||||||
{path: 'admin', component: AdminPageComponent},
|
{path: 'admin', component: AdminPageComponent},
|
||||||
|
@ -9,7 +9,7 @@ import { CardCategoryComponent } from './card-category/card-category.component';
|
|||||||
import { CardRestoComponent } from './card-resto/card-resto.component';
|
import { CardRestoComponent } from './card-resto/card-resto.component';
|
||||||
import { FooterComponent } from './footer/footer.component';
|
import { FooterComponent } from './footer/footer.component';
|
||||||
import { HomePageComponent } from './pages/home-page/home-page.component';
|
import { HomePageComponent } from './pages/home-page/home-page.component';
|
||||||
import { HttpClientModule } from '@angular/common/http';
|
import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
|
||||||
import { ListCategoriesComponent } from './pages/list-categories/list-categories.component';
|
import { ListCategoriesComponent } from './pages/list-categories/list-categories.component';
|
||||||
import { SigninComponent } from './pages/signin/signin.component';
|
import { SigninComponent } from './pages/signin/signin.component';
|
||||||
import { RestoPageComponent } from './pages/resto-page/resto-page.component';
|
import { RestoPageComponent } from './pages/resto-page/resto-page.component';
|
||||||
@ -22,6 +22,7 @@ import { AdminPageComponent } from './pages/admin-page/admin-page.component';
|
|||||||
import { AddRestauComponent } from './admin-component/add-restau/add-restau.component';
|
import { AddRestauComponent } from './admin-component/add-restau/add-restau.component';
|
||||||
import { UpdateDelRestauComponent } from './admin-component/update-del-restau/update-del-restau.component';
|
import { UpdateDelRestauComponent } from './admin-component/update-del-restau/update-del-restau.component';
|
||||||
import { HeaderLogoComponent } from './header/components/header-logo/header-logo.component';
|
import { HeaderLogoComponent } from './header/components/header-logo/header-logo.component';
|
||||||
|
import { AuthInterceptor } from './services/auth.interceptor';
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
declarations: [
|
declarations: [
|
||||||
@ -52,7 +53,9 @@ import { HeaderLogoComponent } from './header/components/header-logo/header-logo
|
|||||||
FormsModule,
|
FormsModule,
|
||||||
ReactiveFormsModule
|
ReactiveFormsModule
|
||||||
],
|
],
|
||||||
providers: [],
|
providers: [
|
||||||
|
{ provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true }
|
||||||
|
],
|
||||||
bootstrap: [AppComponent]
|
bootstrap: [AppComponent]
|
||||||
})
|
})
|
||||||
export class AppModule { }
|
export class AppModule { }
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
|
import { ApiBackService } from 'src/app/services/api-back.service';
|
||||||
|
import { TokenService } from 'src/app/services/token.service';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-favoris-user',
|
selector: 'app-favoris-user',
|
||||||
@ -7,9 +9,16 @@ import { Component, OnInit } from '@angular/core';
|
|||||||
})
|
})
|
||||||
export class FavorisUserComponent implements OnInit {
|
export class FavorisUserComponent implements OnInit {
|
||||||
|
|
||||||
constructor() { }
|
personneConnectee : any;
|
||||||
|
|
||||||
|
constructor(private apiBackService : ApiBackService,private tokenService : TokenService) { }
|
||||||
|
|
||||||
ngOnInit(): void {
|
ngOnInit(): void {
|
||||||
|
|
||||||
|
this.personneConnectee = this.apiBackService.getPersonneById(this.tokenService.getCurrentUserId());
|
||||||
|
console.log(this.personneConnectee);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
|
import { Router } from '@angular/router';
|
||||||
import { AuthService } from '../../services/auth.service';
|
import { AuthService } from '../../services/auth.service';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
@ -8,7 +9,8 @@ import { AuthService } from '../../services/auth.service';
|
|||||||
})
|
})
|
||||||
export class SigninComponent implements OnInit {
|
export class SigninComponent implements OnInit {
|
||||||
public errorForm: boolean;
|
public errorForm: boolean;
|
||||||
constructor(private authService: AuthService) {
|
|
||||||
|
constructor(private authService: AuthService , private router: Router) {
|
||||||
this.errorForm = false;
|
this.errorForm = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -21,7 +23,9 @@ export class SigninComponent implements OnInit {
|
|||||||
const password = submittedForm.form.value['password'];
|
const password = submittedForm.form.value['password'];
|
||||||
if(email !== '' && password !== '') {
|
if(email !== '' && password !== '') {
|
||||||
this.authService.signin(email, password).subscribe(
|
this.authService.signin(email, password).subscribe(
|
||||||
resp => console.log('Component Page Signin: ', resp)
|
resp => {console.log('Component Page Signin ', resp)
|
||||||
|
this.router.navigate(['home'])
|
||||||
|
}
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
// afficher une erreur à l'utilisateur
|
// afficher une erreur à l'utilisateur
|
||||||
|
@ -9,11 +9,11 @@ import { Restaurant } from '../pages/models/restaurant';
|
|||||||
})
|
})
|
||||||
export class ApiBackService {
|
export class ApiBackService {
|
||||||
|
|
||||||
public restoByCat : Observable<any[]> = of([]);
|
public restoByCat: Observable<any[]> = of([]);
|
||||||
restoLiked$ = new Subject<any>();
|
restoLiked$ = new Subject<any>();
|
||||||
public restoFilter : any[];
|
public restoFilter: any[];
|
||||||
public routeParam ?: string;
|
public routeParam?: string;
|
||||||
@Input() restaurant : any;
|
@Input() restaurant: any;
|
||||||
|
|
||||||
constructor(private httpClient: HttpClient) {
|
constructor(private httpClient: HttpClient) {
|
||||||
this.restoFilter = [];
|
this.restoFilter = [];
|
||||||
@ -24,49 +24,53 @@ export class ApiBackService {
|
|||||||
return this.httpClient.get<any[]>(`${environment.apiUrl}/restaurants`);
|
return this.httpClient.get<any[]>(`${environment.apiUrl}/restaurants`);
|
||||||
}
|
}
|
||||||
|
|
||||||
getRestaurantsByCateg(id : number, routeParam ?: string ): void {
|
getRestaurantsByCateg(id: number, routeParam?: string): void {
|
||||||
this.restoByCat = this.httpClient.get<any[]>(`${environment.apiUrl}/restaurantbytype/${id}`);
|
this.restoByCat = this.httpClient.get<any[]>(`${environment.apiUrl}/restaurantbytype/${id}`);
|
||||||
this.routeParam = routeParam;
|
this.routeParam = routeParam;
|
||||||
}
|
}
|
||||||
|
|
||||||
getCategories(): Observable<any[]>{
|
getCategories(): Observable<any[]> {
|
||||||
return this.httpClient.get<any[]>(`${environment.apiUrl}/types`);
|
return this.httpClient.get<any[]>(`${environment.apiUrl}/types`);
|
||||||
}
|
}
|
||||||
|
|
||||||
setListRestau(listRestau : any[], routeParam ?: string ) : void{
|
setListRestau(listRestau: any[], routeParam?: string): void {
|
||||||
|
|
||||||
this.restoFilter = listRestau;
|
this.restoFilter = listRestau;
|
||||||
this.routeParam = routeParam;
|
this.routeParam = routeParam;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
setDistance(lat1 : number , lon1 : number, lat2 : number, lon2 : number){
|
setDistance(lat1: number, lon1: number, lat2: number, lon2: number) {
|
||||||
|
|
||||||
let R = 6371; // Radius of the earth in km
|
let R = 6371; // Radius of the earth in km
|
||||||
let dLat = this.deg2rad(lat2-lat1); // deg2rad below
|
let dLat = this.deg2rad(lat2 - lat1); // deg2rad below
|
||||||
let dLon = this.deg2rad(lon2-lon1);
|
let dLon = this.deg2rad(lon2 - lon1);
|
||||||
let a =
|
let a =
|
||||||
Math.sin(dLat/2) * Math.sin(dLat/2) +
|
Math.sin(dLat / 2) * Math.sin(dLat / 2) +
|
||||||
Math.cos(this.deg2rad(lat1)) * Math.cos(this.deg2rad(lat2)) *
|
Math.cos(this.deg2rad(lat1)) * Math.cos(this.deg2rad(lat2)) *
|
||||||
Math.sin(dLon/2) * Math.sin(dLon/2)
|
Math.sin(dLon / 2) * Math.sin(dLon / 2)
|
||||||
;
|
;
|
||||||
let c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
|
let c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
|
||||||
let d = R * c * 1000; // Distance in meters
|
let d = R * c * 1000; // Distance in meters
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
|
||||||
deg2rad(deg : number) {
|
deg2rad(deg: number) {
|
||||||
return deg * (Math.PI/180)
|
return deg * (Math.PI / 180)
|
||||||
}
|
}
|
||||||
|
|
||||||
addRestaurant( newRestau : Restaurant) : Observable<any>{
|
addRestaurant(newRestau: Restaurant): Observable<any> {
|
||||||
return this.httpClient.post<any[]>(`${environment.apiUrl}/add-restaurant`, newRestau);
|
return this.httpClient.post<any[]>(`${environment.apiUrl}/add-restaurant`, newRestau);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
deleteRestau( idRestau : number | undefined) : Observable<any>{
|
deleteRestau(idRestau: number | undefined): Observable<any> {
|
||||||
|
|
||||||
return this.httpClient.delete<Restaurant>(`${environment.apiUrl}/delete-restaurant/${idRestau}`);
|
return this.httpClient.delete<Restaurant>(`${environment.apiUrl}/delete-restaurant/${idRestau}`);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getPersonneById(id: number | null) {
|
||||||
|
return this.httpClient.get<any[]>(`${environment.apiUrl}/user/${id}`);
|
||||||
|
}
|
||||||
}
|
}
|
16
src/app/services/auth.guard.spec.ts
Normal file
16
src/app/services/auth.guard.spec.ts
Normal file
@ -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();
|
||||||
|
});
|
||||||
|
});
|
46
src/app/services/auth.guard.ts
Normal file
46
src/app/services/auth.guard.ts
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
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<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
|
||||||
|
|
||||||
|
const token = localStorage.getItem(this.tokenKey);
|
||||||
|
|
||||||
|
if(token) {
|
||||||
|
const decodedToken = jwt_decode<any>(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(['signin']);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("C'est ok ! ")
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
console.log("You shall not pass !!!!")
|
||||||
|
this.router.navigate(['signin']); // redirection de notre utilisateur vers une url de notre application (dans notre code TS)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
16
src/app/services/auth.interceptor.spec.ts
Normal file
16
src/app/services/auth.interceptor.spec.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import { TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
|
import { AuthInterceptor } from './auth.interceptor';
|
||||||
|
|
||||||
|
describe('AuthInterceptor', () => {
|
||||||
|
beforeEach(() => TestBed.configureTestingModule({
|
||||||
|
providers: [
|
||||||
|
AuthInterceptor
|
||||||
|
]
|
||||||
|
}));
|
||||||
|
|
||||||
|
it('should be created', () => {
|
||||||
|
const interceptor: AuthInterceptor = TestBed.inject(AuthInterceptor);
|
||||||
|
expect(interceptor).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
31
src/app/services/auth.interceptor.ts
Normal file
31
src/app/services/auth.interceptor.ts
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
import {
|
||||||
|
HttpRequest,
|
||||||
|
HttpHandler,
|
||||||
|
HttpEvent,
|
||||||
|
HttpInterceptor
|
||||||
|
} from '@angular/common/http';
|
||||||
|
import { Observable } from 'rxjs';
|
||||||
|
import { TokenService } from './token.service';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class AuthInterceptor implements HttpInterceptor {
|
||||||
|
|
||||||
|
constructor(private tokenService: TokenService) {}
|
||||||
|
|
||||||
|
intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {
|
||||||
|
console.log('Coucou je suis le videur ! ');
|
||||||
|
const token = this.tokenService.getToken();
|
||||||
|
if(token) {
|
||||||
|
|
||||||
|
const authReq = request.clone(
|
||||||
|
{
|
||||||
|
headers : request.headers.set('Authorization', `Bearer ${token}`)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
return next.handle(authReq);
|
||||||
|
} else {
|
||||||
|
return next.handle(request);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -18,18 +18,18 @@ export class AuthService {
|
|||||||
this.tokenKey = environment.tokenKey;
|
this.tokenKey = environment.tokenKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
signup(newUser: User): Observable<any> {
|
// signup(): Observable<any> {
|
||||||
// const body = {
|
// // const body = {
|
||||||
// firstName: firstName,
|
// // firstName: firstName,
|
||||||
// lastName: lastName,
|
// // lastName: lastName,
|
||||||
// email: email,
|
// // email: email,
|
||||||
// password: password
|
// // password: password
|
||||||
// };
|
// // };
|
||||||
|
|
||||||
console.log("Mon nouvel utilisateur : ", newUser);
|
// console.log("Mon nouvel utilisateur : ", newUser);
|
||||||
|
|
||||||
return this.http.post(`${this.apiUrl}/register`, newUser);
|
// return this.http.post(`${this.apiUrl}/register`, newUser);
|
||||||
}
|
// }
|
||||||
|
|
||||||
signin(email: string, password: string): Observable<any> {
|
signin(email: string, password: string): Observable<any> {
|
||||||
const body = {
|
const body = {
|
||||||
@ -41,27 +41,29 @@ export class AuthService {
|
|||||||
|
|
||||||
// Modifier cette partie ci-dessous :
|
// Modifier cette partie ci-dessous :
|
||||||
// - pour pouvoir stocker dans le localstorage notre accesstoken
|
// - pour pouvoir stocker dans le localstorage notre accesstoken
|
||||||
// - Sous la clé "TOKEN-LBP"
|
// - Sous la clé "TOKEN-SIMPLEAT"
|
||||||
|
|
||||||
return this.http.post(`${this.apiUrl}/login`, body).pipe(
|
return this.http.post(`${this.apiUrl}/signin`, body).pipe(
|
||||||
map((x: any) => {
|
map((x: any) => {
|
||||||
console.log('Service : ', x.accessToken);
|
console.log(x);
|
||||||
|
|
||||||
|
console.log('Service : ', x.token);
|
||||||
// Modification à faire ici
|
// Modification à faire ici
|
||||||
localStorage.setItem(this.tokenKey, x.accessToken);
|
localStorage.setItem(this.tokenKey, x.token);
|
||||||
return x; // permet de renvoyer la réponse à l'initiateur (page Signin) après le traitement du map
|
return x; // permet de renvoyer la réponse à l'initiateur (page Signin) après le traitement du map
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
forgotPassword(email: string, password: string): Observable<any> {
|
// forgotPassword(email: string, password: string): Observable<any> {
|
||||||
const body = {
|
// const body = {
|
||||||
email: email,
|
// email: email,
|
||||||
password: password
|
// password: password
|
||||||
};
|
// };
|
||||||
|
|
||||||
console.log("Mon body : ", body);
|
// console.log("Mon body : ", body);
|
||||||
|
|
||||||
return this.http.post(`${this.apiUrl}/forgot-psw`, body);
|
// return this.http.post(`${this.apiUrl}/forgot-psw`, body);
|
||||||
}
|
// }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
16
src/app/services/token.service.spec.ts
Normal file
16
src/app/services/token.service.spec.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import { TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
|
import { TokenService } from './token.service';
|
||||||
|
|
||||||
|
describe('TokenService', () => {
|
||||||
|
let service: TokenService;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
TestBed.configureTestingModule({});
|
||||||
|
service = TestBed.inject(TokenService);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be created', () => {
|
||||||
|
expect(service).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
34
src/app/services/token.service.ts
Normal file
34
src/app/services/token.service.ts
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
import { environment } from 'src/environments/environment';
|
||||||
|
import jwt_decode from 'jwt-decode';
|
||||||
|
|
||||||
|
@Injectable({
|
||||||
|
providedIn: 'root'
|
||||||
|
})
|
||||||
|
export class TokenService {
|
||||||
|
tokenKey = environment.tokenKey;
|
||||||
|
|
||||||
|
constructor() { }
|
||||||
|
|
||||||
|
public getToken(): string | null {
|
||||||
|
const token = localStorage.getItem(this.tokenKey);
|
||||||
|
if(token) {
|
||||||
|
return token;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public getCurrentUserId(): number | null {
|
||||||
|
const token = this.getToken();
|
||||||
|
if(token) {
|
||||||
|
const decodedToken = jwt_decode<any>(token);
|
||||||
|
const userId = decodedToken.sub;
|
||||||
|
console.log(userId);
|
||||||
|
|
||||||
|
return userId;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user