xpeditis2.0/apps/frontend/src/lib/api/csv-rates.ts
2026-06-12 11:33:37 +02:00

79 lines
1.8 KiB
TypeScript

/**
* CSV Rates API Client
*
* Client for CSV-based rate search endpoints
*/
import {
CsvRateSearchRequest,
CsvRateSearchResponse,
AvailableCompanies,
FilterOptions,
} from '@/types/rate-filters';
const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4000';
/**
* Create headers — auth is carried by httpOnly cookies (credentials: 'include')
*/
function createHeaders(): HeadersInit {
return {
'Content-Type': 'application/json',
};
}
/**
* Search CSV-based rates with filters
*/
export async function searchCsvRates(
request: CsvRateSearchRequest
): Promise<CsvRateSearchResponse> {
const response = await fetch(`${API_BASE_URL}/api/v1/rates/search-csv`, {
method: 'POST',
credentials: 'include',
headers: createHeaders(),
body: JSON.stringify(request),
});
if (!response.ok) {
const error = await response.json().catch(() => ({}));
throw new Error(error.message || `Failed to search CSV rates: ${response.statusText}`);
}
return response.json();
}
/**
* Get available carrier companies
*/
export async function getAvailableCompanies(): Promise<AvailableCompanies> {
const response = await fetch(`${API_BASE_URL}/api/v1/rates/companies`, {
method: 'GET',
credentials: 'include',
headers: createHeaders(),
});
if (!response.ok) {
throw new Error(`Failed to fetch companies: ${response.statusText}`);
}
return response.json();
}
/**
* Get available filter options
*/
export async function getFilterOptions(): Promise<FilterOptions> {
const response = await fetch(`${API_BASE_URL}/api/v1/rates/filters/options`, {
method: 'GET',
credentials: 'include',
headers: createHeaders(),
});
if (!response.ok) {
throw new Error(`Failed to fetch filter options: ${response.statusText}`);
}
return response.json();
}