hss-pos / frontend /src /lib /api /client.js
sashank1989
feat: add Pine Labs EDC integration and WhatsApp conversational ordering
45d313d
Raw
History Blame Contribute Delete
10.1 kB
import axios from 'axios';
const API_BASE = '/api/v1';
const api = axios.create({
baseURL: API_BASE,
timeout: 15000,
headers: {
'Content-Type': 'application/json'
}
});
// Request interceptor - attach JWT token
api.interceptors.request.use(
(config) => {
const token = localStorage.getItem('pos_token');
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
},
(error) => Promise.reject(error)
);
// Response interceptor - handle 401, extract data
api.interceptors.response.use(
(response) => response.data,
(error) => {
if (error.response?.status === 401) {
localStorage.removeItem('pos_token');
localStorage.removeItem('pos_user');
if (typeof window !== 'undefined' && !window.location.pathname.includes('/login')) {
window.location.href = '/login';
}
}
const message = error.response?.data?.error || error.message || 'Something went wrong';
return Promise.reject(new Error(message));
}
);
// ── Auth ──
export const auth = {
login: (username, password) => api.post('/auth/login', { username, password }),
pinLogin: (pin) => api.post('/auth/pin-login', { pin }),
changePassword: (oldPassword, newPassword) =>
api.post('/auth/change-password', { old_password: oldPassword, new_password: newPassword })
};
// ── Users ──
export const users = {
list: (params) => api.get('/users', { params }),
get: (id) => api.get(`/users/${id}`),
create: (data) => api.post('/users', data),
update: (id, data) => api.put(`/users/${id}`, data),
delete: (id) => api.delete(`/users/${id}`),
roles: () => api.get('/roles')
};
// ── Categories ──
export const categories = {
list: () => api.get('/categories'),
get: (id) => api.get(`/categories/${id}`),
create: (data) => api.post('/categories', data),
update: (id, data) => api.put(`/categories/${id}`, data),
delete: (id) => api.delete(`/categories/${id}`)
};
// ── Products ──
export const products = {
list: (params) => api.get('/products', { params }),
get: (id) => api.get(`/products/${id}`),
create: (data) => api.post('/products', data),
update: (id, data) => api.put(`/products/${id}`, data),
delete: (id) => api.delete(`/products/${id}`),
menu: () => api.get('/menu')
};
// ── Modifier Groups ──
export const modifierGroups = {
list: () => api.get('/modifier-groups'),
get: (id) => api.get(`/modifier-groups/${id}`),
create: (data) => api.post('/modifier-groups', data),
update: (id, data) => api.put(`/modifier-groups/${id}`, data),
delete: (id) => api.delete(`/modifier-groups/${id}`)
};
// ── Orders ──
export const orders = {
create: (data) => api.post('/orders', data),
list: (params) => api.get('/orders', { params }),
get: (id) => api.get(`/orders/${id}`),
active: () => api.get('/orders/active'),
addItems: (id, data) => api.post(`/orders/${id}/items`, data),
discount: (id, data) => api.post(`/orders/${id}/discount`, data),
payment: (id, data) => api.post(`/orders/${id}/payment`, data),
void: (id, data) => api.post(`/orders/${id}/void`, data),
reprint: (id) => api.post(`/orders/${id}/reprint`),
splitBill: (id, data) => api.post(`/orders/${id}/split`, data),
mergeTables: (data) => api.post('/orders/merge-tables', data),
transferTable: (id, data) => api.post(`/orders/${id}/transfer-table`, data),
cancelItem: (orderId, itemId, data) => api.patch(`/orders/${orderId}/items/${itemId}/cancel`, data)
};
// ── KOT ──
export const kots = {
list: (params) => api.get('/kots', { params }),
kds: (params) => api.get('/kots/kds', { params }),
history: (params) => api.get('/kots/history', { params }),
updateStatus: (id, data) => api.patch(`/kots/${id}/status`, data),
cancelItem: (kotId, itemId, data) => api.post(`/kots/${kotId}/cancel-item`, data),
markItemReady: (kotId, itemId) => api.patch(`/kots/${kotId}/items/${itemId}/ready`),
stats: () => api.get('/kots/stats')
};
// ── Tables ──
export const tables = {
list: (params) => api.get('/tables', { params }),
get: (id) => api.get(`/tables/${id}`),
create: (data) => api.post('/tables', data),
update: (id, data) => api.put(`/tables/${id}`, data),
delete: (id) => api.delete(`/tables/${id}`),
updateStatus: (id, data) => api.patch(`/tables/${id}/status`, data),
overview: () => api.get('/tables/overview'),
sections: {
list: () => api.get('/tables/sections'),
create: (data) => api.post('/tables/sections', data),
update: (id, data) => api.put(`/tables/sections/${id}`, data),
delete: (id) => api.delete(`/tables/sections/${id}`)
}
};
// ── Inventory ──
export const inventory = {
list: (params) => api.get('/inventory', { params }),
get: (id) => api.get(`/inventory/${id}`),
create: (data) => api.post('/inventory', data),
update: (id, data) => api.put(`/inventory/${id}`, data),
delete: (id) => api.delete(`/inventory/${id}`),
addMovement: (id, data) => api.post(`/inventory/${id}/movements`, data),
movements: (id, params) => api.get(`/inventory/${id}/movements`, { params }),
lowStock: () => api.get('/inventory/low-stock')
};
// ── Recipes ──
export const recipes = {
list: (params) => api.get('/recipes', { params }),
get: (id) => api.get(`/recipes/${id}`),
create: (data) => api.post('/recipes', data),
update: (id, data) => api.put(`/recipes/${id}`, data),
delete: (id) => api.delete(`/recipes/${id}`)
};
// ── Vendors ──
export const vendors = {
list: (params) => api.get('/vendors', { params }),
get: (id) => api.get(`/vendors/${id}`),
create: (data) => api.post('/vendors', data),
update: (id, data) => api.put(`/vendors/${id}`, data),
delete: (id) => api.delete(`/vendors/${id}`)
};
// ── Purchase Orders ──
export const purchaseOrders = {
list: (params) => api.get('/purchase-orders', { params }),
get: (id) => api.get(`/purchase-orders/${id}`),
create: (data) => api.post('/purchase-orders', data),
update: (id, data) => api.put(`/purchase-orders/${id}`, data),
receive: (id, data) => api.post(`/purchase-orders/${id}/receive`, data)
};
// ── Expenses ──
export const expenses = {
list: (params) => api.get('/expenses', { params }),
get: (id) => api.get(`/expenses/${id}`),
create: (data) => api.post('/expenses', data),
update: (id, data) => api.put(`/expenses/${id}`, data),
delete: (id) => api.delete(`/expenses/${id}`),
summary: (params) => api.get('/expenses/summary', { params })
};
// ── Customers ──
export const customers = {
list: (params) => api.get('/customers', { params }),
get: (id) => api.get(`/customers/${id}`),
create: (data) => api.post('/customers', data),
update: (id, data) => api.put(`/customers/${id}`, data),
delete: (id) => api.delete(`/customers/${id}`),
search: (q) => api.get('/customers/search', { params: { q } }),
orders: (id, params) => api.get(`/customers/${id}/orders`, { params }),
loyalty: (id, data) => api.post(`/customers/${id}/loyalty`, data)
};
// ── Reports ──
export const reports = {
dashboard: (params) => api.get('/reports/sales/dashboard', { params }),
sales: (params) => api.get('/reports/sales', { params }),
gst: (params) => api.get('/reports/gst', { params }),
items: (params) => api.get('/reports/items', { params }),
categories: (params) => api.get('/reports/categories', { params }),
captains: (params) => api.get('/reports/captain', { params }),
kitchen: (params) => api.get('/reports/kitchen', { params }),
leakage: (params) => api.get('/reports/revenue-leakage', { params }),
kot: (params) => api.get('/reports/kot', { params }),
cancelledItems: (params) => api.get('/reports/cancelled-items', { params }),
expenses: (params) => api.get('/reports/expenses', { params }),
inventory: (params) => api.get('/reports/inventory', { params })
};
// ── Settings ──
export const settings = {
getConfig: () => api.get('/settings/config'),
updateConfig: (data) => api.put('/settings/config', data)
};
// ── Printers ──
export const printers = {
list: () => api.get('/printers'),
get: (id) => api.get(`/printers/${id}`),
create: (data) => api.post('/printers', data),
update: (id, data) => api.put(`/printers/${id}`, data),
delete: (id) => api.delete(`/printers/${id}`),
test: (id) => api.post(`/printers/${id}/test`),
routes: {
list: () => api.get('/print-routes'),
create: (data) => api.post('/print-routes', data),
delete: (id) => api.delete(`/print-routes/${id}`)
},
jobs: () => api.get('/print-jobs'),
printBill: (orderId) => api.post(`/orders/${orderId}/print-bill`),
printKOT: (kotId) => api.post(`/kots/${kotId}/print`)
};
// ── Online Orders (Swiggy/Zomato) ──
export const onlineOrders = {
list: (params) => api.get('/online-orders', { params }),
counts: () => api.get('/online-orders/counts'),
createManual: (data) => api.post('/online-orders/manual', data),
accept: (id, data) => api.put(`/online-orders/${id}/accept`, data),
reject: (id, data) => api.put(`/online-orders/${id}/reject`, data),
markReady: (id) => api.put(`/online-orders/${id}/ready`),
markPickedUp: (id) => api.put(`/online-orders/${id}/picked-up`),
markDelivered: (id) => api.put(`/online-orders/${id}/delivered`)
};
// ── Platform Config ──
export const platforms = {
list: () => api.get('/platforms'),
get: (id) => api.get(`/platforms/${id}`),
create: (data) => api.post('/platforms', data),
update: (id, data) => api.put(`/platforms/${id}`, data),
delete: (id) => api.delete(`/platforms/${id}`)
};
// ── Webhook Logs ──
export const webhookLogs = {
list: (params) => api.get('/webhook-logs', { params })
};
// ── CRM Campaigns ──
export const campaigns = {
list: (params) => api.get('/campaigns', { params }),
get: (id) => api.get(`/campaigns/${id}`),
create: (data) => api.post('/campaigns', data),
update: (id, data) => api.put(`/campaigns/${id}`, data),
delete: (id) => api.delete(`/campaigns/${id}`)
};
// ── EDC (Card Swipe Machine) ──
export const edc = {
initiate: (data) => api.post('/edc/initiate', data),
status: (id) => api.get(`/edc/status/${id}`),
cancel: (id) => api.post(`/edc/cancel/${id}`),
config: () => api.get('/edc/config')
};
export default api;