76 lines
2.3 KiB
TypeScript
76 lines
2.3 KiB
TypeScript
import {HttpErrorResponse, HttpEvent, HttpHandlerFn, HttpInterceptorFn, HttpRequest} from '@angular/common/http';
|
|
import {inject} from "@angular/core";
|
|
import {AuthService} from "../../infrastructure/services/auth-service";
|
|
import {catchError, Observable, switchMap, throwError} from "rxjs";
|
|
import {ToastService} from "../../infrastructure/services/toast.service";
|
|
import {Router} from '@angular/router';
|
|
import {RefreshTokenRequest} from "../models/refresh-token-request";
|
|
|
|
export const tokenInterceptor: HttpInterceptorFn = (req, next) => {
|
|
const authService = inject(AuthService);
|
|
const token = authService.getToken();
|
|
const toastService = inject(ToastService);
|
|
const router = inject(Router);
|
|
|
|
if (token) {
|
|
req = req.clone({
|
|
setHeaders: {Authorization: `Bearer ${token}`}
|
|
});
|
|
}
|
|
|
|
return next(req).pipe(
|
|
catchError((err: any) => {
|
|
if (err instanceof HttpErrorResponse) {
|
|
if (err.status === 401) {
|
|
return handleUnAuthorizedError(req, next, authService, router, toastService);
|
|
}
|
|
}
|
|
console.log("interceptor error",err.error?.error?.message);
|
|
return throwError(() => err);
|
|
|
|
})
|
|
);
|
|
};
|
|
|
|
function handleUnAuthorizedError(
|
|
req: HttpRequest<any>,
|
|
next: HttpHandlerFn,
|
|
authenticateService: AuthService,
|
|
router: Router,
|
|
toastService: ToastService
|
|
): Observable<HttpEvent<any>> {
|
|
|
|
const refreshTokenRequest = new RefreshTokenRequest();
|
|
refreshTokenRequest.refreshToken = authenticateService.getRefreshToken()!;
|
|
refreshTokenRequest.userId = authenticateService.getUserIdFromToken()!;
|
|
|
|
return authenticateService.renewToken(refreshTokenRequest).pipe(
|
|
switchMap((data) => {
|
|
const tokenResponse = data.value;
|
|
authenticateService.storeRefreshToken(tokenResponse.refreshToken);
|
|
authenticateService.storeToken(tokenResponse.accessToken);
|
|
|
|
req = req.clone({
|
|
setHeaders: {Authorization: `Bearer ${tokenResponse.accessToken}`}
|
|
});
|
|
|
|
return next(req);
|
|
}),
|
|
catchError((err) => {
|
|
return throwError(() => {
|
|
authenticateService.signOut();
|
|
router.navigate(['login']).then(success => {
|
|
if (success) {
|
|
toastService.show(err.error?.error?.message ||'Token is expired, login again!', {
|
|
classname: 'bg-warning text-light',
|
|
delay: 2000
|
|
});
|
|
}
|
|
})
|
|
});
|
|
})
|
|
);
|
|
}
|
|
|
|
|