Passed
Push — ft/urls ( 5c631b...3903c5 )
by Ben
95:30 queued 50:10
created

PublishAssistant   A

Complexity

Total Complexity 25

Size/Duplication

Total Lines 126
Duplicated Lines 0 %

Test Coverage

Coverage 77.96%

Importance

Changes 4
Bugs 2 Features 0
Metric Value
wmc 25
eloc 44
c 4
b 2
f 0
dl 0
loc 126
ccs 46
cts 59
cp 0.7796
rs 10

16 Methods

Rating   Name   Duplication   Size   Complexity  
A isDraft() 0 3 1
A guard() 0 7 2
A can() 0 3 1
A __construct() 0 3 1
A publishedAt() 0 3 1
A publish() 0 7 1
A draft() 0 7 1
A manager() 0 4 1
A route() 0 8 1
A key() 0 3 1
A findAll() 0 4 1
A isPublished() 0 3 1
A publicationStatusAsPlainLabel() 0 11 5
A publicationStatusAsLabel() 0 14 4
A previewUrl() 0 3 1
A hasPreviewUrl() 0 3 2
1
<?php
2
3
4
namespace Thinktomorrow\Chief\Management\Assistants;
5
6
use Carbon\Carbon;
7
use Illuminate\Support\Collection;
8
use Thinktomorrow\Chief\Audit\Audit;
9
use Thinktomorrow\Chief\Management\Manager;
10
use Thinktomorrow\Chief\Management\Managers;
11
use Thinktomorrow\Chief\Management\Exceptions\NotAllowedManagerRoute;
12
use Thinktomorrow\Chief\Urls\ProvidesUrl\ProvidesUrl;
13
14
class PublishAssistant implements Assistant
15
{
16
    private $manager;
17
18
    private $model;
19
20
    /** @var Managers */
21
    private $managers;
22
23 58
    public function __construct(Managers $managers)
24
    {
25 58
        $this->managers = $managers;
26 58
    }
27
28 58
    public function manager(Manager $manager)
29
    {
30 58
        $this->manager = $manager;
31 58
        $this->model = $manager->model();
32 58
    }
33
34 53
    public static function key(): string
35
    {
36 53
        return 'publish';
37
    }
38
39 52
    public function isPublished(): bool
40
    {
41 52
        return $this->model->isPublished();
42
    }
43
44 51
    public function isDraft(): bool
45
    {
46 51
        return $this->model->isDraft();
47
    }
48
49
    public function publishedAt(): Carbon
50
    {
51
        return $this->model->Published_at;
52
    }
53
54 1
    public function publish()
55
    {
56 1
        $this->model->publish();
57
58 1
        Audit::activity()
59 1
            ->performedOn($this->model)
60 1
            ->log('published');
61 1
    }
62
63
    public function draft()
64
    {
65
        $this->model->draft();
66
67
        Audit::activity()
68
            ->performedOn($this->model)
69
            ->log('draft');
70
    }
71
72
    public function findAll(): Collection
73
    {
74
        return $this->model->published()->get()->map(function ($model) {
75
            return $this->managers->findByModel($model);
76
        });
77
    }
78
79 3
    public function route($verb): ?string
80
    {
81
        $modelRoutes = [
82 3
            'publish'   => route('chief.back.assistants.publish', [$this->manager->details()->key, $this->manager->model()->id]),
83 3
            'draft'     => route('chief.back.assistants.draft', [$this->manager->details()->key, $this->manager->model()->id]),
84
        ];
85
86 3
        return $modelRoutes[$verb] ?? null;
87
    }
88
89 1
    public function can($verb): bool
90
    {
91 1
        return !is_null($this->route($verb));
92
    }
93
94 1
    public function guard($verb): Assistant
95
    {
96 1
        if (! $this->can($verb)) {
97
            NotAllowedManagerRoute::notAllowedVerb($verb, $this->manager);
98
        }
99
100 1
        return $this;
101
    }
102
103 52
    public function hasPreviewUrl(): bool
104
    {
105 52
        return $this->model instanceof ProvidesUrl && $this->previewUrl() != '?preview-mode';
106
    }
107
108 52
    public function publicationStatusAsLabel($plain = false)
109
    {
110 52
        $label = $this->publicationStatusAsPlainLabel();
111
112 52
        $class = $this->isPublished() ? 'text-success' : 'text-error';
113
114 52
        $statusAsLabel = '<span class="'. $class .'"><em>' . $label . '</em></span>';
115
116 52
        if(!$plain && $this->hasPreviewUrl())
117
        {
118 28
            $statusAsLabel =  '<a href="'.$this->previewUrl().'" target="_blank">'. $statusAsLabel .'</a>';
119
        }
120
121 36
        return $statusAsLabel;
122
    }
123
124 52
    private function publicationStatusAsPlainLabel()
125
    {
126 52
        if ($this->isPublished()) {
127 4
            return 'online';
128 51
        }elseif ($this->isDraft()) {
129 49
            return 'offline';
130 3
        }elseif ($this->manager->isAssistedBy('archive') && $this->manager->assistant('archive')->isArchived()) {
131 3
            return 'gearchiveerd';
132
        }
133
134
        return '-';
135
    }
136
137 52
    public function previewUrl(): string
138
    {
139 52
        return $this->model->previewUrl();
140
    }
141
}
142