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

BreadCrumbs::updateCrumbs()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 23
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 23
rs 9.0857
cc 3
eloc 16
nc 3
nop 2
1
<?php
2
namespace rtens\domin\delivery\web;
3
4
use rtens\domin\Action;
5
use rtens\domin\delivery\ParameterReader;
6
use watoki\collections\Map;
7
use watoki\curir\cookie\Cookie;
8
use watoki\curir\cookie\CookieStore;
9
use watoki\curir\delivery\WebRequest;
10
11
class BreadCrumbs {
12
13
    const COOKIE_KEY = 'domin_trail';
14
15
    /** @var WebRequest */
16
    private $request;
17
18
    /** @var CookieStore */
19
    private $cookies;
20
21
    /**
22
     * @param CookieStore $cookies
23
     * @param WebRequest $request
24
     */
25
    public function __construct(CookieStore $cookies, WebRequest $request) {
26
        $this->request = $request;
27
        $this->cookies = $cookies;
28
    }
29
30
    public function readCrumbs() {
31
        if ($this->cookies->hasKey(self::COOKIE_KEY)) {
32
            return $this->cookies->read(self::COOKIE_KEY)->payload;
33
        }
34
        return [];
35
    }
36
37
    public function getLastCrumb() {
38
        $crumbs = $this->readCrumbs();
39
        if (!$crumbs) {
40
            return null;
41
        }
42
        return end($crumbs)['target'];
43
    }
44
45
    public function updateCrumbs(Action $action, $actionId) {
46
        $reader = new RequestParameterReader($this->request);
47
48
        $crumbs = $this->readCrumbs();
49
50
        $current = [
51
            'target' => (string)$this->request->getContext()
52
                ->appended($actionId)
53
                ->withParameters(new Map($this->readRawParameters($action, $reader))),
54
            'caption' => $action->caption()
55
        ];
56
        $newCrumbs = [];
57
        foreach ($crumbs as $crumb) {
58
            if ($crumb == $current) {
59
                break;
60
            }
61
            $newCrumbs[] = $crumb;
62
        }
63
        $newCrumbs[] = $current;
64
65
        $this->saveCrumbs($newCrumbs);
66
        return $newCrumbs;
67
    }
68
69
    public function reset() {
70
        $this->cookies->create(new Cookie([]), self::COOKIE_KEY);
71
    }
72
73
    private function readRawParameters(Action $action, ParameterReader $reader) {
74
        $values = [];
75
76
        foreach ($action->parameters() as $parameter) {
77
            if ($reader->has($parameter)) {
78
                $values[$parameter->getName()] = $reader->read($parameter);
79
            }
80
        }
81
        return $values;
82
    }
83
84
    private function saveCrumbs($crumbs) {
85
        $this->cookies->create(new Cookie($crumbs), self::COOKIE_KEY);
86
    }
87
}