| | import { base } from '$app/paths';
|
| | import { getJsonHeaders, getAuthHeaders } from './api-headers';
|
| | import { UrlPrefix } from '$lib/enums';
|
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| | export interface ApiFetchOptions extends Omit<RequestInit, 'headers'> {
|
| | |
| | |
| | |
| |
|
| | authOnly?: boolean;
|
| | |
| | |
| |
|
| | headers?: Record<string, string>;
|
| | }
|
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | export async function apiFetch<T>(path: string, options: ApiFetchOptions = {}): Promise<T> {
|
| | const { authOnly = false, headers: customHeaders, ...fetchOptions } = options;
|
| |
|
| | const baseHeaders = authOnly ? getAuthHeaders() : getJsonHeaders();
|
| | const headers = { ...baseHeaders, ...customHeaders };
|
| |
|
| | const url =
|
| | path.startsWith(UrlPrefix.HTTP) || path.startsWith(UrlPrefix.HTTPS) ? path : `${base}${path}`;
|
| |
|
| | const response = await fetch(url, {
|
| | ...fetchOptions,
|
| | headers
|
| | });
|
| |
|
| | if (!response.ok) {
|
| | const errorMessage = await parseErrorMessage(response);
|
| | throw new Error(errorMessage);
|
| | }
|
| |
|
| | return response.json() as Promise<T>;
|
| | }
|
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | export async function apiFetchWithParams<T>(
|
| | basePath: string,
|
| | params: Record<string, string>,
|
| | options: ApiFetchOptions = {}
|
| | ): Promise<T> {
|
| | const url = new URL(basePath, window.location.href);
|
| |
|
| | for (const [key, value] of Object.entries(params)) {
|
| | if (value !== undefined && value !== null) {
|
| | url.searchParams.set(key, value);
|
| | }
|
| | }
|
| |
|
| | const { authOnly = false, headers: customHeaders, ...fetchOptions } = options;
|
| |
|
| | const baseHeaders = authOnly ? getAuthHeaders() : getJsonHeaders();
|
| | const headers = { ...baseHeaders, ...customHeaders };
|
| |
|
| | const response = await fetch(url.toString(), {
|
| | ...fetchOptions,
|
| | headers
|
| | });
|
| |
|
| | if (!response.ok) {
|
| | const errorMessage = await parseErrorMessage(response);
|
| | throw new Error(errorMessage);
|
| | }
|
| |
|
| | return response.json() as Promise<T>;
|
| | }
|
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | export async function apiPost<T, B = unknown>(
|
| | path: string,
|
| | body: B,
|
| | options: ApiFetchOptions = {}
|
| | ): Promise<T> {
|
| | return apiFetch<T>(path, {
|
| | method: 'POST',
|
| | body: JSON.stringify(body),
|
| | ...options
|
| | });
|
| | }
|
| |
|
| | |
| | |
| | |
| |
|
| | async function parseErrorMessage(response: Response): Promise<string> {
|
| | try {
|
| | const errorData = await response.json();
|
| | if (errorData?.error?.message) {
|
| | return errorData.error.message;
|
| | }
|
| | if (errorData?.error && typeof errorData.error === 'string') {
|
| | return errorData.error;
|
| | }
|
| | if (errorData?.message) {
|
| | return errorData.message;
|
| | }
|
| | } catch {
|
| |
|
| | }
|
| |
|
| | return `Request failed: ${response.status} ${response.statusText}`;
|
| | }
|
| |
|