diff --git a/src/front/Api/BaseApiService.ts b/src/front/Api/BaseApiService.ts index 40de30f5..45bf7642 100644 --- a/src/front/Api/BaseApiService.ts +++ b/src/front/Api/BaseApiService.ts @@ -1,5 +1,8 @@ import { FrontendVariables } from "@Front/Config/VariablesFront"; import CookieService from "@Front/Services/CookieService/CookieService"; +import jwt_decode from "jwt-decode"; +import JwtService, { ICustomerJwtPayload, IUserJwtPayload } from "@Front/Services/JwtService/JwtService"; +import { NextResponse } from "next/server"; export enum ContentType { JSON = "application/json", @@ -44,6 +47,7 @@ export default abstract class BaseApiService { } protected async getRequest(url: URL, token?: string, contentType?: ContentType, ref?: IRef, fileName?: string) { + await this.checkJwtToken(); const request = async () => await fetch(url, { method: "GET", @@ -53,6 +57,7 @@ export default abstract class BaseApiService { } protected async postRequest(url: URL, body: { [key: string]: unknown } = {}, token?: string) { + await this.checkJwtToken(); return this.sendRequest( async () => await fetch(url, { @@ -64,6 +69,7 @@ export default abstract class BaseApiService { } protected async postRequestFormData(url: URL, body: FormData) { + await this.checkJwtToken(); return this.sendRequest( async () => await fetch(url, { @@ -75,6 +81,7 @@ export default abstract class BaseApiService { } protected async putRequest(url: URL, body: { [key: string]: unknown } = {}, token?: string) { + await this.checkJwtToken(); const request = async () => await fetch(url, { method: "PUT", @@ -86,6 +93,7 @@ export default abstract class BaseApiService { } protected async patchRequest(url: URL, body: { [key: string]: unknown } = {}) { + await this.checkJwtToken(); const request = async () => await fetch(url, { method: "PATCH", @@ -97,6 +105,7 @@ export default abstract class BaseApiService { } protected async deleteRequest(url: URL, body: { [key: string]: unknown } = {}, token?: string) { + await this.checkJwtToken(); const request = async () => await fetch(url, { method: "DELETE", @@ -108,6 +117,7 @@ export default abstract class BaseApiService { } protected async putFormDataRequest(url: URL, body: FormData, token?: string) { + await this.checkJwtToken(); const request = async () => await fetch(url, { method: "PUT", @@ -124,6 +134,42 @@ export default abstract class BaseApiService { return this.processResponse(response, request, ref, fileName); } + private async checkJwtToken() { + const accessToken = CookieService.getInstance().getCookie("leCoffreAccessToken"); + if (!accessToken) { + return; + } + const userDecodedToken = jwt_decode(accessToken) as IUserJwtPayload; + const customerDecodedToken = jwt_decode(accessToken) as ICustomerJwtPayload; + + if (!userDecodedToken && !customerDecodedToken) return NextResponse.redirect(new URL("/login")); + + const now = Math.floor(Date.now() / 1000); + if (userDecodedToken.userId && userDecodedToken.exp < now) { + const refreshToken = CookieService.getInstance().getCookie("leCoffreRefreshToken"); + if (!refreshToken) { + return NextResponse.redirect(new URL("/authorized-client")); + } + const decodedRefreshToken = jwt_decode(refreshToken) as IUserJwtPayload | ICustomerJwtPayload; + if (decodedRefreshToken.exp < now) { + return NextResponse.redirect(new URL("/authorized-client")); + } + await JwtService.getInstance().refreshToken(refreshToken); + } + if (userDecodedToken.userId && userDecodedToken.exp < now) { + const refreshToken = CookieService.getInstance().getCookie("leCoffreRefreshToken"); + if (!refreshToken) { + return NextResponse.redirect(new URL("/id360/customer-callback")); + } + const decodedRefreshToken = jwt_decode(refreshToken) as IUserJwtPayload | ICustomerJwtPayload; + if (decodedRefreshToken.exp < now) { + return NextResponse.redirect(new URL("/id360/customer-callback")); + } + await JwtService.getInstance().refreshToken(refreshToken); + } + return; + } + protected async processResponse(response: Response, request: () => Promise, ref?: IRef, fileName?: string): Promise { let responseContent: T; ref && (ref["response"] = response);