Skip to content

Commit b47f77b

Browse files
committed
fix angular error (needs to remove devxpress to make it simpler to demo)
1 parent 5350bf2 commit b47f77b

File tree

11 files changed

+157
-64
lines changed

11 files changed

+157
-64
lines changed

assets/js/form-devxpress-angular/src/app/shared/shared.module.ts

+10
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import {WizardListAuthorsComponent} from './wizard-list-authors/wizard-list-auth
66
import {WizardListEditorsComponent} from './wizard-list-editors/wizard-list-editors.component';
77
import {LoginComponent} from "./login/login.component";
88
import {CommonModule} from '@angular/common';
9+
import {TokenService} from "../../services/token.service";
10+
import {environment} from "../../environments/environment";
911

1012
@NgModule({
1113
imports: [
@@ -28,6 +30,14 @@ import {CommonModule} from '@angular/common';
2830
WizardListEditorsComponent,
2931
WizardSumupComponent,
3032
],
33+
providers: [
34+
{
35+
provide: 'TokenServiceJwt',
36+
useFactory: () => {
37+
return new TokenService(environment.tokenKey)
38+
}
39+
}
40+
]
3141
})
3242
export class SharedModule {
3343
}

assets/js/form-devxpress-angular/src/environments/environment.prod.ts

+1
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ export const environment = {
66
rest: {
77
baseUrl: `//${host}${apiPlatformPrefix}/`
88
},
9+
tokenKey: 'rememberMe'
910
};

assets/js/form-devxpress-angular/src/environments/environment.ts

+1
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ export const environment = {
1111
rest: {
1212
baseUrl: `//${host}${apiPlatformPrefix}/`
1313
},
14+
tokenKey: 'rememberMe'
1415
};

assets/js/form-devxpress-angular/src/services/api.ts

+28-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
import { Injectable } from '@angular/core'
1+
import {Inject, Injectable} from '@angular/core'
22
import { HttpClient } from '@angular/common/http'
33
import { Observable } from 'rxjs'
44
import { environment } from '../environments/environment'
55
import {apiPlatformPrefix, tokenJwtBearer} from '../../../lib/config'
66
import { map, tap } from 'rxjs/operators'
77
import {JwtInterceptorService} from "./jwt-interceptor";
8+
import {TokenService} from "./token.service";
9+
import {UserToken} from "./token.interface";
810

911
@Injectable({
1012
providedIn: 'root'
@@ -20,7 +22,9 @@ export class ApiService {
2022
headers: {}
2123
}
2224

23-
constructor(protected http: HttpClient, protected jwtInterceptorService: JwtInterceptorService) { }
25+
constructor(protected http: HttpClient, protected jwtInterceptorService: JwtInterceptorService, @Inject('TokenServiceJwt') protected tokenStorage: TokenService) {
26+
this.enableJwtToken();
27+
}
2428

2529
get(path: string, options: Object = {}): Observable<any> {
2630
const init: {} = Object.assign(options, this.options)
@@ -73,4 +77,26 @@ export class ApiService {
7377

7478
return uri
7579
}
80+
81+
enableCredentials() {
82+
this.options.withCredentials = true;
83+
}
84+
85+
disableCredentials() {
86+
this.options.withCredentials = false;
87+
}
88+
89+
enableJwtToken() {
90+
if (this.tokenStorage.getAccessToken()) {
91+
const user: UserToken = this.tokenStorage.getAccessToken();
92+
93+
if (user) {
94+
this.jwtInterceptorService.setJwtToken(user.token)
95+
}
96+
}
97+
}
98+
99+
disableJwtToken() {
100+
this.jwtInterceptorService.setJwtToken("")
101+
}
76102
}

assets/js/form-devxpress-angular/src/services/jwt-interceptor.ts

+44-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
import { Injectable } from '@angular/core';
2-
import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';
3-
import { Observable } from 'rxjs';
2+
import {
3+
HttpErrorResponse,
4+
HttpEvent,
5+
HttpHandler,
6+
HttpInterceptor,
7+
HttpRequest,
8+
HttpResponse
9+
} from '@angular/common/http';
10+
import {Observable, throwError} from 'rxjs';
11+
import {map, catchError} from "rxjs/operators";
412
import {tokenJwtBearer} from '../../../lib/config'
513

614
@Injectable({
@@ -11,11 +19,30 @@ export class JwtInterceptorService implements HttpInterceptor {
1119
private token: string | null;
1220

1321
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
22+
let clone = req;
23+
let handle;
24+
1425
if (this.token) {
15-
const clone = req.clone({ setHeaders: { 'Authorization': `${tokenJwtBearer} ${this.token}` } });
16-
return next.handle(clone);
26+
clone = req.clone({ setHeaders: { 'Authorization': `${tokenJwtBearer} ${this.token}` } });
1727
}
18-
return next.handle(req);
28+
29+
handle = next.handle(clone).pipe(
30+
map((event: HttpEvent<any>) => {
31+
if (event instanceof HttpResponse) {
32+
// console.log('interceptor : event--->>>', event);
33+
// this.errorDialogService.openDialog(event);
34+
}
35+
return event;
36+
}),
37+
catchError((error: HttpErrorResponse) => {
38+
if (error.status === 403) {
39+
// @todo ask for login modal maybe using an Observable, but is it this class responsability ? not sure
40+
}
41+
42+
return throwError(error);
43+
}));
44+
45+
return handle;
1946
}
2047

2148
setJwtToken(token: string) {
@@ -26,7 +53,19 @@ export class JwtInterceptorService implements HttpInterceptor {
2653
this.token = token;
2754
}
2855

56+
getJwtToken() {
57+
return this.token
58+
}
59+
2960
removeJwtToken() {
3061
this.token = null;
3162
}
63+
64+
readJwt(token) {
65+
try {
66+
return JSON.parse(atob(token.split('.')[1]));
67+
} catch (e) {
68+
return null;
69+
}
70+
}
3271
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
export interface UserToken {
2+
token: string;
3+
roles: [];
4+
}
5+
6+
export interface TokenServiceI {
7+
setAccessToken(token: string): TokenServiceI
8+
9+
getAccessToken(): UserToken
10+
11+
reset(): TokenServiceI
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { Injectable } from '@angular/core'
2+
import {TokenServiceI} from "./token.interface";
3+
4+
@Injectable()
5+
export class TokenMockService implements TokenServiceI {
6+
protected token = null
7+
8+
constructor(private TOKEN_KEY: string = 'tokenKey') { }
9+
10+
setAccessToken(token: string): TokenServiceI {
11+
this.token = token
12+
13+
return this
14+
}
15+
16+
getAccessToken(): string {
17+
return this.token
18+
}
19+
20+
reset(): TokenServiceI {
21+
this.token = null
22+
23+
return this
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { Injectable } from '@angular/core'
2+
import {TokenServiceI, UserToken} from "./token.interface";
3+
4+
@Injectable()
5+
export class TokenService implements TokenServiceI {
6+
constructor(private TOKEN_KEY: string = 'tokenKey') { }
7+
8+
setAccessToken(token: string): TokenServiceI {
9+
localStorage.setItem(this.TOKEN_KEY, token)
10+
11+
return this
12+
}
13+
14+
getAccessToken(): UserToken|null {
15+
if (!localStorage) {
16+
throw new Error('LocalStorage is not available in the current browser')
17+
}
18+
19+
const userToken = localStorage.getItem(this.TOKEN_KEY)
20+
21+
return userToken ? JSON.parse(userToken) : null
22+
}
23+
24+
reset(): TokenServiceI {
25+
localStorage.removeItem(this.TOKEN_KEY)
26+
27+
return this
28+
}
29+
}

public/img/db-model.png

99.7 KB
Loading

src/Controller/DefaultController.php

+7-7
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,14 @@ public function index(Request $request)
2828
$demoRoutes = [];
2929
$demoRoutes['Basic: Simple controller'] = $router->generate('simple');
3030
$demoRoutes['Basic: Hello controller with twig'] = $router->generate('app_hello_world', ['name' => 'world', ]);
31-
$demoRoutes['Basic: HttpPlug demo'] = $router->generate('app_http_call');
31+
$demoRoutes['Basic: HttpClient demo'] = $router->generate('app_http_call');
3232

33-
$demoRoutes['Login: Symfony secured page with form_login'] = $router->generate('demo_secured_page_standard');
34-
$demoRoutes['Login: Vuejs secured page with json_login'] = $router->generate('demo_login_json_check'); // if i go to demo_secured_page_json i will just get a json string !!! user won't know how to go to the form uri (i may add the uri in the response, but if i link to the form and the user is already logged, it will then be redirected to the secured page)
35-
$demoRoutes['Login: Quasar secured page with JWT system'] = $router->generate('demo_login_jwt');
33+
$demoRoutes['Login: Symfony secured page with form_login (statefull)'] = $router->generate('demo_secured_page_standard');
34+
$demoRoutes['Login: Vuejs secured page with json_login (statefull)'] = $router->generate('demo_login_json_check'); // if i go to demo_secured_page_json i will just get a json string !!! user won't know how to go to the form uri (i may add the uri in the response, but if i link to the form and the user is already logged, it will then be redirected to the secured page)
35+
$demoRoutes['Login: Quasar secured page with JWT system (stateless)'] = $router->generate('demo_login_jwt');
3636

3737
$demoRoutes['JS app: Csrf token generation for statefull app'] = $router->generate('token');
38-
$demoRoutes['JS app: User login check (security_json firewall)'] = $router->generate('demo_secured_page_json_is_logged_in');
38+
$demoRoutes['JS app: User login check (statefull)'] = $router->generate('demo_secured_page_json_is_logged_in');
3939

4040
$demoRoutes['Vuejs: page with vue-router'] = $router->generate('vuejs');
4141
$demoRoutes['Vuejs: with quasar and vue-router'] = $router->generate('vuejs_quasar');
@@ -50,8 +50,8 @@ public function index(Request $request)
5050
$demoRoutes['Easy admin'] = $router->generate('easyadmin');
5151

5252
if (!$hasPemCertificate) {
53-
$demoRoutes['Basic: HttpPlug demo'] = [
54-
'uri' => $demoRoutes['Basic: HttpPlug demo'],
53+
$demoRoutes['Basic: HttpClient demo'] = [
54+
'uri' => $demoRoutes['Basic: HttpClient demo'],
5555
'note' => 'You need to set php.ini vars: curl.cainfo and openssl.cafile to the path of the pem file.'
5656
. ' if you need one, <a href="https://curl.haxx.se/docs/caextract.html">download the certificate</a>',
5757
];

src/Repository/Library/Reader/CollectionRepository.php

-50
This file was deleted.

0 commit comments

Comments
 (0)