Files
vigilcare-clinical/vigilcare-dashboard/src/api/client.js
T

82 lines
2.3 KiB
JavaScript

const BASE_URL = import.meta.env.VITE_API_URL || 'http://localhost:5270'
let authToken = null
export function setAuthToken(token) {
authToken = token
}
function authHeaders(extra = {}) {
const headers = { 'Content-Type': 'application/json', ...extra }
if (authToken) headers['Authorization'] = `Bearer ${authToken}`
return headers
}
async function request(path, options = {}) {
const res = await fetch(`${BASE_URL}${path}`, {
headers: authHeaders(options.headers),
...options,
})
if (res.status === 401) {
throw new Error('Session expired — please log in again.')
}
const envelope = await res.json()
if (!res.ok || !envelope.success) {
const msg = envelope.error?.message ?? `API ${res.status}: ${path}`
throw new Error(msg)
}
return envelope.data
}
/** Returns null when the resource does not exist yet (HTTP 404 or empty optional payload). */
async function requestOptional(path) {
const res = await fetch(`${BASE_URL}${path}`, {
headers: authHeaders(),
})
if (res.status === 404) return null
if (res.status === 401) {
throw new Error('Session expired — please log in again.')
}
const envelope = await res.json()
if (!res.ok || !envelope.success) {
const msg = envelope.error?.message ?? `API ${res.status}: ${path}`
throw new Error(msg)
}
return envelope.data ?? null
}
export const api = {
get: (path) => request(path),
getOptional: (path) => requestOptional(path),
post: (path, body) => request(path, {
method: 'POST',
body: body !== undefined ? JSON.stringify(body) : undefined,
}),
put: (path, body) => request(path, {
method: 'PUT',
body: body !== undefined ? JSON.stringify(body) : undefined,
}),
patch: (path, body) => request(path, {
method: 'PATCH',
body: body !== undefined ? JSON.stringify(body) : undefined,
}),
delete: async (path) => {
const res = await fetch(`${BASE_URL}${path}`, {
method: 'DELETE',
headers: authHeaders(),
})
if (res.status === 401) {
throw new Error('Session expired — please log in again.')
}
if (res.status === 204) return null
const envelope = await res.json()
if (!res.ok || !envelope.success) {
const msg = envelope.error?.message ?? `API ${res.status}: ${path}`
throw new Error(msg)
}
return envelope.data ?? null
},
}
export { BASE_URL, authHeaders }