Files
admin-web/src/modules/self-operated/api/analytics.ts
T

33 lines
2.9 KiB
TypeScript

import { http, unwrapApiResponse, type ApiEnvelope } from '@/shared/api/http'
import type { TurnoverQuery, TurnoverResponse } from '../turnoverTypes'
import type { BusinessPage, BusinessQuery, Dashboard, DashboardQuery, DailyResponse, InventoryMetric, InventoryQuery, Metric, Overview, OwnerOption, OwnerOverview, OwnerOverviewQuery, OwnerQuery, RetryCommand, RetryResult, Run, RuntimePage, RuntimeQuery, SalesSummary, Scope, TaskDetail } from '../types'
const base = '/platform/v1/last-leg/self-operated-analytics'
async function get<T>(path: string, params: object, signal?: AbortSignal): Promise<T> {
const response = await http.get<ApiEnvelope<T>, ApiEnvelope<T>>(`${base}/${path}`, { params, signal })
return unwrapApiResponse(response)
}
export const analyticsApi = {
ownerDirectory: (query: { sourceAccount: string; warehouseCode: string } & Partial<BusinessQuery>, signal?: AbortSignal) => get<OwnerOption[]>('owner-directory', query, signal),
async turnover(query: TurnoverQuery, signal?: AbortSignal): Promise<TurnoverResponse> {
const response = await http.get<ApiEnvelope<TurnoverResponse>, ApiEnvelope<TurnoverResponse>>(`${base}/inventory-turnover`, { params: query, paramsSerializer: { indexes: null }, signal })
return unwrapApiResponse(response)
},
dashboard: (query: DashboardQuery, signal?: AbortSignal) => get<Dashboard>('dashboard', query, signal),
owners: (query: OwnerQuery, signal?: AbortSignal) => get<BusinessPage<OwnerOption>>('owners', query, signal),
ownerOverview: (query: OwnerOverviewQuery, signal?: AbortSignal) => get<OwnerOverview | null>('owner-overview', query, signal),
summary: (query: BusinessQuery, signal?: AbortSignal) => get<BusinessPage<SalesSummary>>('sku-sales-summary', query, signal),
daily: (query: BusinessQuery, signal?: AbortSignal) => get<DailyResponse>('sku-daily-sales', query, signal),
hot: (query: BusinessQuery, signal?: AbortSignal) => get<BusinessPage<Metric>>('hot-skus', query, signal),
slow: (query: BusinessQuery, signal?: AbortSignal) => get<BusinessPage<Metric>>('slow-skus', query, signal),
inventory: (query: InventoryQuery, signal?: AbortSignal) => get<BusinessPage<InventoryMetric>>('inventory-coverage', query, signal),
overview: (sourceAccount: string, warehouseCode?: string, signal?: AbortSignal) => get<Overview>('sync-overview', { sourceAccount, warehouseCode }, signal),
tasks: (query: RuntimeQuery, signal?: AbortSignal) => get<RuntimePage<TaskDetail['task']>>('sync-tasks', query, signal),
task: (scope: Scope, taskNo: string, signal?: AbortSignal) => get<TaskDetail>(`sync-tasks/${encodeURIComponent(taskNo)}`, scope, signal),
runs: (query: RuntimeQuery, signal?: AbortSignal) => get<RuntimePage<Run>>('sync-runs', query, signal),
async retry(command: RetryCommand, signal?: AbortSignal): Promise<RetryResult> {
const response = await http.post<ApiEnvelope<RetryResult>, ApiEnvelope<RetryResult>>(`${base}/sync-tasks`, command, { signal })
return unwrapApiResponse(response)
},
}