Files
crowdlending-app/frontend/src/api.js
T

78 lines
2.8 KiB
JavaScript

// Tiny fetch wrapper. Reads token + investisseurId from localStorage.
const BASE = import.meta.env.VITE_API_URL || '/api';
function authHeaders() {
const token = localStorage.getItem('cl_token');
const investisseurId = localStorage.getItem('cl_investisseur_id');
const deviceToken = localStorage.getItem('cl_device_token');
const h = {};
if (token) h['Authorization'] = `Bearer ${token}`;
if (investisseurId) h['X-Investisseur-Id'] = investisseurId;
if (deviceToken) h['X-Device-Token'] = deviceToken;
return h;
}
async function handle(res) {
if (res.status === 204) return null;
const text = await res.text();
let body;
try { body = text ? JSON.parse(text) : null; } catch { body = text; }
if (!res.ok) {
const msg = (body && body.error) || res.statusText || 'Request failed';
const err = new Error(msg);
err.status = res.status;
err.code = body && body.code;
err.details = body && body.details;
throw err;
}
return body;
}
export const api = {
get: (path, params) => {
const qs = params ? '?' + new URLSearchParams(
Object.entries(params).filter(([, v]) => v !== undefined && v !== null && v !== '')
).toString() : '';
return fetch(BASE + path + qs, { headers: authHeaders(), cache: 'no-store' }).then(handle);
},
post: (path, body) =>
fetch(BASE + path, {
method: 'POST',
headers: { 'Content-Type': 'application/json', ...authHeaders() },
body: JSON.stringify(body),
}).then(handle),
put: (path, body) =>
fetch(BASE + path, {
method: 'PUT',
headers: { 'Content-Type': 'application/json', ...authHeaders() },
body: JSON.stringify(body),
}).then(handle),
patch: (path, body) =>
fetch(BASE + path, {
method: 'PATCH',
headers: { 'Content-Type': 'application/json', ...authHeaders() },
body: JSON.stringify(body),
}).then(handle),
del: (path, body) =>
fetch(BASE + path, {
method: 'DELETE',
headers: body ? { 'Content-Type': 'application/json', ...authHeaders() } : authHeaders(),
...(body ? { body: JSON.stringify(body) } : {}),
}).then(handle),
upload: (path, formData) =>
fetch(BASE + path, { method: 'POST', body: formData, headers: authHeaders() }).then(handle),
postForm: (path, formData) =>
fetch(BASE + path, { method: 'POST', body: formData, headers: authHeaders() }).then(handle),
blob: (path) =>
fetch(BASE + path, { headers: authHeaders(), cache: 'no-store' }).then(async res => {
if (!res.ok) { const t = await res.text(); throw new Error(t || res.statusText); }
return res.blob();
}),
exportUrl: (path, params) => {
const qs = params ? '?' + new URLSearchParams(params).toString() : '';
const token = localStorage.getItem('cl_token');
return BASE + path + qs + (token ? `${qs ? '&' : '?'}token=${token}` : '');
},
};