package service import ( "context" "encoding/json" "sync" "github.com/gochat/gochat/internal/model" "github.com/gochat/gochat/internal/worker" ) const TaskTypeConversationDeleteObject = "conversation:delete_object" type conversationDeleteObjectJob struct { AccountID uint `json:"account_id"` ConversationID uint `json:"conversation_id"` } var conversationDeleteRegistrations sync.Map // RegisterConversationDeleteJobs wires Chatwoot's DeleteObjectJob path for // conversation destroy actions. Without a worker, ConversationService.Delete // keeps the synchronous fallback used by focused tests. func RegisterConversationDeleteJobs(wp *worker.WorkerPool, svc *ConversationService) { if wp == nil || svc == nil { return } if _, loaded := conversationDeleteRegistrations.LoadOrStore(wp, struct{}{}); loaded { return } wp.Register(TaskTypeConversationDeleteObject, svc.performConversationDeleteObject) } func (s *ConversationService) performConversationDeleteObject(ctx context.Context, job *model.BackgroundJob) error { var payload conversationDeleteObjectJob if err := json.Unmarshal(job.Payload, &payload); err != nil { return err } return s.deleteNow(ctx, payload.AccountID, payload.ConversationID) }