Completed
Push — master ( e44197...f3f898 )
by Freek
01:21
created

SendCampaignJob::sendMail()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 17
rs 9.7
c 0
b 0
f 0
cc 3
nc 3
nop 1
1
<?php
2
3
namespace Spatie\EmailCampaigns\Jobs;
4
5
use Illuminate\Support\Str;
6
use Illuminate\Bus\Queueable;
7
use Illuminate\Queue\SerializesModels;
8
use Illuminate\Queue\InteractsWithQueue;
9
use Spatie\EmailCampaigns\Support\Config;
10
use Spatie\EmailCampaigns\Models\Campaign;
11
use Illuminate\Contracts\Queue\ShouldQueue;
12
use Illuminate\Foundation\Bus\Dispatchable;
13
use Spatie\EmailCampaigns\Models\EmailList;
14
use Spatie\EmailCampaigns\Events\CampaignSent;
15
use Spatie\EmailCampaigns\Models\Subscription;
16
use Spatie\EmailCampaigns\Enums\SubscriptionStatus;
17
use Spatie\EmailCampaigns\Actions\PrepareEmailHtmlAction;
18
use Spatie\EmailCampaigns\Actions\PrepareWebviewHtmlAction;
19
20
class SendCampaignJob implements ShouldQueue
21
{
22
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
23
24
    /** @var \Spatie\EmailCampaigns\Models\Campaign */
25
    public $campaign;
26
27
    /** @var string */
28
    public $queue;
29
30
    public function __construct(Campaign $campaign)
31
    {
32
        $this->campaign = $campaign;
33
34
        $this->queue = config('email-campaigns.perform_on_queue.send_campaign_job');
35
    }
36
37
    public function handle()
38
    {
39
        if ($this->campaign->wasAlreadySent()) {
40
            return;
41
        }
42
43
        $this
44
            ->prepareEmailHtml()
45
            ->prepareWebviewHtml()
46
            ->sendMailsForCampaign();
47
    }
48
49
    protected function prepareEmailHtml()
50
    {
51
        $action = Config::getActionClass('prepare_email_html_action', PrepareEmailHtmlAction::class);
52
        $action->execute($this->campaign);
53
54
        return $this;
55
    }
56
57
    protected function prepareWebviewHtml()
58
    {
59
        $action = Config::getActionClass('prepare_webview_html_action', PrepareWebviewHtmlAction::class);
60
        $action->execute($this->campaign);
61
62
        return $this;
63
    }
64
65
    protected function sendMailsForCampaign()
66
    {
67
        $subscriptionsQuery = $this->campaign
68
            ->getSegment()
69
            ->getSubscriptionsQuery($this->campaign)
70
            ->where('status', SubscriptionStatus::SUBSCRIBED)
71
            ->where('email_list_id', $this->campaign->emailList->id);
72
73
        $sentMailCount = 0;
74
        $subscriptionsQuery->each(function (Subscription $subscription) use (&$sentMailCount) {
75
            $this->sendMail($subscription);
76
77
            $sentMailCount++;
78
        });
79
80
        $this->campaign->markAsSent($sentMailCount);
81
82
        event(new CampaignSent($this->campaign));
83
    }
84
85
    protected function sendMail(Subscription $subscription): void
86
    {
87
        if (! $this->campaign->getSegment()->shouldSend($subscription, $this->campaign)) {
88
            return;
89
        }
90
91
        if (! $this->isValidSubscriptionForEmailList($subscription, $this->campaign->emailList)) {
92
            return;
93
        }
94
95
        $pendingSend = $this->campaign->sends()->create([
96
            'email_list_subscription_id' => $subscription->id,
97
            'uuid' => (string) Str::uuid(),
98
        ]);
99
100
        dispatch(new SendMailJob($pendingSend));
101
    }
102
103
    protected function isValidSubscriptionForEmailList(Subscription $subscription, EmailList $emailList): bool
104
    {
105
        if (! $subscription->status === SubscriptionStatus::SUBSCRIBED) {
106
            return false;
107
        }
108
109
        if ((int) $subscription->email_list_id !== (int) $emailList->id) {
110
            return false;
111
        }
112
113
        return true;
114
    }
115
}
116