Files
warmbly/internal/tasks/outbound_execution.go
T

70 lines
1.8 KiB
Go

package tasks
import (
"context"
"errors"
"time"
"github.com/google/uuid"
"github.com/warmbly/warmbly/internal/models"
)
func (s *tasksService) ValidateOutboundExecution(ctx context.Context, taskID uuid.UUID) error {
task, err := s.taskRepo.GetTask(ctx, taskID)
if err != nil {
return err
}
if task == nil {
return errors.New("send task unavailable")
}
a, xerr := s.emailRepo.GetByID(ctx, task.EmailAccountID)
if xerr != nil {
return xerr
}
if a == nil || a.Status != "active" || a.OrganizationID == nil {
return errors.New("mailbox unavailable")
}
if s.orgRiskRepo != nil {
states, err := s.orgRiskRepo.GetOrgRiskStates(ctx, []uuid.UUID{*a.OrganizationID})
if err != nil {
return err
}
if states[*a.OrganizationID] == models.OrgRiskSuspended {
return errors.New("organization sending suspended")
}
}
if s.domainAuthBlocked(ctx, a) {
return errors.New("sending domain authentication unavailable")
}
if task.TaskType == "warmup" {
return s.ValidateWarmupExecution(ctx, taskID)
}
if task.TaskType == "placement" && !a.TestSendingAllowed() {
return errors.New("diagnostic sending stopped")
}
if task.TaskType == "campaign" {
ct, err := s.taskRepo.GetCampaignTask(ctx, taskID)
if err != nil {
return err
}
if ct == nil || ct.CampaignID == nil {
return errors.New("campaign unavailable")
}
gate, ok := s.scheduler.(interface {
OutboundExecutionNotBefore(context.Context, uuid.UUID, uuid.UUID, uuid.UUID, time.Time) (time.Time, error)
})
if !ok {
return errors.New("campaign execution policy unavailable")
}
now := time.Now()
at, err := gate.OutboundExecutionNotBefore(ctx, a.ID, *ct.CampaignID, taskID, now)
if err != nil {
return err
}
if at.After(now) {
return errors.New("send outside current calendar or pacing")
}
}
return nil
}