Completed
Push — master ( f2cb96...f968aa )
by Freek
01:28
created

EmailList::isSubscribed()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 12
rs 9.8666
c 0
b 0
f 0
cc 3
nc 3
nop 1
1
<?php
2
3
namespace Spatie\EmailCampaigns\Models;
4
5
use Illuminate\Database\Eloquent\Model;
6
use Illuminate\Database\Eloquent\Relations\HasMany;
7
use Spatie\EmailCampaigns\Enums\SubscriptionStatus;
8
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
9
10
class EmailList extends Model
11
{
12
    public $guarded = [];
13
14
    public function subscribers(): BelongsToMany
15
    {
16
        return $this->allSubscribers()->wherePivot('status', SubscriptionStatus::SUBSCRIBED);
17
    }
18
19
    public function allSubscribers(): BelongsToMany
20
    {
21
        return $this->belongsToMany(Subscriber::class, 'email_list_subscriptions', 'email_list_id', 'email_list_subscriber_id');
22
    }
23
24
    public function subscriptions(): HasMany
25
    {
26
        return $this->hasMany(Subscription::class)->where('status', SubscriptionStatus::SUBSCRIBED);
27
    }
28
29
    public function allSubscriptions(): HasMany
30
    {
31
        return $this->hasMany(Subscription::class);
32
    }
33
34
    public function campaigns(): HasMany
35
    {
36
        return $this->hasMany(Campaign::class);
37
    }
38
39
    public function subscribe(string $email): Subscription
40
    {
41
        $subscriber = $this->createSubscriber($email);
42
43
        return $subscriber->subscribeTo($this);
44
    }
45
46
    public function subscribeNow(string $email): Subscription
47
    {
48
        $subscriber = $this->createSubscriber($email);
49
50
        return $subscriber->subscribeNowTo($this);
51
    }
52
53
    protected function createSubscriber(string $email): Subscriber
54
    {
55
        return Subscriber::firstOrCreate([
56
            'email' => $email,
57
        ]);
58
    }
59
60
    public function isSubscribed(string $email): bool
61
    {
62
        if (! $subscriber = Subscriber::findForEmail($email)) {
63
            return false;
64
        }
65
66
        if (! $subscription = $this->getSubscription($subscriber)) {
67
            return false;
68
        }
69
70
        return $subscription->status === SubscriptionStatus::SUBSCRIBED;
71
    }
72
73
    public function getSubscription(Subscriber $subscriber): ?Subscription
74
    {
75
        return Subscription::query()
76
            ->where('email_list_id', $this->id)
77
            ->where('email_list_subscriber_id', $subscriber->id)
78
            ->first();
79
    }
80
81
    public function unsubscribe(string $email): bool
82
    {
83
        if (! $subscriber = Subscriber::findForEmail($email)) {
84
            return false;
85
        }
86
87
        if (! $subscription = $this->getSubscription($subscriber)) {
88
            return false;
89
        }
90
91
        $subscription->markAsUnsubscribed();
92
93
        return true;
94
    }
95
}
96