CaptainHookServiceProvider   A
last analyzed

Complexity

Total Complexity 22

Size/Duplication

Total Lines 218
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 8

Importance

Changes 5
Bugs 0 Features 0
Metric Value
wmc 22
c 5
b 0
f 0
lcom 1
cbo 8
dl 0
loc 218
rs 10

16 Methods

Rating   Name   Duplication   Size   Complexity  
A boot() 0 12 1
A register() 0 4 1
A publishConfig() 0 6 1
A publishSparkResources() 0 9 1
A registerEventListeners() 0 6 2
A setListeners() 0 6 1
A setWebhooks() 0 7 1
A getCache() 0 4 1
A setCache() 0 4 1
A setClient() 0 4 1
A setConfig() 0 4 1
A handleEvent() 0 10 2
A registerCommands() 0 8 1
A registerRoutes() 0 6 2
A publishMigration() 0 20 3
A getWebhooks() 0 11 2
1
<?php
2
3
namespace Mpociot\CaptainHook;
4
5
use GuzzleHttp\Client;
6
use GuzzleHttp\ClientInterface;
7
use Illuminate\Support\Facades\Event;
8
use Illuminate\Support\Facades\Schema;
9
use Illuminate\Support\ServiceProvider;
10
use Mpociot\CaptainHook\Commands\AddWebhook;
11
use Illuminate\Foundation\Bus\DispatchesJobs;
12
use Mpociot\CaptainHook\Commands\ListWebhooks;
13
use Mpociot\CaptainHook\Commands\DeleteWebhook;
14
use Mpociot\CaptainHook\Jobs\TriggerWebhooksJob;
15
16
/**
17
 * This file is part of CaptainHook arrrrr.
18
 *
19
 * @license MIT
20
 */
21
class CaptainHookServiceProvider extends ServiceProvider
22
{
23
    use DispatchesJobs;
24
25
    /**
26
     * The registered event listeners.
27
     *
28
     * @var array
29
     */
30
    protected $listeners;
31
32
    /**
33
     * All registered webhooks.
34
     * @var array
35
     */
36
    protected $webhooks = [];
37
38
    /**
39
     * @var Client
40
     */
41
    protected $client;
42
43
    /**
44
     * @var \Illuminate\Contracts\Cache\Repository
45
     */
46
    protected $cache;
47
48
    /**
49
     * @var \Illuminate\Contracts\Config\Repository
50
     */
51
    protected $config;
52
53
    /**
54
     * Bootstrap.
55
     */
56
    public function boot()
57
    {
58
        $this->client = new Client();
59
        $this->cache = app('Illuminate\Contracts\Cache\Repository');
60
        $this->config = app('Illuminate\Contracts\Config\Repository');
61
        $this->publishMigration();
62
        $this->publishConfig();
63
        $this->publishSparkResources();
64
        $this->listeners = collect($this->config->get('captain_hook.listeners', []))->values();
0 ignored issues
show
Documentation Bug introduced by
It seems like collect($this->config->g...s', array()))->values() of type object<Illuminate\Support\Collection> is incompatible with the declared type array of property $listeners.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
65
        $this->registerEventListeners();
66
        $this->registerRoutes();
67
    }
68
69
    /**
70
     * Register the service provider.
71
     *
72
     * @return void
73
     */
74
    public function register()
75
    {
76
        $this->registerCommands();
77
    }
78
79
    /**
80
     * Publish migration.
81
     */
82
    protected function publishMigration()
83
    {
84
        $migrations = [
85
            __DIR__.'/../../database/2015_10_29_000000_captain_hook_setup_table.php' =>
86
                database_path('/migrations/2015_10_29_000000_captain_hook_setup_table.php'),
87
            __DIR__.'/../../database/2015_10_29_000001_captain_hook_setup_logs_table.php' =>
88
                database_path('/migrations/2015_10_29_000001_captain_hook_setup_logs_table.php'),
89
        ];
90
91
        // To be backwards compatible
92
        foreach ($migrations as $migration => $toPath) {
93
            preg_match('/_captain_hook_.*\.php/', $migration, $match);
94
            $published_migration = glob(database_path('/migrations/*'.$match[0]));
95
            if (count($published_migration) !== 0) {
96
                unset($migrations[$migration]);
97
            }
98
        }
99
100
        $this->publishes($migrations, 'migrations');
101
    }
102
103
    /**
104
     * Publish configuration file.
105
     */
106
    protected function publishConfig()
107
    {
108
        $this->publishes([
109
            __DIR__.'/../../config/config.php' => config_path('captain_hook.php'),
110
        ]);
111
    }
112
113
    protected function publishSparkResources()
114
    {
115
        $this->loadViewsFrom(__DIR__.'/../../resources/views/', 'captainhook');
116
117
        $this->publishes([
118
            __DIR__.'/../../resources/assets/js/' => base_path('resources/assets/js/components/'),
119
            __DIR__.'/../../resources/views/' => base_path('resources/views/vendor/captainhook/settings/'),
120
        ], 'spark-resources');
121
    }
122
123
    /**
124
     * Register all active event listeners.
125
     */
126
    protected function registerEventListeners()
127
    {
128
        foreach ($this->listeners as $eventName) {
129
            $this->app['events']->listen($eventName, [$this, 'handleEvent']);
130
        }
131
    }
132
133
    /**
134
     * @param array $listeners
135
     */
136
    public function setListeners($listeners)
137
    {
138
        $this->listeners = $listeners;
139
140
        $this->registerEventListeners();
141
    }
142
143
    /**
144
     * @param array $webhooks
145
     */
146
    public function setWebhooks($webhooks)
147
    {
148
        $this->webhooks = $webhooks;
149
        $this->getCache()->rememberForever(Webhook::CACHE_KEY, function () {
150
            return $this->webhooks;
151
        });
152
    }
153
154
    /**
155
     * @return \Illuminate\Support\Collection
156
     */
157
    public function getWebhooks()
158
    {
159
        // Check if migration ran
160
        if (Schema::hasTable((new Webhook)->getTable())) {
161
            return collect($this->getCache()->rememberForever(Webhook::CACHE_KEY, function () {
162
                return Webhook::all();
163
            }));
164
        }
165
166
        return collect();
167
    }
168
169
    /**
170
     * @return \Illuminate\Contracts\Cache\Repository
171
     */
172
    public function getCache()
173
    {
174
        return $this->cache;
175
    }
176
177
    /**
178
     * @param \Illuminate\Contracts\Cache\Repository $cache
179
     */
180
    public function setCache($cache)
181
    {
182
        $this->cache = $cache;
183
    }
184
185
    /**
186
     * @param ClientInterface $client
187
     */
188
    public function setClient($client)
189
    {
190
        $this->client = $client;
0 ignored issues
show
Documentation Bug introduced by
$client is of type object<GuzzleHttp\ClientInterface>, but the property $client was declared to be of type object<GuzzleHttp\Client>. Are you sure that you always receive this specific sub-class here, or does it make sense to add an instanceof check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a given class or a super-class is assigned to a property that is type hinted more strictly.

Either this assignment is in error or an instanceof check should be added for that assignment.

class Alien {}

class Dalek extends Alien {}

class Plot
{
    /** @var  Dalek */
    public $villain;
}

$alien = new Alien();
$plot = new Plot();
if ($alien instanceof Dalek) {
    $plot->villain = $alien;
}
Loading history...
191
    }
192
193
    /**
194
     * @param \Illuminate\Contracts\Config\Repository $config
195
     */
196
    public function setConfig($config)
197
    {
198
        $this->config = $config;
199
    }
200
201
    /**
202
     * Event listener.
203
     *
204
     * @param $eventData
205
     */
206
    public function handleEvent($eventData)
207
    {
208
        $eventName = Event::firing();
209
        $webhooks = $this->getWebhooks()->where('event', $eventName);
210
        $webhooks = $webhooks->filter($this->config->get('captain_hook.filter', null));
211
212
        if (! $webhooks->isEmpty()) {
213
            $this->dispatch(new TriggerWebhooksJob($webhooks, $eventData));
214
        }
215
    }
216
217
    /**
218
     * Register the artisan commands.
219
     */
220
    protected function registerCommands()
221
    {
222
        $this->commands(
223
            ListWebhooks::class,
224
            AddWebhook::class,
225
            DeleteWebhook::class
226
        );
227
    }
228
229
    /**
230
     * Register predefined routes used for Spark.
231
     */
232
    protected function registerRoutes()
233
    {
234
        if (class_exists('Laravel\Spark\Providers\AppServiceProvider')) {
235
            include __DIR__.'/../../routes.php';
236
        }
237
    }
238
}
239