api.js

6.59 KB
12/09/2025 07:17
JS
api.js
/**
 * js/api.js
 * Handles API interactions, with a mockup mode and a real API readiness.
 */

const MOCK_API_DELAY = 800; // Simulate network latency in milliseconds
const USE_MOCK_API = true; // Set to false to connect to real API

// --- Configuration for Real API (if USE_MOCK_API is false) ---
const REAL_API_BASE_URL = 'http://your-real-api.com/api'; // Replace with your actual API base URL

// --- Mockup API Data ---
let mockupCarsData = []; // Will be loaded from data/cars.json

async function loadMockupData() {
    if (mockupCarsData.length === 0) {
        try {
            const response = await fetch('data/cars.json');
            if (!response.ok) {
                throw new Error(`HTTP error! status: ${response.status}`);
            }
            mockupCarsData = await response.json();
            console.log("Mockup cars data loaded successfully.", mockupCarsData);
        } catch (error) {
            console.error("Failed to load mockup car data:", error);
            // Fallback to empty array or predefined static data
            mockupCarsData = []; 
        }
    }
}

// --- API Implementation ---
const api = {
    async get(endpoint, params = {}) {
        if (USE_MOCK_API) {
            await loadMockupData(); // Ensure mockup data is loaded
            return new Promise(resolve => {
                setTimeout(() => {
                    let dataToReturn;
                    let success = true;

                    if (endpoint === '/cars') {
                        // Simulate filtering logic for cars
                        dataToReturn = mockupCarsData.filter(car => {
                            let matches = true;
                            // Example filtering: Add more complex date/location filtering here if needed
                            if (params.type && car.type.toLowerCase() !== params.type.toLowerCase()) {
                                matches = false;
                            }
                            // Simple availability check based on mockup `available` field
                            if (params.available !== undefined && car.available !== params.available) {
                                matches = false;
                            }
                            return matches;
                        });
                        if (dataToReturn.length === 0 && Object.keys(params).length > 0) {
                             success = false; // No cars found for filters
                        }
                    } else if (endpoint.startsWith('/cars/')) {
                        const carId = endpoint.split('/')[2];
                        dataToReturn = mockupCarsData.find(car => car.id === carId);
                        if (!dataToReturn) {
                            success = false; // Car not found
                        }
                    } else if (endpoint === '/user/profile') {
                        // Simulate fetching user profile
                        dataToReturn = { id: 'user123', name: 'Mock User', email: 'mock@example.com' };
                    }
                    else {
                        success = false; // Unknown endpoint
                        dataToReturn = null;
                    }

                    resolve({ success, data: dataToReturn, message: success ? 'OK' : 'Resource not found or failed to filter.' });
                }, MOCK_API_DELAY);
            });
        } else {
            // --- Real API connection ---
            try {
                const queryParams = new URLSearchParams(params).toString();
                const url = `${REAL_API_BASE_URL}${endpoint}${queryParams ? `?${queryParams}` : ''}`;
                const response = await fetch(url);

                if (!response.ok) {
                    throw new Error(`API error! status: ${response.status}`);
                }
                const data = await response.json();
                return { success: true, data };
            } catch (error) {
                console.error(`Error fetching ${endpoint}:`, error);
                return { success: false, message: error.message };
            }
        }
    },

    async post(endpoint, data) {
        if (USE_MOCK_API) {
            return new Promise(resolve => {
                setTimeout(() => {
                    let success = true;
                    let message = "Operation successful";
                    let responseData = null;

                    if (endpoint === '/bookings') {
                        // Simulate a successful booking
                        console.log("Mock API: Booking received", data);
                        responseData = { bookingId: `BOOK-${Date.now()}`, status: 'pending', ...data };
                        message = "Booking created successfully!";
                    } else if (endpoint === '/auth/login') {
                        // Simulate login
                        console.log("Mock API: Login attempt", data);
                        if (data.username === 'user' && data.password === 'pass') {
                            responseData = { token: 'mock-jwt-token', user: { name: 'Mock User', email: data.username } };
                            message = "Login successful!";
                        } else {
                            success = false;
                            message = 'Invalid username or password.';
                        }
                    } else {
                        success = false;
                        message = 'Unknown POST endpoint.';
                    }
                    resolve({ success, data: responseData, message });
                }, MOCK_API_DELAY);
            });
        } else {
            // --- Real API connection ---
            try {
                const response = await fetch(`${REAL_API_BASE_URL}${endpoint}`, {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json',
                        // 'Authorization': `Bearer ${localStorage.getItem('token')}` // Example for authenticated requests
                    },
                    body: JSON.stringify(data)
                });

                const responseData = await response.json();

                if (!response.ok) {
                    throw new Error(responseData.message || `API error! status: ${response.status}`);
                }
                return { success: true, data: responseData, message: responseData.message || 'Operation successful.' };
            } catch (error) {
                console.error(`Error posting to ${endpoint}:`, error);
                return { success: false, message: error.message };
            }
        }
    }
};

export default api;