Passed
Push — 0.3 ( a188cc...3c900f )
by Philippe
27:26
created

PublishAssistant::previewUrl()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 3
Bugs 2 Features 0
Metric Value
eloc 1
c 3
b 2
f 0
dl 0
loc 3
ccs 2
cts 2
cp 1
rs 10
cc 1
nc 1
nop 0
crap 1
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 61
    public function __construct(Managers $managers)
24
    {
25 61
        $this->managers = $managers;
26 61
    }
27
28 61
    public function manager(Manager $manager)
29
    {
30 61
        $this->manager = $manager;
31 61
        $this->model = $manager->model();
32 61
    }
33
34 56
    public static function key(): string
35
    {
36 56
        return 'publish';
37
    }
38
39 55
    public function isPublished(): bool
40
    {
41 55
        return $this->model->isPublished();
42
    }
43
44 53
    public function isDraft(): bool
45
    {
46 53
        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 1
    public function draft()
64
    {
65 1
        $this->model->draft();
66
67 1
        Audit::activity()
68 1
            ->performedOn($this->model)
69 1
            ->log('draft');
70 1
    }
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 5
    public function route($verb): ?string
80
    {
81
        $modelRoutes = [
82 5
            'publish'   => route('chief.back.assistants.publish', [$this->manager->details()->key, $this->manager->model()->id]),
83 5
            'draft'     => route('chief.back.assistants.draft', [$this->manager->details()->key, $this->manager->model()->id]),
84
        ];
85
86 5
        return $modelRoutes[$verb] ?? null;
87
    }
88
89 2
    public function can($verb): bool
90
    {
91 2
        return !is_null($this->route($verb));
92
    }
93
94 2
    public function guard($verb): Assistant
95
    {
96 2
        if (! $this->can($verb)) {
97
            NotAllowedManagerRoute::notAllowedVerb($verb, $this->manager);
98
        }
99
100 2
        return $this;
101
    }
102
103 55
    public function hasPreviewUrl(): bool
104
    {
105 55
        return $this->model instanceof ProvidesUrl && $this->previewUrl() != '?preview-mode';
106
    }
107
108 55
    public function publicationStatusAsLabel($plain = false)
109
    {
110 55
        $label = $this->publicationStatusAsPlainLabel();
111
112 55
        $class = $this->isPublished() ? 'text-success' : 'text-error';
113
114 55
        $statusAsLabel = '<span class="'. $class .'"><em>' . $label . '</em></span>';
115
116 55
        if(!$plain && $this->hasPreviewUrl())
117
        {
118 28
            $statusAsLabel =  '<a href="'.$this->previewUrl().'" target="_blank">'. $statusAsLabel .'</a>';
119
        }
120
121 39
        return $statusAsLabel;
122
    }
123
124 55
    private function publicationStatusAsPlainLabel()
125
    {
126 55
        if ($this->isPublished()) {
127 5
            return 'online';
128 53
        }elseif ($this->isDraft()) {
129 51
            return 'offline';
130 4
        }elseif ($this->manager->isAssistedBy('archive') && $this->manager->assistant('archive')->isArchived()) {
131 4
            return 'gearchiveerd';
132
        }
133
134
        return '-';
135
    }
136
137 55
    public function previewUrl(): string
138
    {
139 55
        return $this->model->previewUrl();
140
    }
141
}
142