Merge remote-tracking branch 'origin/master'

urls
FlayInAHook 4 years ago
commit 5249773bee

@ -13,18 +13,6 @@ import { DefaultOptions } from '@apollo/client/core/ApolloClient';
const uri = environment.apiUrl + '/graphql'; // <-- add the URL of the GraphQL server here
const authMiddleware = new ApolloLink((operation, forward) => {
//Add token here TODO: use AuthService to get the Token
operation.setContext({
headers: {
authorization: localStorage.getItem('requestToken') || null,
}
});
return forward(operation).map((data) => {
return data;
});
});
const defaultOptions: DefaultOptions = {
watchQuery: {
fetchPolicy: 'no-cache',
@ -38,7 +26,7 @@ const defaultOptions: DefaultOptions = {
export function createApollo(httpLink: HttpLink): ApolloClientOptions<any> {
return {
link: concat(authMiddleware, httpLink.create({ uri })),
link: httpLink.create({ uri }),
cache: new InMemoryCache({}),
defaultOptions: defaultOptions,
};

@ -8,7 +8,7 @@ import { catchError, filter, take, switchMap } from 'rxjs/operators';
export class TokenInterceptor implements HttpInterceptor {
private isRefreshing = false;
private refreshTokenSubject: BehaviorSubject<any> = new BehaviorSubject<any>(null);
private requestTokenSubject: BehaviorSubject<any> = new BehaviorSubject<any>(null);
constructor(public authService: AuthService) { }
@ -20,7 +20,6 @@ export class TokenInterceptor implements HttpInterceptor {
return next.handle(request).pipe(catchError(error => {
if (error instanceof HttpErrorResponse && error.status === 401) {
console.log("catching error");
return this.handle401Error(request, next);
} else {
return throwError(error);
@ -39,17 +38,17 @@ export class TokenInterceptor implements HttpInterceptor {
private handle401Error(request: HttpRequest<any>, next: HttpHandler) {
if (!this.isRefreshing) {
this.isRefreshing = true;
this.refreshTokenSubject.next(null);
this.requestTokenSubject.next(null);
return this.authService.refreshToken().pipe(
switchMap((token: any) => {
this.isRefreshing = false;
this.refreshTokenSubject.next(token.jwt);
return next.handle(this.addToken(request, token.jwt));
this.requestTokenSubject.next(token.request_token);
return next.handle(this.addToken(request, token.request_token));
}));
} else {
return this.refreshTokenSubject.pipe(
return this.requestTokenSubject.pipe(
filter(token => token != null),
take(1),
switchMap(jwt => {

@ -9,10 +9,17 @@
matTooltip="Tabllendaten aktualisieren. Achtung! Alle ungespeicherten Änderungen gehen verloren."
(click)="reloadTable()"
[disabled]="reloadingTable"
i18n
>
<mat-icon class="spin">sync</mat-icon>
</button>
<button
mat-raised-button
class="table-control-button"
(click)="addEmptyRow()"
[disabled]="reloadingTable"
>
<mat-icon class="spin">add</mat-icon>
</button>
<mat-form-field>
<mat-label>Filter</mat-label>
<input
@ -23,7 +30,7 @@
/>
</mat-form-field>
<mat-paginator
[pageSizeOptions]="[25, 30, 50, 100, 500]"
[pageSizeOptions]="[15, 25, 30, 50, 100, 500]"
showFirstLastButtons
></mat-paginator>
</div>
@ -60,6 +67,7 @@
</td>
</ng-container>
<!-- Other Columns -->
<ng-container
*ngFor="let column of columnInfo"
@ -72,8 +80,8 @@
</th>
<td mat-cell *matCellDef="let element">
<app-cell
*ngIf="!column.readonly && element.isLockedByMe; else stringValue"
[editable]="true"
*ngIf="column.type === 'Boolean' || (element.newObject || !column.readonly && element.isLockedByMe); else stringValue"
[editable]="element.newObject || !column.readonly && element.isLockedByMe"
[(value)]="element[column.name]"
[inputType]="column.type"
></app-cell>
@ -85,7 +93,7 @@
<ng-container matColumnDef="buttons" stickyEnd>
<th mat-header-cell *matHeaderCellDef></th>
<td mat-cell *matCellDef="let element">
<div class="button-wrapper">
<div class="button-wrapper" *ngIf="!element.newObject">
<button
mat-icon-button
(click)="edit(element)"

@ -1,8 +1,8 @@
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { finalize, map, tap } from 'rxjs/operators';
import { catchError, finalize, map, tap } from 'rxjs/operators';
import { environment } from '../../environments/environment';
import { BehaviorSubject } from 'rxjs';
import { BehaviorSubject, of } from 'rxjs';
@Injectable({
providedIn: 'root',
@ -44,23 +44,37 @@ export class AuthService {
logout() {
// remove token from local storage to log user out
return this.http
.post<any>(`${environment.authUrl}/logout`, { request_token: this.getRequestToken() }).pipe(finalize(() => {
this.removeTokens();
this.checkIfUserIsLoggedIn();
}
));
.post<any>(`${environment.authUrl}/logout`, {
request_token: this.getRequestToken(),
})
.pipe(
finalize(() => {
this.removeTokens();
this.checkIfUserIsLoggedIn();
})
);
}
refreshToken() {
return this.http.post<any>(`${environment.authUrl}/new-token`, {
'refresh_token': this.getRefreshToken()
}).pipe(tap((tokens: any) => {
this.storeTokens(tokens);
}));
}
private storeRequestToken(jwt: string) {
localStorage.setItem(this.REQUEST_TOKEN, jwt);
return this.http
.post<any>(`${environment.authUrl}/new-token`, {
refresh_token: this.getRefreshToken(),
})
.pipe(
tap((tokens: any) => {
this.storeTokens(tokens);
})
)
.pipe(
catchError((error: any) => {
if (error.status === 400) {
this.removeTokens();
this.checkIfUserIsLoggedIn();
location.replace('/login');
}
return of();
})
);
}
private storeTokens(tokens: any) {
@ -72,6 +86,4 @@ export class AuthService {
localStorage.removeItem(this.REQUEST_TOKEN);
localStorage.removeItem(this.REFRESH_TOKEN);
}
}

Loading…
Cancel
Save