94 lines
2.6 KiB
TypeScript
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;
|