package inventory import ( "context" "fmt" "git.georgsen.dk/hwlab/internal/netbox" ) // CatalogUpdater persists quality gate transitions to NetBox. type CatalogUpdater struct { client *netbox.Client } // NewCatalogUpdater creates a CatalogUpdater backed by the given NetBox client. func NewCatalogUpdater(client *netbox.Client) *CatalogUpdater { return &CatalogUpdater{client: client} } // UpdateCatalogStatus validates the transition from current to next status // and persists the result to NetBox via PatchCustomFields. // Returns the new status on success. // // All catalog_status writes MUST go through this method to ensure T-04-01 mitigation: // the quality gate transition is always validated before any NetBox PATCH. func (u *CatalogUpdater) UpdateCatalogStatus(ctx context.Context, deviceID int, current, next CatalogStatus) (CatalogStatus, error) { newStatus, err := Transition(current, next) if err != nil { return "", err } patch := map[string]interface{}{ "catalog_status": string(newStatus), } if err := u.client.PatchCustomFields(ctx, deviceID, patch); err != nil { return "", fmt.Errorf("persist catalog_status to NetBox: %w", err) } return newStatus, nil }