diff --git a/src/api/auth_client.ts b/src/api/auth_client.ts new file mode 100644 index 0000000..defd218 --- /dev/null +++ b/src/api/auth_client.ts @@ -0,0 +1,33 @@ +import { createEveningDetectiveServerClient, type EveningDetectiveServer } from "./generated/crabs/evening_detective_server"; +import { createHttpHandler } from "./generated/crabs/evening_detective_server/client"; + + +export function buildAuthClient( + refreshTokens: () => Promise, + getToken: () => string | null, +): EveningDetectiveServer { + return createEveningDetectiveServerClient( + createAuthHttpHandler( + refreshTokens, + createHttpHandler( + getToken, + ) + ) + ) +} + +function createAuthHttpHandler( + refreshTokens: () => Promise, + handler: (request: { path: string, method: string, body: string | null }) => Promise +): (request: { path: string, method: string, body: string | null }) => Promise { + return async ( + request: { path: string, method: string, body: string | null }, + ) => { + try { + return await handler(request) + } catch (error) { + await refreshTokens() + return await handler(request) + } + } +} diff --git a/src/api/generated/crabs/evening_detective_server/client.ts b/src/api/generated/crabs/evening_detective_server/client.ts index 6fd523c..a4c94e4 100644 --- a/src/api/generated/crabs/evening_detective_server/client.ts +++ b/src/api/generated/crabs/evening_detective_server/client.ts @@ -1,20 +1,23 @@ import { createEveningDetectiveServerClient, type EveningDetectiveServer } from "."; -type RequestType = { - path: string; - method: string; - body: string | null; -}; - -function createHttpHandler( - baseURL: string, +export function buildClient( getToken?: () => string | null, -): ( - request: { path: string, method: string, body: string | null }, -) => Promise { +): EveningDetectiveServer { + return createEveningDetectiveServerClient( + createHttpHandler( + getToken, + ) + ) +} + +export function createHttpHandler( + getToken?: () => string | null, +): (request: { path: string, method: string, body: string | null }) => Promise { return async ( request: { path: string, method: string, body: string | null }, ) => { + const baseURL = getURL() + // Формируем полный URL const url = `${baseURL}/${request.path}`; @@ -36,6 +39,10 @@ function createHttpHandler( body: request.body, // body уже JSON-строка из генератора }); + if (response.status == 401) { + throw new Error("unauthorized"); + } + // Парсим ответ const data = await response.json(); @@ -47,14 +54,3 @@ function createHttpHandler( export function getURL(): string { return "http://localhost:8090" } - -export function buildClient( - getToken?: () => string | null, -): EveningDetectiveServer { - return createEveningDetectiveServerClient( - createHttpHandler( - getURL(), - getToken, - ) - ) -} diff --git a/src/components/OfficePage.vue b/src/components/OfficePage.vue index aa161ac..110fdd0 100644 --- a/src/components/OfficePage.vue +++ b/src/components/OfficePage.vue @@ -11,19 +11,34 @@

{{ authStore.userRoles }}

+ + + {{ permissions }}