Files
muzak/frontend/src/data/fetcher.ts
T
2025-08-09 10:46:11 +02:00

94 lines
2.6 KiB
TypeScript

"use client";
import { Fetcher } from "openapi-typescript-fetch";
import { paths, components } from "muzak/data/types";
import { oidcConfig } from "muzak/config/auth";
import { User } from "oidc-client-ts";
export function getUser() {
let oidcStorage = window?.sessionStorage.getItem(
`oidc.user:${oidcConfig.authority}:${oidcConfig.client_id}`,
);
if (!oidcStorage) {
return null;
}
return User.fromStorageString(oidcStorage);
}
const fetcher = Fetcher.for<paths>();
const BASE_URL = process.env.NEXT_PUBLIC_BACKEND_HOST!;
console.log("beest url", BASE_URL);
// Configure the fetcher
fetcher.configure({
baseUrl: BASE_URL,
init: {
headers: {
"Content-Type": "application/json",
},
},
use: [
// Add authentication token to request
async (url, init, next) => {
const user = getUser();
if (user?.access_token) {
(init.headers as any) = {
...init.headers,
Authorization: `Bearer ${user.access_token}`,
"Content-Type": "application/json",
};
}
return next(url, init);
},
// Handle errors
async (url, init, next) => {
const response = await next(url, init);
if (!response.ok) {
if (response.status === 401) {
console.warn("Authentication failed - token may be expired");
}
console.error(`API Error: ${response.status} ${response.statusText}`, {
url,
method: init.method,
});
}
return response;
},
],
});
export const api = {
tracks: {
list: fetcher.path("/api/track/").method("get").create(),
detail: fetcher.path("/api/track/{id}").method("get").create(),
vote: fetcher.path("/api/track/vote").method("get").create(),
nominate: fetcher.path("/api/track/").method("post").create(),
},
artists: {
list: fetcher.path("/api/artist").method("get").create(),
detail: fetcher.path("/api/artist/{id}").method("get").create(),
},
albums: {
list: fetcher.path("/api/album/").method("get").create(),
detail: fetcher.path("/api/album/{id}").method("get").create(),
},
votes: {
list: fetcher.path("/api/vote/").method("get").create(),
detail: fetcher.path("/api/vote/{id}").method("get").create(),
},
users: {
list: fetcher.path("/api/user/").method("get").create(),
},
profiles: {
me: fetcher.path("/api/profile/me").method("get").create(),
},
};
export type User = components["schemas"]["User"];
export type Track = components["schemas"]["Track"];
export type Album = components["schemas"]["Album"];
export type Profile = components["schemas"]["Profile"];
export default api;