package httpapi import ( "context" "knowledge-governance/internal/governance" "knowledge-governance/internal/jobs" "time" ) // In-memory API fixture mirrors dispatch shape; atomicity is tested against PG. func (s *fakeLibraryStore) CreateLibraryDispatch(ctx context.Context, job governance.LibraryJob, stages []string, handoff bool, now time.Time) (governance.LibraryJob, bool, error) { created, reused, err := s.CreateLibraryJob(ctx, job, stages, now) if err != nil { return created, reused, err } if reused && (created.State != governance.LibraryJobPending || created.QueueJobID != "") { return created, reused, nil } id, kind, payload, err := governance.LibraryQueueRequest(handoff, created.ID, created.Scope, created.TargetSnapshotID, "library."+string(created.Kind)) if err != nil { return created, reused, err } queued, err := s.Enqueue(ctx, jobs.EnqueueRequest{ID: id, Type: kind, Payload: payload, AvailableAt: now, MaxAttempts: 1, IdempotencyKey: kind + ".queue:" + created.ID}, now) if err != nil { s.lastJob = governance.LibraryJob{} return governance.LibraryJob{}, false, err } if err = s.AttachLibraryQueueJob(ctx, created.ID, queued.ID, now); err != nil { return created, reused, err } created.QueueJobID = queued.ID return created, reused, nil }