Files
gochat/internal/service/copilot_response_worker.go
T

47 lines
1.5 KiB
Go

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
}