Completed
Push — master ( be02a5...a1ec95 )
by Nick
22:04 queued 02:39
created

EloquentJsServiceProvider::boot()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 8
rs 9.4285
cc 1
eloc 4
nc 1
nop 2
1
<?php
2
3
namespace EloquentJs;
4
5
use EloquentJs\Controllerless\GenericController;
6
use EloquentJs\Controllerless\RouteRegistrar;
7
use EloquentJs\Model\AcceptsEloquentJsQueries;
8
use EloquentJs\Query\Events\EloquentJsWasCalled;
9
use EloquentJs\Query\Guard\Policy\Builder;
10
use EloquentJs\Query\Guard\Policy\Factory;
11
use EloquentJs\Query\Interpreter;
12
use EloquentJs\Query\Listeners\ApplyQueryToBuilder;
13
use EloquentJs\Query\Listeners\CheckQueryIsAuthorized;
14
use EloquentJs\Query\Query;
15
use EloquentJs\ScriptGenerator\Console\Command;
16
use Illuminate\Contracts\Events\Dispatcher;
17
use Illuminate\Routing\Router;
18
use Illuminate\Support\ServiceProvider;
19
20
class EloquentJsServiceProvider extends ServiceProvider
21
{
22
    /**
23
     * Register the service provider.
24
     *
25
     * @return void
26
     */
27
    public function register()
28
    {
29
        $this->app->singleton('eloquentjs.query', function ($app) {
30
            return $app[Interpreter::class]->parse($app['request']);
31
        });
32
33
        $this->app->when(CheckQueryIsAuthorized::class)
34
            ->needs(Query::class)
35
            ->give('eloquentjs.query');
36
37
        $this->app->when(ApplyQueryToBuilder::class)
38
            ->needs(Query::class)
39
            ->give('eloquentjs.query');
40
41
        $this->commands([Command::class]);
42
    }
43
44
    /**
45
     * Boot the service provider.
46
     *
47
     * @param Dispatcher $events
48
     * @param Router $router
49
     * @return void
50
     */
51
    public function boot(Dispatcher $events, Router $router)
52
    {
53
        $this->addListenersToApplyQuery($events);
54
55
        $this->enableGenericResourceRouting($router);
56
57
        $this->setDefaultPolicy();
58
    }
59
60
    /**
61
     * Add listener for EloquentJs usage.
62
     *
63
     * @param Dispatcher $events
64
     * @return void
65
     */
66
    protected function addListenersToApplyQuery(Dispatcher $events)
67
    {
68
        $events->listen(EloquentJsWasCalled::class, CheckQueryIsAuthorized::class, 10);
69
        $events->listen(EloquentJsWasCalled::class, ApplyQueryToBuilder::class);
70
    }
71
72
    /**
73
     * Set up the generic resource routes + controller.
74
     *
75
     * @param Router $router
76
     * @return void
77
     */
78
    protected function enableGenericResourceRouting(Router $router)
79
    {
80
        $app = $this->app;
81
82
        $app->bind('eloquentjs.router', RouteRegistrar::class);
83
84
        $app->when(RouteRegistrar::class)
85
            ->needs('$controller')
86
            ->give(GenericController::class);
87
88
        $app->when(GenericController::class)
89
            ->needs(AcceptsEloquentJsQueries::class)
90
            ->give(function ($app) {
91
                if ($resource = $app['eloquentjs.router']->getCurrentResource()) {
92
                    return $app->make($resource);
93
                }
94
            });
95
96
        $router->macro('eloquent', function ($uri, $resource, $options = []) use ($app) {
97
            $app['eloquentjs.router']->addRoute($uri, $resource, $options);
98
        });
99
    }
100
101
    /**
102
     * Set default policy for guarding EloquentJs queries.
103
     *
104
     * @return void
105
     */
106
    protected function setDefaultPolicy()
107
    {
108
        $this->app->bind(Factory::class, function () {
109
            return new Factory(
110
                function (Builder $guard) {
111
                    $guard->allow('select');
112
                    $guard->allow('distinct');
113
                    $guard->allow('where');
114
                    $guard->allow('groupBy');
115
                    $guard->allow('having');
116
                    $guard->allow('orderBy');
117
                    $guard->allow('offset');
118
                    $guard->allow('limit');
119
                    $guard->allow('scope');
120
                    $guard->allow('with');
121
                }
122
            );
123
        });
124
    }
125
}
126