package job import ( "context" "fmt" libpersonacopy "haixun-backend/internal/library/personacopy" aiusecase "haixun-backend/internal/model/ai/usecase" contentformuladomain "haixun-backend/internal/model/content_formula/domain/usecase" copydraftdomain "haixun-backend/internal/model/copy_draft/domain/usecase" jobdom "haixun-backend/internal/model/job/domain/usecase" personadomain "haixun-backend/internal/model/persona/domain/usecase" placementusecase "haixun-backend/internal/model/placement/usecase" threadsaccountdomain "haixun-backend/internal/model/threads_account/domain/usecase" ) type GenerateFormulaDraftDeps struct { Jobs jobdom.UseCase Persona personadomain.UseCase ContentFormula contentformuladomain.UseCase CopyDraft copydraftdomain.UseCase ThreadsAccount threadsaccountdomain.UseCase Placement placementusecase.UseCase AI aiusecase.UseCase } func RegisterGenerateFormulaDraftHandler(runner *Runner, deps GenerateFormulaDraftDeps) { if runner == nil { return } runner.RegisterStepHandler("formula_draft_generate", func(ctx context.Context, step StepContext) error { return runGenerateFormulaDraft(ctx, step, deps) }) } func runGenerateFormulaDraft(ctx context.Context, step StepContext, deps GenerateFormulaDraftDeps) error { payload := step.Run.Payload tenantID, ownerUID := runActorFromPayload(payload, step.Run) personaID := stringField(payload, "persona_id") accountID := stringField(payload, "account_id") formulaID := stringField(payload, "formula_id") topic := stringField(payload, "topic") if tenantID == "" || ownerUID == "" || personaID == "" || accountID == "" || formulaID == "" || topic == "" { return fmt.Errorf("generate-formula-draft payload missing required fields") } updateProgress := func(summary string, percentage int) { _ = step.Heartbeat(ctx) _, _ = deps.Jobs.UpdateProgress(ctx, jobdom.UpdateProgressRequest{ JobID: step.JobID, WorkerID: step.WorkerID, Phase: "formula_draft_generate", Summary: summary, Percentage: percentage, }) } count, err := libpersonacopy.RunFormulaDraft(ctx, libpersonacopy.FormulaDraftDeps{ Persona: deps.Persona, ContentFormula: deps.ContentFormula, CopyDraft: deps.CopyDraft, ThreadsAccount: deps.ThreadsAccount, Placement: deps.Placement, AI: deps.AI, }, libpersonacopy.FormulaDraftInput{ TenantID: tenantID, OwnerUID: ownerUID, PersonaID: personaID, AccountID: accountID, FormulaID: formulaID, Topic: topic, Brief: stringField(payload, "brief"), UseWebSearch: boolField(payload, "use_web_search"), DraftCount: intField(payload, "draft_count"), }, updateProgress) if err != nil { return err } _ = count return nil }