add refresh

This commit is contained in:
2026-07-18 18:42:05 +07:00
parent 0731123fbb
commit 28f1e43338
3 changed files with 66 additions and 22 deletions
+33
View File
@@ -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<boolean>,
getToken: () => string | null,
): EveningDetectiveServer {
return createEveningDetectiveServerClient(
createAuthHttpHandler(
refreshTokens,
createHttpHandler(
getToken,
)
)
)
}
function createAuthHttpHandler(
refreshTokens: () => Promise<boolean>,
handler: (request: { path: string, method: string, body: string | null }) => Promise<unknown>
): (request: { path: string, method: string, body: string | null }) => Promise<unknown> {
return async (
request: { path: string, method: string, body: string | null },
) => {
try {
return await handler(request)
} catch (error) {
await refreshTokens()
return await handler(request)
}
}
}
@@ -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<unknown> {
): EveningDetectiveServer {
return createEveningDetectiveServerClient(
createHttpHandler(
getToken,
)
)
}
export function createHttpHandler(
getToken?: () => string | null,
): (request: { path: string, method: string, body: string | null }) => Promise<unknown> {
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,
)
)
}
+15
View File
@@ -11,19 +11,34 @@
<p>
{{ authStore.userRoles }}
</p>
<button @click="getPermissions">Права</button>
{{ permissions }}
</template>
<script setup lang="ts">
import { buildAuthClient } from '@/api/auth_client';
import router from '@/router';
import { useAuthStore } from '@/stores/auth';
import { ref } from 'vue';
const authStore = useAuthStore();
const client = buildAuthClient(authStore.refreshTokenAction, authStore.getToken)
const permissions = ref<string[]>([])
const goToLogout = () => {
authStore.logout()
router.push('/login')
}
async function getPermissions() {
permissions.value = []
const res = await client.GetPermissions({})
permissions.value = res.permissions!
}
</script>
<style scoped></style>