xref: /plugin/combo/ComboStrap/FetcherCache.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau
3*04fd306cSNickeau
4*04fd306cSNickeaunamespace ComboStrap;
5*04fd306cSNickeau
6*04fd306cSNickeauuse dokuwiki\Cache\Cache;
7*04fd306cSNickeau
8*04fd306cSNickeau/**
9*04fd306cSNickeau * Class Cache
10*04fd306cSNickeau * A wrapper around {@link \dokuwiki\Cache\Cache}
11*04fd306cSNickeau * @package ComboStrap
12*04fd306cSNickeau * that takes into account the arguments / properties of the media
13*04fd306cSNickeau * to create the cache file
14*04fd306cSNickeau */
15*04fd306cSNickeauclass FetcherCache
16*04fd306cSNickeau{
17*04fd306cSNickeau
18*04fd306cSNickeau    const CANONICAL = "fetcher:cache";
19*04fd306cSNickeau
20*04fd306cSNickeau
21*04fd306cSNickeau    /**
22*04fd306cSNickeau     * @var Cache
23*04fd306cSNickeau     */
24*04fd306cSNickeau    private Cache $fileCache;
25*04fd306cSNickeau
26*04fd306cSNickeau
27*04fd306cSNickeau    private array $fileDependencies = [];
28*04fd306cSNickeau    private IFetcher $fetcher;
29*04fd306cSNickeau
30*04fd306cSNickeau
31*04fd306cSNickeau    /**
32*04fd306cSNickeau     * @param IFetcher $fetcher
33*04fd306cSNickeau     * @param String[] $keys - extra cache keys that are not in the url because they are retrieved from a database
34*04fd306cSNickeau     * This is the case of the {@link FetcherPage::getRequestedTemplate()} as it can be changed in the database
35*04fd306cSNickeau     * but we don't want to see it in the URL.
36*04fd306cSNickeau     */
37*04fd306cSNickeau    public function __construct(IFetcher $fetcher, array $keys = [])
38*04fd306cSNickeau    {
39*04fd306cSNickeau
40*04fd306cSNickeau        $this->fetcher = $fetcher;
41*04fd306cSNickeau        /**
42*04fd306cSNickeau         * Cache Key Construction
43*04fd306cSNickeau         */
44*04fd306cSNickeau        $cacheKey = $fetcher->getFetchUrl()->toAbsoluteUrlString();
45*04fd306cSNickeau        foreach ($keys as $key) {
46*04fd306cSNickeau            $cacheKey .= $key;
47*04fd306cSNickeau        }
48*04fd306cSNickeau        $this->fileCache = new Cache($cacheKey, ".{$fetcher->getMime()->getExtension()}");
49*04fd306cSNickeau
50*04fd306cSNickeau    }
51*04fd306cSNickeau
52*04fd306cSNickeau    /**
53*04fd306cSNickeau     * @param IFetcher $fetch
54*04fd306cSNickeau     * @param String[] $cacheKeys - extra cache keys that are not in the url because they are retrieved from a database
55*04fd306cSNickeau     * @return FetcherCache
56*04fd306cSNickeau     */
57*04fd306cSNickeau    public static function createFrom(IFetcher $fetch, array $cacheKeys = []): FetcherCache
58*04fd306cSNickeau    {
59*04fd306cSNickeau        return new FetcherCache($fetch, $cacheKeys);
60*04fd306cSNickeau    }
61*04fd306cSNickeau
62*04fd306cSNickeau
63*04fd306cSNickeau    /**
64*04fd306cSNickeau     * Cache file depends on code version and configuration
65*04fd306cSNickeau     * @return bool
66*04fd306cSNickeau     */
67*04fd306cSNickeau    public function isCacheUsable(): bool
68*04fd306cSNickeau    {
69*04fd306cSNickeau
70*04fd306cSNickeau        $this->addFileDependency(DirectoryLayout::getPluginInfoPath());
71*04fd306cSNickeau        $files = $this->fileDependencies;
72*04fd306cSNickeau        $dependencies = array('files' => $files);
73*04fd306cSNickeau
74*04fd306cSNickeau        /**
75*04fd306cSNickeau         * Cache Attribute
76*04fd306cSNickeau         */
77*04fd306cSNickeau        try {
78*04fd306cSNickeau            $requestedCache = $this->fetcher->getRequestedCache();
79*04fd306cSNickeau            $maxAge = $this->fetcher->getCacheMaxAgeInSec($requestedCache);
80*04fd306cSNickeau            $dependencies['age'] = $maxAge;
81*04fd306cSNickeau        } catch (ExceptionNotFound $e) {
82*04fd306cSNickeau            // no requested cache
83*04fd306cSNickeau        }
84*04fd306cSNickeau        return $this->fileCache->useCache($dependencies);
85*04fd306cSNickeau
86*04fd306cSNickeau    }
87*04fd306cSNickeau
88*04fd306cSNickeau
89*04fd306cSNickeau    public function storeCache($content)
90*04fd306cSNickeau    {
91*04fd306cSNickeau        $this->fileCache->storeCache($content);
92*04fd306cSNickeau    }
93*04fd306cSNickeau
94*04fd306cSNickeau    public function getFile(): LocalPath
95*04fd306cSNickeau    {
96*04fd306cSNickeau        return LocalPath::createFromPathString($this->fileCache->cache);
97*04fd306cSNickeau    }
98*04fd306cSNickeau
99*04fd306cSNickeau    public function addFileDependency(Path $path): FetcherCache
100*04fd306cSNickeau    {
101*04fd306cSNickeau        try {
102*04fd306cSNickeau            $this->fileDependencies[] = LocalPath::createFromPathObject($path)->toAbsolutePath()->toAbsoluteId();
103*04fd306cSNickeau        } catch (ExceptionCast|ExceptionBadArgument $e) {
104*04fd306cSNickeau            LogUtility::internalError("The path seems to be not local, it should never happen.", self::CANONICAL, $e);
105*04fd306cSNickeau        }
106*04fd306cSNickeau        return $this;
107*04fd306cSNickeau    }
108*04fd306cSNickeau
109*04fd306cSNickeau
110*04fd306cSNickeau}
111