60 lines
2.5 KiB
TypeScript
60 lines
2.5 KiB
TypeScript
import type {
|
|
ApiEnvelope,
|
|
DailyMileageRow,
|
|
DashboardSummary,
|
|
HistoryLocationRow,
|
|
MileageSummary,
|
|
OpsHealth,
|
|
Page,
|
|
QualitySummary,
|
|
QualityIssueRow,
|
|
RawFrameRow,
|
|
RealtimeLocationRow,
|
|
VehicleRealtimeRow,
|
|
VehicleCoverageRow,
|
|
VehicleDetail,
|
|
VehicleRow
|
|
} from './types';
|
|
|
|
export type RawFrameQuery = {
|
|
keyword?: string;
|
|
vin?: string;
|
|
protocol?: string;
|
|
dateFrom?: string;
|
|
dateTo?: string;
|
|
fields?: string[];
|
|
includeFields?: boolean;
|
|
limit?: number;
|
|
offset?: number;
|
|
};
|
|
|
|
async function request<T>(path: string, init?: RequestInit): Promise<T> {
|
|
const response = await fetch(path, init);
|
|
if (!response.ok) {
|
|
throw new Error(`request failed ${response.status}`);
|
|
}
|
|
const envelope = (await response.json()) as ApiEnvelope<T>;
|
|
return envelope.data;
|
|
}
|
|
|
|
export const api = {
|
|
dashboardSummary: () => request<DashboardSummary>('/api/dashboard/summary'),
|
|
vehicles: (params = new URLSearchParams()) => request<Page<VehicleRow>>(`/api/vehicles?${params.toString()}`),
|
|
vehicleCoverage: (params = new URLSearchParams()) => request<Page<VehicleCoverageRow>>(`/api/vehicles/coverage?${params.toString()}`),
|
|
vehicleDetail: (params = new URLSearchParams()) => request<VehicleDetail>(`/api/vehicles/detail?${params.toString()}`),
|
|
vehicleRealtime: (params = new URLSearchParams()) => request<Page<VehicleRealtimeRow>>(`/api/realtime/vehicles?${params.toString()}`),
|
|
realtimeLocations: (params = new URLSearchParams()) => request<Page<RealtimeLocationRow>>(`/api/realtime/locations?${params.toString()}`),
|
|
historyLocations: (params = new URLSearchParams()) => request<Page<HistoryLocationRow>>(`/api/history/locations?${params.toString()}`),
|
|
rawFrames: (params = new URLSearchParams()) => request<Page<RawFrameRow>>(`/api/history/raw-frames?${params.toString()}`),
|
|
rawFramesQuery: (query: RawFrameQuery) => request<Page<RawFrameRow>>('/api/history/raw-frames/query', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(query)
|
|
}),
|
|
mileageSummary: (params = new URLSearchParams()) => request<MileageSummary>(`/api/mileage/summary?${params.toString()}`),
|
|
dailyMileage: (params = new URLSearchParams()) => request<Page<DailyMileageRow>>(`/api/mileage/daily?${params.toString()}`),
|
|
qualitySummary: (params = new URLSearchParams()) => request<QualitySummary>(`/api/quality/summary?${params.toString()}`),
|
|
qualityIssues: (params = new URLSearchParams()) => request<Page<QualityIssueRow>>(`/api/quality/issues?${params.toString()}`),
|
|
opsHealth: () => request<OpsHealth>('/api/ops/health')
|
|
};
|