Files
ss-tools/frontend/src/lib/stores/health.js
2026-03-10 12:00:18 +03:00

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]