Test Setup Failed
Push — ft/tiptap-editor ( 7b0ae7...cd4579 )
by
unknown
08:28
created

ChiefServiceProvider::bootEssentials()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 9
nc 1
nop 0
dl 0
loc 13
rs 9.9666
c 0
b 0
f 0
1
<?php
2
3
namespace Thinktomorrow\Chief\App\Providers;
4
5
use Illuminate\Auth\Events\Login;
6
use Illuminate\Database\Eloquent\Relations\Relation;
7
use Illuminate\Support\Facades\Auth;
8
use Illuminate\Support\Facades\Event;
9
use Illuminate\Support\ServiceProvider;
10
use Spatie\Sitemap\SitemapServiceProvider;
11
use Thinktomorrow\Chief\Admin\Authorization\ChiefUserProvider;
12
use Thinktomorrow\Chief\Admin\Authorization\Permission;
13
use Thinktomorrow\Chief\Admin\Authorization\Role;
14
use Thinktomorrow\Chief\Admin\Nav\Nav;
15
use Thinktomorrow\Chief\Admin\Settings\SettingFields;
16
use Thinktomorrow\Chief\Admin\Settings\Settings;
17
use Thinktomorrow\Chief\Admin\Users\Application\EnableUser;
18
use Thinktomorrow\Chief\Admin\Users\Invites\Application\SendInvite;
19
use Thinktomorrow\Chief\Admin\Users\Invites\Events\InviteAccepted;
20
use Thinktomorrow\Chief\Admin\Users\Invites\Events\UserInvited;
21
use Thinktomorrow\Chief\Admin\Users\User;
22
use Thinktomorrow\Chief\App\Console\GenerateImageSitemap;
23
use Thinktomorrow\Chief\App\Console\GenerateSitemap;
24
use Thinktomorrow\Chief\App\Http\Controllers\Back\System\SettingsController;
25
use Thinktomorrow\Chief\App\Listeners\LogSuccessfulLogin;
26
use Thinktomorrow\Chief\Assets\AssetsServiceProvider;
27
use Thinktomorrow\Chief\Forms\Events\FormUpdated;
28
use Thinktomorrow\Chief\Forms\FormsServiceProvider;
29
use Thinktomorrow\Chief\Fragments\App\Actions\CreateFirstContextForPage;
30
use Thinktomorrow\Chief\Fragments\App\Actions\DeleteFragment;
31
use Thinktomorrow\Chief\Fragments\App\Actions\UpdateFragmentMetadata;
32
use Thinktomorrow\Chief\Fragments\Events\FragmentAttached;
33
use Thinktomorrow\Chief\Fragments\Events\FragmentDetached;
34
use Thinktomorrow\Chief\Fragments\Events\FragmentDuplicated;
35
use Thinktomorrow\Chief\Fragments\Events\FragmentsReordered;
36
use Thinktomorrow\Chief\Fragments\Events\FragmentUpdated;
37
use Thinktomorrow\Chief\Fragments\FragmentsServiceProvider;
38
use Thinktomorrow\Chief\ManagedModels\Actions\DeleteModel;
39
use Thinktomorrow\Chief\ManagedModels\Events\ManagedModelArchived;
40
use Thinktomorrow\Chief\ManagedModels\Events\ManagedModelCreated;
41
use Thinktomorrow\Chief\ManagedModels\Events\ManagedModelDeleted;
42
use Thinktomorrow\Chief\ManagedModels\Events\ManagedModelPublished;
43
use Thinktomorrow\Chief\ManagedModels\Events\ManagedModelQueuedForDeletion;
44
use Thinktomorrow\Chief\ManagedModels\Events\ManagedModelUnPublished;
45
use Thinktomorrow\Chief\ManagedModels\Events\ManagedModelUpdated;
46
use Thinktomorrow\Chief\ManagedModels\Events\ManagedModelUrlUpdated;
47
use Thinktomorrow\Chief\ManagedModels\Listeners\PropagateArchivedUrl;
48
use Thinktomorrow\Chief\ManagedModels\Listeners\TriggerPageChangedEvent;
49
use Thinktomorrow\Chief\ManagedModels\States\StatesServiceProvider;
50
use Thinktomorrow\Chief\Managers\Register\Registry;
51
use Thinktomorrow\Chief\Menu\App\Actions\ProjectModelData;
52
use Thinktomorrow\Chief\Menu\MenuServiceProvider;
53
use Thinktomorrow\Chief\Models\ModelsServiceProvider;
54
use Thinktomorrow\Chief\Shared\AdminEnvironment;
55
use Thinktomorrow\Chief\Sites\SitesServiceProvider;
56
use Thinktomorrow\Chief\Table\TableServiceProvider;
57
use Thinktomorrow\Chief\Urls\App\Listeners\CreatePageFirstUrls;
58
use Thinktomorrow\Chief\Urls\App\Listeners\PropagateUrlChange;
59
use Thinktomorrow\Chief\Urls\UrlsServiceProvider;
60
use Thinktomorrow\Squanto\SquantoManagerServiceProvider;
61
use Thinktomorrow\Squanto\SquantoServiceProvider;
62
63
class ChiefServiceProvider extends ServiceProvider
64
{
65
    private SitemapServiceProvider $sitemapServiceProvider;
66
67
    // TODO: use this list to loop over all SP. Each SP should have boot method for frontend essentials
68
    // and a bootAdmin for the admin booting. Also a register and registerAdmin method. This allows
69
    // To make distinction per provider instead of doing this all here in the main service provider.
70
    // NOt in use yet... perhaps use a ChiefServiceProviderInterface for this.
71
    private array $internalProviders = [
0 ignored issues
show
introduced by
The private property $internalProviders is not used, and could be removed.
Loading history...
72
        SitesServiceProvider::class,
73
        StatesServiceProvider::class,
74
        SquantoServiceProvider::class,
75
        RoutesServiceProvider::class,
76
        FragmentsServiceProvider::class,
77
        ModelsServiceProvider::class,
78
        UrlsServiceProvider::class,
79
        MenuServiceProvider::class,
80
        SquantoManagerServiceProvider::class,
81
        AssetsServiceProvider::class,
82
    ];
83
84
    public function __construct($app)
85
    {
86
        parent::__construct($app);
87
88
        // Spatie Package logic sets a Package property on register so this needs to be retained when calling boot as well
89
        $this->sitemapServiceProvider = new SitemapServiceProvider($app);
90
    }
91
92
    public function boot(): void
93
    {
94
        /*
95
         * ------------------------------------
96
         * Boot required for frontend
97
         * ------------------------------------
98
         */
99
        $this->bootEssentials();
100
101
        if (! $this->app->make(AdminEnvironment::class)->check(request())) {
102
            return;
103
        }
104
105
        /*
106
         * ------------------------------------
107
         * Boot required for admin
108
         * ------------------------------------
109
         */
110
        $this->bootChiefSquanto();
111
        $this->bootEvents();
112
113
        (new ViewServiceProvider($this->app))->boot();
114
        (new FormsServiceProvider($this->app))->boot();
115
        (new UrlsServiceProvider($this->app))->bootAdmin();
116
        (new FragmentsServiceProvider($this->app))->bootAdmin();
117
        (new ModelsServiceProvider($this->app))->bootAdmin();
118
        (new MenuServiceProvider($this->app))->bootAdmin();
119
        (new TableServiceProvider($this->app))->boot();
120
        (new AssetsServiceProvider($this->app))->boot();
121
        (new SquantoManagerServiceProvider($this->app))->boot();
122
        $this->sitemapServiceProvider->boot();
123
124
        // Sitemap command is used by both cli and web scripts
125
        $this->commands(['command.chief:sitemap']);
126
        $this->commands(['command.chief:image-sitemap']);
127
        $this->app->bind('command.chief:sitemap', GenerateSitemap::class);
128
        $this->app->bind('command.chief:image-sitemap', GenerateImageSitemap::class);
129
130
        if ($this->app->runningInConsole()) {
131
            (new ConsoleServiceProvider($this->app))->boot();
132
        }
133
    }
134
135
    private function bootEssentials()
136
    {
137
        (new SitesServiceProvider($this->app))->boot();
138
        (new StatesServiceProvider($this->app))->boot();
139
        (new SquantoServiceProvider($this->app))->boot();
140
        (new RoutesServiceProvider($this->app))->boot();
141
142
        $this->bootChiefAuth();
143
144
        (new UrlsServiceProvider($this->app))->boot();
145
        (new FragmentsServiceProvider($this->app))->boot();
146
        (new ModelsServiceProvider($this->app))->boot();
147
        (new MenuServiceProvider($this->app))->boot();
148
    }
149
150
    private function bootChiefAuth(): void
151
    {
152
        $this->app['config']['auth.guards.chief'] = [
153
            'driver' => 'session',
154
            'provider' => 'chief',
155
        ];
156
157
        $this->app['config']['auth.providers.chief'] = [
158
            'driver' => 'chief-eloquent',
159
            'model' => User::class,
160
        ];
161
162
        $this->app['config']['auth.passwords.chief'] = [
163
            'provider' => 'chief',
164
            'table' => 'chief_password_resets',
165
            'expire' => 60,
166
        ];
167
168
        // Custom models for permission
169
        $this->app['config']['permission.models'] = [
170
            'permission' => Permission::class,
171
            'role' => Role::class,
172
        ];
173
174
        Auth::provider('chief-eloquent', function ($app, array $config) {
175
            return new ChiefUserProvider($app['hash'], $config['model']);
176
        });
177
    }
178
179
    private function bootChiefSquanto(): void
180
    {
181
        // Project specific squanto files
182
        $this->app['view']->addNamespace('squanto', __DIR__.'/../../resources/views/vendor/squanto');
183
184
        // Chief squanto defaults
185
        $this->app['view']->addNamespace('squanto', base_path().'/resources/views/vendor/thinktomorrow/chief/vendor/squanto');
186
187
        // Use the chief routing
188
        $this->app['config']['squanto.use_default_routes'] = false;
189
    }
190
191
    private function bootEvents(): void
192
    {
193
        // User events
194
        Event::listen(Login::class, LogSuccessfulLogin::class);
195
        Event::listen(UserInvited::class, SendInvite::class);
196
        Event::listen(InviteAccepted::class, EnableUser::class.'@onAcceptingInvite');
197
198
        // Managed model events
199
        Event::listen(ManagedModelCreated::class, [CreatePageFirstUrls::class, 'onManagedModelCreated']);
200
        Event::listen(ManagedModelCreated::class, [CreateFirstContextForPage::class, 'onManagedModelCreated']);
201
        Event::listen(ManagedModelUrlUpdated::class, [TriggerPageChangedEvent::class, 'onManagedModelUrlUpdated']);
202
        Event::listen(ManagedModelUrlUpdated::class, [ProjectModelData::class, 'onManagedModelUrlUpdated']);
203
        Event::listen(ManagedModelUrlUpdated::class, [PropagateUrlChange::class, 'onManagedModelUrlUpdated']);
204
        Event::listen(ManagedModelUpdated::class, [TriggerPageChangedEvent::class, 'onManagedModelUpdated']);
205
        Event::listen(ManagedModelUpdated::class, [ProjectModelData::class, 'onManagedModelUpdated']);
206
        Event::listen(ManagedModelArchived::class, [PropagateArchivedUrl::class, 'onManagedModelArchived']);
207
        Event::listen(ManagedModelArchived::class, [ProjectModelData::class, 'onManagedModelArchived']);
208
        Event::listen(ManagedModelPublished::class, [ProjectModelData::class, 'onManagedModelPublished']);
209
        Event::listen(ManagedModelUnPublished::class, [ProjectModelData::class, 'onManagedModelUnPublished']);
210
        Event::listen(ManagedModelQueuedForDeletion::class, [DeleteModel::class, 'onManagedModelQueuedForDeletion']);
211
        Event::listen(ManagedModelDeleted::class, [TriggerPageChangedEvent::class, 'onManagedModelDeleted']);
212
        Event::listen(ManagedModelDeleted::class, [ProjectModelData::class, 'onManagedModelDeleted']);
213
214
        // Fragment events
215
        Event::listen(FragmentDetached::class, [TriggerPageChangedEvent::class, 'onFragmentDetached']);
216
        Event::listen(FragmentDetached::class, [DeleteFragment::class, 'onFragmentDetached']);
217
        Event::listen(FragmentDetached::class, [UpdateFragmentMetadata::class, 'onFragmentDetached']);
218
        Event::listen(FragmentAttached::class, [TriggerPageChangedEvent::class, 'onFragmentAdded']);
219
        Event::listen(FragmentAttached::class, [UpdateFragmentMetadata::class, 'onFragmentAdded']);
220
        Event::listen(FragmentUpdated::class, [TriggerPageChangedEvent::class, 'onFragmentUpdated']);
221
        Event::listen(FragmentDuplicated::class, [TriggerPageChangedEvent::class, 'onFragmentDuplicated']);
222
        Event::listen(FragmentDuplicated::class, [UpdateFragmentMetadata::class, 'onFragmentDuplicated']);
223
        Event::listen(FragmentsReordered::class, [TriggerPageChangedEvent::class, 'onFragmentsReordered']);
224
225
        // Form events
226
        Event::listen(FormUpdated::class, [TriggerPageChangedEvent::class, 'onFormUpdated']);
227
        Event::listen(FormUpdated::class, [ProjectModelData::class, 'onFormUpdated']);
228
    }
229
230
    public function register()
231
    {
232
        $this->mergeConfigFrom(__DIR__.'/../../config/chief.php', 'chief');
233
        $this->mergeConfigFrom(__DIR__.'/../../config/chief-settings.php', 'chief-settings');
234
235
        if ($this->app->runningInConsole()) {
236
            (new ConsoleServiceProvider($this->app))->register();
237
        }
238
239
        $this->app->singleton(Registry::class, function () {
240
            return new Registry([]);
241
        });
242
243
        $this->app->singleton(Settings::class, function () {
244
            return new Settings;
245
        });
246
247
        $this->app->bind(NestableRepository::class, MemoizedMysqlNestableRepository::class);
0 ignored issues
show
Bug introduced by
The type Thinktomorrow\Chief\App\...MysqlNestableRepository was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
Bug introduced by
The type Thinktomorrow\Chief\App\...ders\NestableRepository was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
248
249
        (new SitesServiceProvider($this->app))->register();
250
        (new StatesServiceProvider($this->app))->register();
251
        (new SquantoServiceProvider($this->app))->register();
252
        (new UrlsServiceProvider($this->app))->register();
253
        (new FragmentsServiceProvider($this->app))->register();
254
        (new ModelsServiceProvider($this->app))->register();
255
        (new MenuServiceProvider($this->app))->register();
256
257
        if ($this->app->make(AdminEnvironment::class)->check(request())) {
258
            $this->app->when(SettingsController::class)
259
                ->needs(SettingFields::class)
260
                ->give(function () {
261
                    return new SettingFields(new Settings);
262
                });
263
            Relation::morphMap(['chiefuser' => User::class]);
264
265
            // Global chief nav singleton
266
            $this->app->singleton(Nav::class, function () {
267
                return new Nav;
268
            });
269
270
            (new AssetsServiceProvider($this->app))->register();
271
            (new SquantoManagerServiceProvider($this->app))->register();
272
            $this->sitemapServiceProvider->register();
273
        }
274
    }
275
}
276