Passed
Pull Request — 1.x (#99)
by Akihito
10:41
created

ResourceDonut   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 70
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 30
c 1
b 0
f 0
dl 0
loc 70
rs 10
wmc 7

4 Methods

Rating   Name   Duplication   Size   Complexity  
A refresh() 0 18 2
A render() 0 6 1
A __construct() 0 5 1
A create() 0 14 3
1
<?php
2
3
declare(strict_types=1);
4
5
namespace BEAR\QueryRepository;
6
7
use BEAR\Resource\AbstractRequest;
8
use BEAR\Resource\ResourceInterface;
9
use BEAR\Resource\ResourceObject;
10
11
use function array_key_exists;
12
use function assert;
13
use function is_iterable;
14
use function preg_replace_callback;
15
16
/**
17
 * Donut cache resource state
18
 */
19
final class ResourceDonut
20
{
21
    public const FOMRAT = '[le:%s]';
22
23
    /** @var string */
24
    private $template;
25
26
    /**
27
     * @var ?int
28
     * @readonly
29
     */
30
    public $ttl;
31
32
    /**
33
     * @var bool
34
     * @readonly
35
     */
36
    public $isCacheble;
37
38
    private const URI_REGEX = '/\[le:(.+)\]/';
39
40
    public function __construct(string $template, ?int $ttl, bool $isCacheble)
41
    {
42
        $this->template = $template;
43
        $this->ttl = $ttl;
44
        $this->isCacheble = $isCacheble;
45
    }
46
47
    public function refresh(ResourceInterface $resource, ResourceObject $ro): ResourceObject
48
    {
49
        $etags = new SurrogateKeys($ro->uri);
50
        $refreshView =  preg_replace_callback(self::URI_REGEX, static function (array $matches) use ($resource, $etags): string {
51
            $uri = (string) $matches[1];
52
            $ro = $resource->get($uri);
53
            $ro->toString();
54
            if (array_key_exists(Header::ETAG, $ro->headers)) {
55
                $etags->addTag($ro);
56
            }
57
58
            return (string) $ro->view;
59
        }, $this->template);
60
61
        $etags->setSurrogateHeader($ro);
62
        $ro->view = $refreshView;
63
64
        return $ro;
65
    }
66
67
    public function render(ResourceObject $ro, DonutRenderer $storage): ResourceObject
68
    {
69
        $view = $storage->render($this->template);
70
        $ro->view = $view;
71
72
        return $ro;
73
    }
74
75
    public static function create(ResourceObject $ro, DonutRenderer $storage, SurrogateKeys $etags, ?int $ttl, bool $isCacheble): self
76
    {
77
        assert(is_iterable($ro->body));
78
        /** @var mixed $maybeRequest */
79
        foreach ($ro->body as &$maybeRequest) {
80
            if ($maybeRequest instanceof AbstractRequest) {
81
                $maybeRequest = new DonutRequest($maybeRequest, $storage, $etags);
82
            }
83
        }
84
85
        unset($maybeRequest);
86
        $donutTemplate = (string) $ro;
87
88
        return new self($donutTemplate, $ttl, $isCacheble);
89
    }
90
}
91