/** * Generic entity history composable. * * Replaces useComponentHistory, usePieceHistory, useProductHistory which were * 99% identical (only the API endpoint differed). */ import { ref } from 'vue' import { useApi } from '~/composables/useApi' export type EntityHistoryActor = { id: string label: string } export type EntityHistoryEntry = { id: string action: 'create' | 'update' | 'delete' | string createdAt: string actor: EntityHistoryActor | null diff: Record | null snapshot: Record | null } const ENTITY_ENDPOINTS: Record = { machine: '/machines', composant: '/composants', piece: '/pieces', product: '/products', } const extractItems = (payload: any): EntityHistoryEntry[] => { if (Array.isArray(payload?.items)) return payload.items if (Array.isArray(payload?.member)) return payload.member if (Array.isArray(payload?.['hydra:member'])) return payload['hydra:member'] return [] } export function useEntityHistory(entityType: 'machine' | 'composant' | 'piece' | 'product') { const { get } = useApi() const basePath = ENTITY_ENDPOINTS[entityType] const history = ref([]) const loading = ref(false) const error = ref(null) const loadHistory = async (entityId: string) => { loading.value = true error.value = null try { const result = await get(`${basePath}/${entityId}/history`) if (!result.success) { error.value = result.error ?? 'Impossible de charger l\'historique.' history.value = [] return result } history.value = extractItems(result.data) return { success: true, data: history.value } } catch (err: any) { const message = err?.message ?? 'Erreur inconnue' error.value = message history.value = [] return { success: false, error: message } } finally { loading.value = false } } return { history, loading, error, loadHistory } }