addListenersToApplyQuery()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 5
rs 9.4285
cc 1
eloc 3
nc 1
nop 1
1
<?php
2
3
namespace EloquentJs;
4
5
use EloquentJs\Controllerless\GenericController;
6
use EloquentJs\Controllerless\RouteRegistrar;
7
use EloquentJs\Query\Events\EloquentJsWasCalled;
8
use EloquentJs\Query\Guard\Policy\Builder;
9
use EloquentJs\Query\Guard\Policy\Factory;
10
use EloquentJs\Query\Interpreter;
11
use EloquentJs\Query\Listeners\ApplyQueryToBuilder;
12
use EloquentJs\Query\Listeners\CheckQueryIsAuthorized;
13
use EloquentJs\Query\Query;
14
use EloquentJs\ScriptGenerator\Console\Command;
15
use Illuminate\Contracts\Events\Dispatcher;
16
use Illuminate\Database\Eloquent\Model;
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
        $this->publishes([
60
            __DIR__.'/config.php' => config_path('eloquentjs.php'),
61
        ]);
62
    }
63
64
    /**
65
     * Add listener for EloquentJs usage.
66
     *
67
     * @param Dispatcher $events
68
     * @return void
69
     */
70
    protected function addListenersToApplyQuery(Dispatcher $events)
71
    {
72
        $events->listen(EloquentJsWasCalled::class, CheckQueryIsAuthorized::class, 10);
73
        $events->listen(EloquentJsWasCalled::class, ApplyQueryToBuilder::class);
74
    }
75
76
    /**
77
     * Set up the generic resource routes + controller.
78
     *
79
     * @param Router $router
80
     * @return void
81
     */
82
    protected function enableGenericResourceRouting(Router $router)
83
    {
84
        $app = $this->app;
85
86
        $app->bind('eloquentjs.router', RouteRegistrar::class);
87
88
        $app->when(RouteRegistrar::class)
89
            ->needs('$controller')
90
            ->give(GenericController::class);
91
92
        $app->when(GenericController::class)
93
            ->needs(Model::class)
94
            ->give(function($app) {
95
                if ($resource = $app['eloquentjs.router']->getCurrentResource()) {
96
                    return $app->make($resource);
97
                }
98
            });
99
100
        $router->macro('eloquent', function($uri, $resource, $options = []) use ($app) {
101
            $app['eloquentjs.router']->addRoute($uri, $resource, $options);
102
        });
103
    }
104
105
    /**
106
     * Set default policy for guarding EloquentJs queries.
107
     *
108
     * @return void
109
     */
110
    protected function setDefaultPolicy()
111
    {
112
        $this->app->bind(Factory::class, function() {
113
            return new Factory(
114
                function(Builder $guard) {
115
                    $guard->allow('select');
116
                    $guard->allow('distinct');
117
                    $guard->allow('where');
118
                    $guard->allow('groupBy');
119
                    $guard->allow('having');
120
                    $guard->allow('orderBy');
121
                    $guard->allow('offset');
122
                    $guard->allow('limit');
123
                    $guard->allow('scope');
124
                    $guard->allow('with');
125
                }
126
            );
127
        });
128
    }
129
}
130