package pipeline import ( "strings" "evobgp/internal/store" ) // moduleIngestInputHash fingerprints module config and child entries so snapshots invalidate on CRUD. func moduleIngestInputHash(st store.Backend, tenantID string, mod *store.Module) (string, error) { return store.ComputeModuleInputHash(st, tenantID, mod) } func persistModuleSnapshot(st store.Backend, tenantID string, mod *store.Module, rows []store.PrefixRow) error { if st == nil || mod == nil { return nil } hash, err := moduleIngestInputHash(st, tenantID, mod) if err != nil { return err } if err := st.SetModulePrefixSnapshot(tenantID, mod.ID, hash, rows); err != nil { return err } _ = st.SetModuleInputHash(tenantID, mod.ID, hash) return nil } func moduleRowsFromSnapshot(st store.Backend, tenantID string, mod *store.Module) ([]store.PrefixRow, bool, error) { snap, ok, err := st.GetModulePrefixSnapshot(tenantID, mod.ID) if err != nil || !ok || snap == nil { return nil, false, err } if h := strings.TrimSpace(mod.InputHash); h != "" { if snap.InputHash != h { return nil, false, nil } return append([]store.PrefixRow(nil), snap.Prefixes...), true, nil } // Fallback for rows written before module.input_hash existed: recompute and backfill. hash, err := moduleIngestInputHash(st, tenantID, mod) if err != nil { return nil, false, err } if snap.InputHash != hash { return nil, false, nil } _ = st.SetModuleInputHash(tenantID, mod.ID, hash) return append([]store.PrefixRow(nil), snap.Prefixes...), true, nil }