Completed
Push — master ( e327bd...2b2b50 )
by Nikolas
03:41
created

ActionResult   B

Complexity

Total Complexity 12

Size/Duplication

Total Lines 75
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 16

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 75
wmc 12
lcom 1
cbo 16
rs 8.4615

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 9 1
D assembleResult() 0 41 9
A getModel() 0 3 1
A getHeadElements() 0 3 1
1
<?php
2
namespace rtens\domin\delivery\web;
3
4
use rtens\domin\Action;
5
use rtens\domin\execution\ExecutionResult;
6
use rtens\domin\execution\FailedResult;
7
use rtens\domin\execution\MissingParametersResult;
8
use rtens\domin\execution\NoResult;
9
use rtens\domin\execution\NotPermittedResult;
10
use rtens\domin\execution\RedirectResult;
11
use rtens\domin\execution\ValueResult;
12
use rtens\domin\Executor;
13
use watoki\collections\Map;
14
use watoki\curir\delivery\WebRequest;
15
16
class ActionResult {
17
18
    /** @var array */
19
    private $model;
20
21
    /** @var Element[] */
22
    private $headElements = [];
23
24
    /**
25
     * @param WebRequest $request
26
     * @param WebApplication $app
27
     * @param Action $action
28
     * @param string $actionId
29
     * @param BreadCrumbs $crumbs
30
     */
31
    public function __construct(WebRequest $request, WebApplication $app, Action $action, $actionId, BreadCrumbs $crumbs) {
32
        $reader = new RequestParameterReader($request);
33
34
        $executor = new Executor($app->actions, $app->fields, $reader);
35
        $executor->restrictAccess($app->getAccessControl($request));
36
        $result = $executor->execute($actionId);
37
38
        $this->model = $this->assembleResult($result, $app, $request, $crumbs, $action, $actionId);
39
    }
40
41
    private function assembleResult(ExecutionResult $result, WebApplication $app, WebRequest $request,
42
                                    BreadCrumbs $crumbs, Action $action, $actionId) {
43
        $model = [
44
            'error' => null,
45
            'missing' => null,
46
            'success' => null,
47
            'redirect' => null,
48
            'output' => null
49
        ];
50
51
        if ($result instanceof FailedResult) {
52
            $model['error'] = htmlentities($result->getMessage());
53
        } else if ($result instanceof NoResult) {
54
            $model['success'] = true;
55
            $model['redirect'] = $crumbs->getLastCrumb();
56
        } else if ($result instanceof ValueResult) {
57
            $value = $result->getValue();
58
            $renderer = $app->renderers->getRenderer($value);
59
60
            if ($renderer instanceof WebRenderer) {
61
                $this->headElements = $renderer->headElements($value);
62
            }
63
            $model['output'] = $renderer->render($value);
64
65
            if (!$action->isModifying()) {
66
                $crumbs->updateCrumbs($action, $actionId);
67
            }
68
        } else if ($result instanceof MissingParametersResult) {
69
            $model['missing'] = $result->getParameters();
70
        } else if ($result instanceof RedirectResult) {
71
            $model['success'] = true;
72
            $model['redirect'] = $request->getContext()
73
                ->appended($result->getActionId())
74
                ->withParameters(new Map($result->getParameters()));
75
        } else if ($result instanceof NotPermittedResult) {
76
            $model['error'] = 'You are not permitted to execute this action.';
77
            $model['redirect'] = $app->getAccessControl($request)->acquirePermission();
78
        }
79
80
        return $model;
81
    }
82
83
    public function getModel() {
84
        return $this->model;
85
    }
86
87
    public function getHeadElements() {
88
        return $this->headElements;
89
    }
90
}