46 lines
1.8 KiB
JavaScript
46 lines
1.8 KiB
JavaScript
/* Thin API client — all fetch calls go through here */
|
|
|
|
const API = {
|
|
async _fetch(method, path, body) {
|
|
const opts = { method, headers: { 'Content-Type': 'application/json' } };
|
|
if (body !== undefined) opts.body = JSON.stringify(body);
|
|
const res = await fetch('/api' + path, opts);
|
|
const data = await res.json();
|
|
if (!res.ok) throw new Error(data.error || `HTTP ${res.status}`);
|
|
return data;
|
|
},
|
|
|
|
get: (path) => API._fetch('GET', path),
|
|
post: (path, body) => API._fetch('POST', path, body),
|
|
put: (path, body) => API._fetch('PUT', path, body),
|
|
delete: (path) => API._fetch('DELETE', path),
|
|
|
|
// Tracker
|
|
tracker: (year, month) => API.get(`/tracker?year=${year}&month=${month}`),
|
|
|
|
// Bills
|
|
bills: () => API.get('/bills'),
|
|
allBills: () => API.get('/bills?inactive=true'),
|
|
bill: (id) => API.get(`/bills/${id}`),
|
|
createBill: (data) => API.post('/bills', data),
|
|
updateBill: (id, d) => API.put(`/bills/${id}`, d),
|
|
deleteBill: (id) => API.delete(`/bills/${id}`),
|
|
|
|
// Payments
|
|
payments: (billId, y, m) => API.get(`/payments?bill_id=${billId}&year=${y}&month=${m}`),
|
|
quickPay: (data) => API.post('/payments/quick', data),
|
|
createPayment: (data) => API.post('/payments', data),
|
|
updatePayment: (id, data) => API.put(`/payments/${id}`, data),
|
|
deletePayment: (id) => API.delete(`/payments/${id}`),
|
|
|
|
// Categories
|
|
categories: () => API.get('/categories'),
|
|
createCategory: (name) => API.post('/categories', { name }),
|
|
updateCategory: (id, n) => API.put(`/categories/${id}`, { name: n }),
|
|
deleteCategory: (id) => API.delete(`/categories/${id}`),
|
|
|
|
// Settings
|
|
settings: () => API.get('/settings'),
|
|
saveSettings: (data) => API.put('/settings', data),
|
|
};
|