Completed
Push — master ( 4f1190...3b2a6f )
by Nikolas
03:34
created

WebApplication::restrictAccess()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 3
rs 10
cc 1
eloc 2
nc 1
nop 1
1
<?php
2
namespace rtens\domin\delivery\web;
3
4
use rtens\domin\ActionRegistry;
5
use rtens\domin\delivery\FieldRegistry;
6
use rtens\domin\delivery\RendererRegistry;
7
use rtens\domin\delivery\web\fields\ActionField;
8
use rtens\domin\delivery\web\fields\ColorField;
9
use rtens\domin\delivery\web\fields\DateIntervalField;
10
use rtens\domin\delivery\web\renderers\charting\ChartRenderer;
11
use rtens\domin\delivery\web\renderers\charting\ScatterChartRenderer;
12
use rtens\domin\delivery\web\renderers\ColorRenderer;
13
use rtens\domin\delivery\web\renderers\dashboard\ActionPanelRenderer;
14
use rtens\domin\delivery\web\renderers\dashboard\DashboardItemRenderer;
15
use rtens\domin\delivery\web\renderers\DateIntervalRenderer;
16
use rtens\domin\delivery\web\renderers\ElementRenderer;
17
use rtens\domin\delivery\web\renderers\MapRenderer;
18
use rtens\domin\delivery\web\renderers\tables\DataTableRenderer;
19
use rtens\domin\delivery\web\renderers\tables\TableRenderer;
20
use rtens\domin\execution\access\NoneAccessControl;
21
use rtens\domin\parameters\IdentifiersProvider;
22
use rtens\domin\reflection\types\TypeFactory;
23
use rtens\domin\delivery\web\fields\ImageField;
24
use rtens\domin\delivery\web\fields\NumberField;
25
use rtens\domin\delivery\web\menu\Menu;
26
use rtens\domin\delivery\web\renderers\ListRenderer;
27
use rtens\domin\delivery\web\renderers\BooleanRenderer;
28
use rtens\domin\delivery\web\renderers\DateTimeRenderer;
29
use rtens\domin\delivery\web\renderers\FileRenderer;
30
use rtens\domin\delivery\web\renderers\HtmlRenderer;
31
use rtens\domin\delivery\web\renderers\IdentifierRenderer;
32
use rtens\domin\delivery\web\renderers\ImageRenderer;
33
use rtens\domin\delivery\web\renderers\link\LinkPrinter;
34
use rtens\domin\delivery\web\renderers\link\LinkRegistry;
35
use rtens\domin\delivery\web\renderers\ObjectRenderer;
36
use rtens\domin\delivery\web\renderers\PrimitiveRenderer;
37
use rtens\domin\delivery\web\fields\ArrayField;
38
use rtens\domin\delivery\web\fields\BooleanField;
39
use rtens\domin\delivery\web\fields\DateTimeField;
40
use rtens\domin\delivery\web\fields\EnumerationField;
41
use rtens\domin\delivery\web\fields\FileField;
42
use rtens\domin\delivery\web\fields\HtmlField;
43
use rtens\domin\delivery\web\fields\IdentifierField;
44
use rtens\domin\delivery\web\fields\MultiField;
45
use rtens\domin\delivery\web\fields\NullableField;
46
use rtens\domin\delivery\web\fields\ObjectField;
47
use rtens\domin\delivery\web\fields\StringField;
48
use watoki\curir\delivery\WebRequest;
49
use watoki\curir\protocol\Url;
50
use watoki\factory\Factory;
51
52
class WebApplication {
53
54
    /** @var string */
55
    public $name = 'domin';
56
57
    /** @var Factory */
58
    public $factory;
59
60
    /** @var ActionRegistry */
61
    public $actions;
62
63
    /** @var RendererRegistry */
64
    public $renderers;
65
66
    /** @var LinkRegistry */
67
    public $links;
68
69
    /** @var TypeFactory */
70
    public $types;
71
72
    /** @var FieldRegistry */
73
    public $fields;
74
75
    /** @var IdentifiersProvider */
76
    public $identifiers;
77
78
    /** @var Menu */
79
    public $menu;
80
81
    /** @var MobileDetector */
82
    public $detector;
83
84
    /** @var WebCommentParser */
85
    public $parser;
86
87
    /** @var null|callable */
88
    private $accessFactory;
89
90
    /**
91
     * @param Factory $factory <-
92
     * @param ActionRegistry $actions <-
93
     * @param FieldRegistry $fields <-
94
     * @param RendererRegistry $renderers <-
95
     * @param LinkRegistry $links <-
96
     * @param IdentifiersProvider $identifiers <-
97
     * @param TypeFactory $types <-
98
     * @param MobileDetector $detect <-
99
     * @param WebCommentParser $parser <-
100
     */
101
    public function __construct(Factory $factory, ActionRegistry $actions, FieldRegistry $fields,
102
                                RendererRegistry $renderers, LinkRegistry $links, IdentifiersProvider $identifiers,
103
                                TypeFactory $types, MobileDetector $detect, WebCommentParser $parser) {
104
        $factory->setSingleton($this);
105
106
        $this->factory = $factory;
107
        $this->actions = $actions;
108
        $this->renderers = $renderers;
109
        $this->links = $links;
110
        $this->types = $types;
111
        $this->fields = $fields;
112
        $this->identifiers = $identifiers;
113
        $this->detector = $detect;
114
        $this->parser = $parser;
115
        $this->menu = new Menu($actions);
0 ignored issues
show
Unused Code introduced by
The call to Menu::__construct() has too many arguments starting with $actions.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
116
117
        $this->accessFactory = WebAccessControl::factory(new NoneAccessControl());
118
    }
119
120
    /**
121
     * @param callable $callback Receives the WebApplication instance
122
     * @param null|Factory $factory
123
     * @return Factory
124
     */
125
    public static function init(callable $callback, Factory $factory = null) {
126
        $factory = $factory ?: new Factory();
127
        $callback($factory->setSingleton($factory->getInstance(self::class)));
128
        return $factory;
129
    }
130
131
    /**
132
     * @param callable $accessControlFactory Received the current WebRequest
133
     */
134
    public function restrictAccess(callable $accessControlFactory) {
135
        $this->accessFactory = $accessControlFactory;
136
    }
137
138
    /**
139
     * @param string $name
140
     */
141
    public function setNameAndBrand($name) {
142
        $this->name = $name;
143
        $this->menu->setBrand($name);
144
    }
145
146
    public function prepare(WebRequest $request) {
147
        $this->registerRenderers($request->getContext());
148
        $this->registerFields();
149
        $this->actions->restrictAccess($this->getAccessControl($request));
150
    }
151
152
    /**
153
     * @param WebRequest $request
154
     * @return WebAccessControl
155
     */
156
    public function getAccessControl(WebRequest $request) {
157
        return call_user_func($this->accessFactory, $request);
158
    }
159
160
    private function registerRenderers(Url $baseUrl) {
161
        $links = new LinkPrinter($baseUrl, $this->links, $this->actions, $this->parser);
162
163
        $this->renderers->add(new ElementRenderer());
164
        $this->renderers->add(new BooleanRenderer());
165
        $this->renderers->add(new ColorRenderer());
166
        $this->renderers->add(new PrimitiveRenderer());
167
        $this->renderers->add(new DateTimeRenderer());
168
        $this->renderers->add(new DateIntervalRenderer());
169
        $this->renderers->add(new HtmlRenderer());
170
        $this->renderers->add(new IdentifierRenderer($links));
171
        $this->renderers->add(new FileRenderer());
172
        $this->renderers->add(new ImageRenderer());
173
        $this->renderers->add(new ScatterChartRenderer());
174
        $this->renderers->add(new ChartRenderer());
175
        $this->renderers->add(new DashboardItemRenderer($this->renderers));
176
        $this->renderers->add(new ActionPanelRenderer($this->renderers, $this->actions, $this->fields, $baseUrl));
177
        $this->renderers->add(new DataTableRenderer($this->renderers));
178
        $this->renderers->add(new TableRenderer($this->renderers, $links));
179
        $this->renderers->add(new ListRenderer($this->renderers, $links));
180
        $this->renderers->add(new MapRenderer($this->renderers, $links));
181
        $this->renderers->add(new ObjectRenderer($this->renderers, $this->types, $links));
182
    }
183
184
    private function registerFields() {
185
        $this->fields->add(new StringField());
186
        $this->fields->add(new NumberField());
187
        $this->fields->add(new BooleanField());
188
        $this->fields->add(new ColorField());
189
        $this->fields->add(new FileField());
190
        $this->fields->add(new ImageField());
191
        $this->fields->add(new HtmlField());
192
        $this->fields->add(new DateTimeField());
193
        $this->fields->add(new DateIntervalField());
194
        $this->fields->add(new ArrayField($this->fields, $this->detector));
195
        $this->fields->add(new NullableField($this->fields));
196
        $this->fields->add(new ActionField($this->fields, $this->actions));
197
        $this->fields->add(new ObjectField($this->types, $this->fields));
198
        $this->fields->add(new MultiField($this->fields));
199
        $this->fields->add(new IdentifierField($this->fields, $this->identifiers));
200
        $this->fields->add(new EnumerationField($this->fields));
201
    }
202
}