Files
lunarfront-app/packages/admin/src/api/inventory.ts

171 lines
7.1 KiB
TypeScript

import { queryOptions } from '@tanstack/react-query'
import { api } from '@/lib/api-client'
import type { Category, Supplier, Product, InventoryUnit, ProductSupplier, StockReceipt, PriceHistory } from '@/types/inventory'
import type { PaginatedResponse, PaginationInput } from '@lunarfront/shared/schemas'
// ─── Categories ──────────────────────────────────────────────────────────────
export const categoryKeys = {
all: ['categories'] as const,
list: (params: PaginationInput) => [...categoryKeys.all, 'list', params] as const,
allCategories: [...['categories'], 'all-flat'] as const,
detail: (id: string) => [...categoryKeys.all, 'detail', id] as const,
}
export function categoryListOptions(params: PaginationInput) {
return queryOptions({
queryKey: categoryKeys.list(params),
queryFn: () => api.get<PaginatedResponse<Category>>('/v1/categories', params as Record<string, unknown>),
})
}
export function categoryAllOptions() {
return queryOptions({
queryKey: categoryKeys.allCategories,
queryFn: () => api.get<{ data: Category[] }>('/v1/categories/all'),
})
}
export const categoryMutations = {
create: (data: Record<string, unknown>) => api.post<Category>('/v1/categories', data),
update: (id: string, data: Record<string, unknown>) => api.patch<Category>(`/v1/categories/${id}`, data),
delete: (id: string) => api.del<Category>(`/v1/categories/${id}`),
}
// ─── Suppliers ───────────────────────────────────────────────────────────────
export const supplierKeys = {
all: ['suppliers'] as const,
allSuppliers: ['suppliers', 'all'] as const,
list: (params: PaginationInput) => [...supplierKeys.all, 'list', params] as const,
detail: (id: string) => [...supplierKeys.all, 'detail', id] as const,
}
export function supplierListOptions(params: PaginationInput) {
return queryOptions({
queryKey: supplierKeys.list(params),
queryFn: () => api.get<PaginatedResponse<Supplier>>('/v1/suppliers', params as Record<string, unknown>),
})
}
export function supplierAllOptions() {
return queryOptions({
queryKey: supplierKeys.allSuppliers,
queryFn: () => api.get<{ data: Supplier[] }>('/v1/suppliers/all'),
})
}
export const supplierMutations = {
create: (data: Record<string, unknown>) => api.post<Supplier>('/v1/suppliers', data),
update: (id: string, data: Record<string, unknown>) => api.patch<Supplier>(`/v1/suppliers/${id}`, data),
delete: (id: string) => api.del<Supplier>(`/v1/suppliers/${id}`),
}
// ─── Products ────────────────────────────────────────────────────────────────
export const productKeys = {
all: ['products'] as const,
list: (params: Record<string, unknown>) => [...productKeys.all, 'list', params] as const,
detail: (id: string) => [...productKeys.all, 'detail', id] as const,
}
export function productListOptions(params: Record<string, unknown>) {
return queryOptions({
queryKey: productKeys.list(params),
queryFn: () => api.get<PaginatedResponse<Product>>('/v1/products', params),
})
}
export function productDetailOptions(id: string) {
return queryOptions({
queryKey: productKeys.detail(id),
queryFn: () => api.get<Product>(`/v1/products/${id}`),
enabled: !!id,
})
}
export const productMutations = {
create: (data: Record<string, unknown>) => api.post<Product>('/v1/products', data),
update: (id: string, data: Record<string, unknown>) => api.patch<Product>(`/v1/products/${id}`, data),
delete: (id: string) => api.del<Product>(`/v1/products/${id}`),
}
// ─── Inventory Units ─────────────────────────────────────────────────────────
export const unitKeys = {
all: ['inventory-units'] as const,
byProduct: (productId: string) => [...unitKeys.all, 'product', productId] as const,
detail: (id: string) => [...unitKeys.all, 'detail', id] as const,
}
export function unitListOptions(productId: string) {
return queryOptions({
queryKey: unitKeys.byProduct(productId),
queryFn: () => api.get<{ data: InventoryUnit[] }>(`/v1/products/${productId}/units`),
enabled: !!productId,
})
}
export const unitMutations = {
create: (productId: string, data: Record<string, unknown>) =>
api.post<InventoryUnit>(`/v1/products/${productId}/units`, data),
update: (id: string, data: Record<string, unknown>) =>
api.patch<InventoryUnit>(`/v1/units/${id}`, data),
}
// ─── Product Suppliers ───────────────────────────────────────────────────────
export const productSupplierKeys = {
byProduct: (productId: string) => ['products', productId, 'suppliers'] as const,
}
export function productSupplierListOptions(productId: string) {
return queryOptions({
queryKey: productSupplierKeys.byProduct(productId),
queryFn: () => api.get<{ data: ProductSupplier[] }>(`/v1/products/${productId}/suppliers`),
enabled: !!productId,
})
}
export const productSupplierMutations = {
create: (productId: string, data: Record<string, unknown>) =>
api.post<ProductSupplier>(`/v1/products/${productId}/suppliers`, data),
update: (productId: string, id: string, data: Record<string, unknown>) =>
api.patch<ProductSupplier>(`/v1/products/${productId}/suppliers/${id}`, data),
delete: (productId: string, id: string) =>
api.del(`/v1/products/${productId}/suppliers/${id}`),
}
// ─── Stock Receipts ──────────────────────────────────────────────────────────
export const stockReceiptKeys = {
byProduct: (productId: string) => ['products', productId, 'stock-receipts'] as const,
}
export function stockReceiptListOptions(productId: string) {
return queryOptions({
queryKey: stockReceiptKeys.byProduct(productId),
queryFn: () => api.get<{ data: StockReceipt[] }>(`/v1/products/${productId}/stock-receipts`),
enabled: !!productId,
})
}
export const stockReceiptMutations = {
create: (productId: string, data: Record<string, unknown>) =>
api.post<StockReceipt>(`/v1/products/${productId}/stock-receipts`, data),
}
// ─── Price History ───────────────────────────────────────────────────────────
export const priceHistoryKeys = {
byProduct: (productId: string) => ['products', productId, 'price-history'] as const,
}
export function priceHistoryOptions(productId: string) {
return queryOptions({
queryKey: priceHistoryKeys.byProduct(productId),
queryFn: () => api.get<{ data: PriceHistory[] }>(`/v1/products/${productId}/price-history`),
enabled: !!productId,
})
}