Update README and documentation; refactor frontend components for improved structure and resilience

This commit is contained in:
glenn schrooyen
2025-09-11 23:46:29 +02:00
parent 63b4bb487d
commit b9206de1a0
49 changed files with 27058 additions and 581 deletions

View File

@@ -0,0 +1,193 @@
import axios from 'axios';
import { API_CONFIG, SERVICE_URLS, FALLBACK_DATA } from '../constants';
import { handleRequestError, formatServiceData, formatEventData } from '../utils/errorHandling';
// Create axios instances with timeout and error handling
const apiClient = axios.create({
baseURL: SERVICE_URLS.API_GATEWAY,
timeout: API_CONFIG.TIMEOUT,
headers: {
'Content-Type': 'application/json',
},
});
const adaptersClient = axios.create({
baseURL: SERVICE_URLS.SERVICE_ADAPTERS,
timeout: API_CONFIG.TIMEOUT,
headers: {
'Content-Type': 'application/json',
},
});
const docsClient = axios.create({
baseURL: SERVICE_URLS.API_DOCS,
timeout: API_CONFIG.TIMEOUT,
headers: {
'Content-Type': 'application/json',
},
});
// API Gateway endpoints
export const apiGateway = {
// Health check
health: async () => {
try {
const response = await apiClient.get('/health');
return { success: true, data: response.data };
} catch (error) {
return { success: false, ...handleRequestError(error) };
}
},
// Dashboards
getDashboards: async () => {
try {
const response = await apiClient.get('/api/dashboards');
return { success: true, data: response.data };
} catch (error) {
return { success: false, data: [], ...handleRequestError(error) };
}
},
// System data
getEvents: async (params = {}) => {
try {
const response = await apiClient.get('/api/system/events', { params });
return { success: true, data: response.data };
} catch (error) {
return { success: false, data: [], ...handleRequestError(error) };
}
},
getDeviceStates: async (params = {}) => {
try {
const response = await apiClient.get('/api/system/device-states', { params });
return { success: true, data: response.data };
} catch (error) {
return { success: false, data: [], ...handleRequestError(error) };
}
},
getSystemMetrics: async () => {
try {
const response = await apiClient.get('/api/system/metrics');
return { success: true, data: response.data };
} catch (error) {
return { success: false, data: null, ...handleRequestError(error) };
}
}
};
// Service Adapters endpoints
export const serviceAdapters = {
// Health check
health: async () => {
try {
const response = await adaptersClient.get('/health');
return { success: true, data: response.data };
} catch (error) {
return { success: false, ...handleRequestError(error) };
}
},
// Services status
getServices: async () => {
try {
const response = await adaptersClient.get('/services');
return { success: true, data: response.data };
} catch (error) {
return { success: false, data: {}, ...handleRequestError(error) };
}
},
// Home Assistant
getHAEntities: async () => {
try {
const response = await adaptersClient.get('/home-assistant/entities');
return { success: true, data: response.data };
} catch (error) {
return { success: false, data: { entities: [] }, ...handleRequestError(error) };
}
},
// Frigate
getFrigateEvents: async () => {
try {
const response = await adaptersClient.get('/frigate/events');
return { success: true, data: response.data };
} catch (error) {
return { success: false, data: { events: [] }, ...handleRequestError(error) };
}
},
getFrigateCameras: async () => {
try {
const response = await adaptersClient.get('/frigate/cameras');
return { success: true, data: response.data };
} catch (error) {
return { success: false, data: { cameras: [] }, ...handleRequestError(error) };
}
},
// Immich
getImmichAssets: async () => {
try {
const response = await adaptersClient.get('/immich/assets');
return { success: true, data: response.data };
} catch (error) {
return { success: false, data: { assets: [] }, ...handleRequestError(error) };
}
},
getImmichAlbums: async () => {
try {
const response = await adaptersClient.get('/immich/albums');
return { success: true, data: response.data };
} catch (error) {
return { success: false, data: { albums: [] }, ...handleRequestError(error) };
}
},
// Events
getEvents: async (limit = 100) => {
try {
const response = await adaptersClient.get('/events', { params: { limit } });
return { success: true, data: response.data };
} catch (error) {
return { success: false, data: { events: [] }, ...handleRequestError(error) };
}
},
publishEvent: async (eventData) => {
try {
const response = await adaptersClient.post('/publish-event', eventData);
return { success: true, data: response.data };
} catch (error) {
return { success: false, ...handleRequestError(error) };
}
}
};
// API Docs endpoints
export const apiDocs = {
health: async () => {
try {
const response = await docsClient.get('/health');
return { success: true, data: response.data };
} catch (error) {
return { success: false, ...handleRequestError(error) };
}
},
getServices: async () => {
try {
const response = await docsClient.get('/services');
return { success: true, data: response.data };
} catch (error) {
return { success: false, data: {}, ...handleRequestError(error) };
}
}
};
// Export fallback data from constants
export const fallbackData = FALLBACK_DATA;