package service import ( "context" "encoding/json" "fmt" "sync" "github.com/gochat/gochat/internal/model" "github.com/gochat/gochat/internal/worker" ) const TaskTypeCaptainCopilotResponse = "captain:copilot_response" type captainCopilotResponseJob struct { AccountID uint `json:"account_id"` UserID uint `json:"user_id"` ConversationID uint `json:"conversation_id,omitempty"` CopilotThreadID uint `json:"copilot_thread_id"` MessageID uint `json:"message_id"` Message string `json:"message,omitempty"` } var copilotResponseRegistrations sync.Map func RegisterCopilotResponseJobs(wp *worker.WorkerPool, svc *CopilotService) { if wp == nil || svc == nil { return } if _, loaded := copilotResponseRegistrations.LoadOrStore(wp, struct{}{}); loaded { return } wp.Register(TaskTypeCaptainCopilotResponse, svc.performCopilotResponseJob) } func (s *CopilotService) performCopilotResponseJob(ctx context.Context, job *model.BackgroundJob) error { var payload captainCopilotResponseJob if err := json.Unmarshal(job.Payload, &payload); err != nil { return fmt.Errorf("unmarshal captain copilot response job: %w", err) } if payload.AccountID == 0 || payload.UserID == 0 || payload.CopilotThreadID == 0 || payload.MessageID == 0 { return fmt.Errorf("invalid captain copilot response job payload: %#v", payload) } _, err := s.GenerateCopilotResponseByAccount(ctx, payload.AccountID, payload.UserID, payload.CopilotThreadID, payload.ConversationID, payload.MessageID, payload.Message) return err }