import { useQuery } from '@tanstack/vue-query'; import api from '@/store/api'; /** * Redfish ServiceRoot response interface */ export interface ServiceRoot { '@odata.id': string; '@odata.type': string; Id: string; Name: string; RedfishVersion: string; UUID?: string; Systems?: { '@odata.id': string }; Chassis?: { '@odata.id': string }; Managers?: { '@odata.id': string }; SessionService?: { '@odata.id': string }; AccountService?: { '@odata.id': string }; EventService?: { '@odata.id': string }; UpdateService?: { '@odata.id': string }; ProtocolFeaturesSupported?: { ExpandQuery?: { ExpandAll?: boolean; Levels?: boolean; Links?: boolean; MaxLevels?: number; NoLinks?: boolean; }; FilterQuery?: boolean; SelectQuery?: boolean; OnlyMemberQuery?: boolean; }; } /** * Fetches the Redfish ServiceRoot * @returns {Promise} */ async function fetchServiceRoot(): Promise { const { data } = await api.get('/redfish/v1/'); return data; } /** * TanStack Query hook for fetching and caching Redfish ServiceRoot * * @returns {Object} TanStack Query result * @property {ServiceRoot} data - ServiceRoot data * @property {boolean} isLoading - Loading state * @property {boolean} isError - Error state * @property {Error} error - Error object */ export function useRedfishRoot() { return useQuery({ queryKey: ['redfish', 'serviceRoot'], queryFn: fetchServiceRoot, staleTime: Infinity, // ServiceRoot rarely changes, cache indefinitely gcTime: Infinity, // Keep in cache indefinitely (formerly cacheTime in v4) retry: 3, retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 30000), }); } /** * Helper to check if OData $expand is supported * @param {ServiceRoot} serviceRoot - ServiceRoot data * @returns {boolean} */ export function supportsExpandQuery( serviceRoot: ServiceRoot | undefined, ): boolean { if (!serviceRoot) return false; const maxLevels = serviceRoot.ProtocolFeaturesSupported?.ExpandQuery?.MaxLevels; return typeof maxLevels === 'number' && maxLevels > 0; } /** * Helper to check if OData $select is supported * @param {ServiceRoot} serviceRoot - ServiceRoot data * @returns {boolean} */ export function supportsSelectQuery( serviceRoot: ServiceRoot | undefined, ): boolean { if (!serviceRoot) return false; return serviceRoot.ProtocolFeaturesSupported?.SelectQuery === true; } /** * Helper to check if OData $filter is supported * @param {ServiceRoot} serviceRoot - ServiceRoot data * @returns {boolean} */ export function supportsFilterQuery( serviceRoot: ServiceRoot | undefined, ): boolean { if (!serviceRoot) return false; return serviceRoot.ProtocolFeaturesSupported?.FilterQuery === true; } /** * Helper to get max expand levels supported * @param {ServiceRoot} serviceRoot - ServiceRoot data * @returns {number} Max levels (0 if not supported) */ export function getMaxExpandLevels( serviceRoot: ServiceRoot | undefined, ): number { if (!serviceRoot) return 0; return serviceRoot.ProtocolFeaturesSupported?.ExpandQuery?.MaxLevels || 0; }