Files
gochat/internal/service/contact_import_worker.go
T

48 lines
1.2 KiB
Go

package service
import (
"context"
"encoding/json"
"fmt"
"sync"
"github.com/gochat/gochat/internal/model"
"github.com/gochat/gochat/internal/worker"
)
const TaskTypeContactImport = "contact:import"
type contactImportConfig struct {
CSVBase64 string `json:"csv_base64"`
}
type contactImportJob struct {
ImportID uint `json:"import_id"`
}
var contactImportRegistrations sync.Map
// RegisterContactImportJobs wires Chatwoot DataImportJob contacts import into
// the durable worker. Handlers are registered once per WorkerPool instance.
func RegisterContactImportJobs(wp *worker.WorkerPool, svc *ContactService) {
if wp == nil || svc == nil {
return
}
if _, loaded := contactImportRegistrations.LoadOrStore(wp, struct{}{}); loaded {
return
}
wp.Register(TaskTypeContactImport, svc.performContactImportJob)
}
func (s *ContactService) performContactImportJob(ctx context.Context, job *model.BackgroundJob) error {
var payload contactImportJob
if err := json.Unmarshal(job.Payload, &payload); err != nil {
return fmt.Errorf("unmarshal contact import job: %w", err)
}
if payload.ImportID == 0 {
return fmt.Errorf("invalid contact import job payload: %#v", payload)
}
_, err := s.performContactImport(ctx, payload.ImportID)
return err
}