/**
* 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;