66 lines
2.1 KiB
JavaScript
66 lines
2.1 KiB
JavaScript
// [DEF:health_store:Store]
|
|
// @TIER: STANDARD
|
|
// @PURPOSE: Manage dashboard health summary state and failing counts for UI badges.
|
|
// @LAYER: UI
|
|
// @RELATION: DEPENDS_ON -> api.getHealthSummary
|
|
|
|
import { writable, derived } from 'svelte/store';
|
|
import { api } from '../api.js';
|
|
|
|
/**
|
|
* @typedef {Object} HealthState
|
|
* @property {Array} items - List of dashboard health items
|
|
* @property {number} pass_count - Number of passing dashboards
|
|
* @property {number} warn_count - Number of warning dashboards
|
|
* @property {number} fail_count - Number of failing dashboards
|
|
* @property {number} unknown_count - Number of unknown status dashboards
|
|
* @property {boolean} loading - Loading state
|
|
* @property {Date|null} lastUpdated - Last successful fetch timestamp
|
|
*/
|
|
|
|
function createHealthStore() {
|
|
const { subscribe, set, update } = writable({
|
|
items: [],
|
|
pass_count: 0,
|
|
warn_count: 0,
|
|
fail_count: 0,
|
|
unknown_count: 0,
|
|
loading: false,
|
|
lastUpdated: null
|
|
});
|
|
|
|
/**
|
|
* Refresh health summary from API
|
|
* @param {string|null} environmentId - Optional environment filter
|
|
*/
|
|
async function refresh(environmentId = null) {
|
|
update(s => ({ ...s, loading: true }));
|
|
try {
|
|
console.log(`[HealthStore][Action] Refreshing health summary context={{'environmentId': '${environmentId}'}}`);
|
|
const summary = await api.getHealthSummary(environmentId);
|
|
set({
|
|
...summary,
|
|
loading: false,
|
|
lastUpdated: new Date()
|
|
});
|
|
} catch (error) {
|
|
console.error('[HealthStore][Coherence:Failed] Failed to fetch health summary:', error);
|
|
update(s => ({ ...s, loading: false }));
|
|
}
|
|
}
|
|
|
|
return {
|
|
subscribe,
|
|
refresh
|
|
};
|
|
}
|
|
|
|
export const healthStore = createHealthStore();
|
|
|
|
/**
|
|
* Derived store for the total count of failing dashboards.
|
|
* Used for sidebar badges and global notifications.
|
|
*/
|
|
export const failingCount = derived(healthStore, $health => $health.fail_count);
|
|
|
|
// [/DEF:health_store:Store]
|