Create useEntityHistory.ts with parameterized entity type. Rewrite useComponentHistory, usePieceHistory, useProductHistory as thin backward-compatible wrappers (67→13 LOC each). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
70 lines
1.9 KiB
TypeScript
70 lines
1.9 KiB
TypeScript
/**
|
|
* 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<string, { from: unknown; to: unknown }> | null
|
|
snapshot: Record<string, unknown> | null
|
|
}
|
|
|
|
const ENTITY_ENDPOINTS: Record<string, string> = {
|
|
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: 'composant' | 'piece' | 'product') {
|
|
const { get } = useApi()
|
|
const basePath = ENTITY_ENDPOINTS[entityType]
|
|
|
|
const history = ref<EntityHistoryEntry[]>([])
|
|
const loading = ref(false)
|
|
const error = ref<string | null>(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 }
|
|
}
|