import { ApiResponse, Exchange, ExchangeDetails, ExchangeStats, ProviderMapping, ProviderExchange, CreateExchangeRequest, UpdateExchangeRequest, CreateProviderMappingRequest, UpdateProviderMappingRequest, } from '../types'; const API_BASE_URL = import.meta.env.VITE_API_BASE_URL || 'http://localhost:4000/api'; class ExchangeApiService { private async request( endpoint: string, options?: RequestInit ): Promise> { const url = `${API_BASE_URL}${endpoint}`; const response = await fetch(url, { headers: { 'Content-Type': 'application/json', ...options?.headers, }, ...options, }); if (!response.ok) { throw new Error(`HTTP ${response.status}: ${response.statusText}`); } const data = await response.json(); if (!data.success) { throw new Error(data.error || 'API request failed'); } return data; } // Exchanges async getExchanges(): Promise { const response = await this.request('/exchanges'); return response.data || []; } async getExchangeById(id: string): Promise { const response = await this.request(`/exchanges/${id}`); return response.data || null; } async createExchange(data: CreateExchangeRequest): Promise { const response = await this.request('/exchanges', { method: 'POST', body: JSON.stringify(data), }); if (!response.data) { throw new Error('No exchange data returned'); } return response.data; } async updateExchange(id: string, data: UpdateExchangeRequest): Promise { const response = await this.request(`/exchanges/${id}`, { method: 'PATCH', body: JSON.stringify(data), }); if (!response.data) { throw new Error('No exchange data returned'); } return response.data; } // Provider Mappings async getProviderMappings(provider?: string): Promise { const endpoint = provider ? `/exchanges/provider-mappings/${provider}` : '/exchanges/provider-mappings/all'; const response = await this.request(endpoint); return response.data || []; } async createProviderMapping(data: CreateProviderMappingRequest): Promise { const response = await this.request('/exchanges/provider-mappings', { method: 'POST', body: JSON.stringify(data), }); if (!response.data) { throw new Error('No provider mapping data returned'); } return response.data; } async updateProviderMapping( id: string, data: UpdateProviderMappingRequest ): Promise { const response = await this.request(`/exchanges/provider-mappings/${id}`, { method: 'PATCH', body: JSON.stringify(data), }); if (!response.data) { throw new Error('No provider mapping data returned'); } return response.data; } // Providers and Utilities async getProviders(): Promise { const response = await this.request('/exchanges/providers/list'); return response.data || []; } async getUnmappedProviderExchanges(provider: string): Promise { const response = await this.request( `/exchanges/provider-exchanges/unmapped/${provider}` ); return response.data || []; } async getExchangeStats(): Promise { const response = await this.request('/exchanges/stats/summary'); if (!response.data) { throw new Error('No exchange stats data returned'); } return response.data; } } // Export singleton instance export const exchangeApi = new ExchangeApiService();