89 lines
3.7 KiB
TypeScript
89 lines
3.7 KiB
TypeScript
import { Product, ProductCreate, Shop, ShopCreate, ShoppingEvent, ShoppingEventCreate, Brand, BrandCreate, Grocery, GroceryCreate, GroceryCategory, GroceryCategoryCreate } from '../types';
|
|
|
|
const API_BASE_URL = '/api';
|
|
|
|
const api = {
|
|
get: <T>(url: string): Promise<{ data: T }> =>
|
|
fetch(`${API_BASE_URL}${url}`).then(res => res.json()).then(data => ({ data })),
|
|
post: <T>(url: string, body: any): Promise<{ data: T }> =>
|
|
fetch(`${API_BASE_URL}${url}`, {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(body),
|
|
}).then(res => res.json()).then(data => ({ data })),
|
|
put: <T>(url: string, body: any): Promise<{ data: T }> =>
|
|
fetch(`${API_BASE_URL}${url}`, {
|
|
method: 'PUT',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(body),
|
|
}).then(res => res.json()).then(data => ({ data })),
|
|
delete: (url: string): Promise<void> =>
|
|
fetch(`${API_BASE_URL}${url}`, { method: 'DELETE' }).then(() => {}),
|
|
};
|
|
|
|
// Product API functions
|
|
export const productApi = {
|
|
getAll: () => api.get<Product[]>('/products/'),
|
|
getById: (id: number) => api.get<Product>(`/products/${id}`),
|
|
create: (product: ProductCreate) => api.post<Product>('/products/', product),
|
|
update: (id: number, product: Partial<ProductCreate>) =>
|
|
api.put<Product>(`/products/${id}`, product),
|
|
delete: (id: number) => api.delete(`/products/${id}`),
|
|
};
|
|
|
|
// Shop API functions
|
|
export const shopApi = {
|
|
getAll: () => api.get<Shop[]>('/shops/'),
|
|
getById: (id: number) => api.get<Shop>(`/shops/${id}`),
|
|
create: (shop: ShopCreate) => api.post<Shop>('/shops/', shop),
|
|
update: (id: number, shop: Partial<ShopCreate>) =>
|
|
api.put<Shop>(`/shops/${id}`, shop),
|
|
delete: (id: number) => api.delete(`/shops/${id}`),
|
|
};
|
|
|
|
// Brand API functions
|
|
export const brandApi = {
|
|
getAll: () => api.get<Brand[]>('/brands/'),
|
|
getById: (id: number) => api.get<Brand>(`/brands/${id}`),
|
|
create: (brand: BrandCreate) => api.post<Brand>('/brands/', brand),
|
|
update: (id: number, brand: Partial<BrandCreate>) =>
|
|
api.put<Brand>(`/brands/${id}`, brand),
|
|
delete: (id: number) => api.delete(`/brands/${id}`),
|
|
};
|
|
|
|
// Grocery Category API functions
|
|
export const groceryCategoryApi = {
|
|
getAll: () => api.get<GroceryCategory[]>('/grocery-categories/'),
|
|
getById: (id: number) => api.get<GroceryCategory>(`/grocery-categories/${id}`),
|
|
create: (category: GroceryCategoryCreate) => api.post<GroceryCategory>('/grocery-categories/', category),
|
|
update: (id: number, category: Partial<GroceryCategoryCreate>) => api.put<GroceryCategory>(`/grocery-categories/${id}`, category),
|
|
delete: (id: number) => api.delete(`/grocery-categories/${id}`),
|
|
};
|
|
|
|
// Shopping Event API functions
|
|
export const shoppingEventApi = {
|
|
getAll: () => api.get<ShoppingEvent[]>('/shopping-events/'),
|
|
getById: (id: number) => api.get<ShoppingEvent>(`/shopping-events/${id}`),
|
|
create: (event: ShoppingEventCreate) => api.post<ShoppingEvent>('/shopping-events/', event),
|
|
update: (id: number, event: ShoppingEventCreate) =>
|
|
api.put<ShoppingEvent>(`/shopping-events/${id}`, event),
|
|
delete: (id: number) => api.delete(`/shopping-events/${id}`),
|
|
};
|
|
|
|
// Grocery API functions
|
|
export const groceryApi = {
|
|
getAll: () => api.get<Grocery[]>('/groceries/'),
|
|
getById: (id: number) => api.get<Grocery>(`/groceries/${id}`),
|
|
create: (grocery: GroceryCreate) => api.post<Grocery>('/groceries/', grocery),
|
|
update: (id: number, grocery: Partial<GroceryCreate>) =>
|
|
api.put<Grocery>(`/groceries/${id}`, grocery),
|
|
delete: (id: number) => api.delete(`/groceries/${id}`),
|
|
};
|
|
|
|
// Statistics API functions
|
|
export const statsApi = {
|
|
getCategories: () => api.get('/stats/categories'),
|
|
getShops: () => api.get('/stats/shops'),
|
|
};
|
|
|
|
export default api;
|