xref: /plugin/structpublish/meta/Revision.php (revision 5c2215e890cc9516db9bc28cfa976283c0e72b1e)
1c2f8a3c4SAnna Dabrowska<?php
2c2f8a3c4SAnna Dabrowska
3c2f8a3c4SAnna Dabrowskanamespace dokuwiki\plugin\structpublish\meta;
4c2f8a3c4SAnna Dabrowska
5e394901aSAnna Dabrowskause dokuwiki\plugin\struct\meta\ConfigParser;
6e394901aSAnna Dabrowskause dokuwiki\plugin\struct\meta\Schema;
7e394901aSAnna Dabrowskause dokuwiki\plugin\struct\meta\SearchConfig;
8e394901aSAnna Dabrowskause dokuwiki\plugin\struct\meta\Value;
9e394901aSAnna Dabrowska
10c2f8a3c4SAnna Dabrowskaclass Revision
11c2f8a3c4SAnna Dabrowska{
12e394901aSAnna Dabrowska    /** @var \helper_plugin_sqlite */
13c2f8a3c4SAnna Dabrowska    protected $sqlite;
14e7259784SAnna Dabrowska
15e7259784SAnna Dabrowska    protected $schema;
16e7259784SAnna Dabrowska
17c2f8a3c4SAnna Dabrowska    protected $id;
18c2f8a3c4SAnna Dabrowska    protected $rev;
196a791fefSAnna Dabrowska    protected $published;
20c2f8a3c4SAnna Dabrowska    protected $status;
21e394901aSAnna Dabrowska    protected $version;
22c2f8a3c4SAnna Dabrowska    protected $user;
23e6dd5f77SAnna Dabrowska    protected $datetime;
24e7259784SAnna Dabrowska    /**
25e7259784SAnna Dabrowska     * @var bool|\dokuwiki\plugin\struct\meta\Column
26e7259784SAnna Dabrowska     */
27e7259784SAnna Dabrowska    protected $statusCol;
28e7259784SAnna Dabrowska    protected $versionCol;
29e7259784SAnna Dabrowska    protected $userCol;
30e6dd5f77SAnna Dabrowska    protected $datetimeCol;
31e7259784SAnna Dabrowska    protected $revisionCol;
32c2f8a3c4SAnna Dabrowska
33c2f8a3c4SAnna Dabrowska    /**
34c2f8a3c4SAnna Dabrowska     * @param $sqlite
353449f9ceSAnna Dabrowska     * @param string $id
363449f9ceSAnna Dabrowska     * @param int $rev
37c2f8a3c4SAnna Dabrowska     */
383449f9ceSAnna Dabrowska    public function __construct($sqlite, $id, $rev)
39c2f8a3c4SAnna Dabrowska    {
40c2f8a3c4SAnna Dabrowska        $this->sqlite = $sqlite;
41c2f8a3c4SAnna Dabrowska        $this->id = $id;
42c2f8a3c4SAnna Dabrowska        $this->rev = $rev;
436a791fefSAnna Dabrowska        $this->published = 0;
44e6dd5f77SAnna Dabrowska        $this->status = Constants::STATUS_DRAFT;
45c2f8a3c4SAnna Dabrowska
46e7259784SAnna Dabrowska        $this->schema = new Schema('structpublish');
47e7259784SAnna Dabrowska        $this->statusCol = $this->schema->findColumn('status');
48e7259784SAnna Dabrowska        $this->versionCol = $this->schema->findColumn('version');
49e7259784SAnna Dabrowska        $this->userCol = $this->schema->findColumn('user');
50e6dd5f77SAnna Dabrowska        $this->datetimeCol = $this->schema->findColumn('datetime');
51e7259784SAnna Dabrowska        $this->revisionCol = $this->schema->findColumn('revision');
523449f9ceSAnna Dabrowska
53e394901aSAnna Dabrowska        /** @var Value[] $values */
5451066f27SAnna Dabrowska        $values = $this->getCoreData('revision=' . $this->rev);
55e394901aSAnna Dabrowska
56e394901aSAnna Dabrowska        if (!empty($values)) {
57e7259784SAnna Dabrowska            $this->status = $values[$this->statusCol->getColref() - 1]->getRawValue();
58e7259784SAnna Dabrowska            $this->version = $values[$this->versionCol->getColref() - 1]->getRawValue();
59e7259784SAnna Dabrowska            $this->user = $values[$this->userCol->getColref() - 1]->getRawValue();
60e6dd5f77SAnna Dabrowska            $this->datetime = $values[$this->datetimeCol->getColref() - 1]->getRawValue();
613449f9ceSAnna Dabrowska        }
62c2f8a3c4SAnna Dabrowska    }
63c2f8a3c4SAnna Dabrowska
64c2f8a3c4SAnna Dabrowska    public function save()
65c2f8a3c4SAnna Dabrowska    {
66e31c94d7SAndreas Gohr        if ($this->status === Constants::STATUS_PUBLISHED) {
676a791fefSAnna Dabrowska            $this->published = 1;
686a791fefSAnna Dabrowska        }
693449f9ceSAnna Dabrowska
70e394901aSAnna Dabrowska        $this->updateCoreData($this->id);
716a791fefSAnna Dabrowska        // TODO reset publish status of older revisions
726a791fefSAnna Dabrowska
73c2f8a3c4SAnna Dabrowska    }
74c2f8a3c4SAnna Dabrowska
75c2f8a3c4SAnna Dabrowska    /**
763449f9ceSAnna Dabrowska     * @return int
77c2f8a3c4SAnna Dabrowska     */
78c2f8a3c4SAnna Dabrowska    public function getVersion()
79c2f8a3c4SAnna Dabrowska    {
803231ebaeSAnna Dabrowska        return (int)$this->version;
81c2f8a3c4SAnna Dabrowska    }
82c2f8a3c4SAnna Dabrowska
83c2f8a3c4SAnna Dabrowska    /**
843449f9ceSAnna Dabrowska     * @param int $version
85c2f8a3c4SAnna Dabrowska     */
86c2f8a3c4SAnna Dabrowska    public function setVersion($version): void
87c2f8a3c4SAnna Dabrowska    {
88c2f8a3c4SAnna Dabrowska        $this->version = $version;
89c2f8a3c4SAnna Dabrowska    }
90c2f8a3c4SAnna Dabrowska
91c2f8a3c4SAnna Dabrowska    /**
923449f9ceSAnna Dabrowska     * @return int
93c2f8a3c4SAnna Dabrowska     */
94c2f8a3c4SAnna Dabrowska    public function getRev()
95c2f8a3c4SAnna Dabrowska    {
96c2f8a3c4SAnna Dabrowska        return $this->rev;
97c2f8a3c4SAnna Dabrowska    }
98c2f8a3c4SAnna Dabrowska
99c2f8a3c4SAnna Dabrowska    /**
1003449f9ceSAnna Dabrowska     * @param int $rev
101c2f8a3c4SAnna Dabrowska     */
102c2f8a3c4SAnna Dabrowska    public function setRev($rev): void
103c2f8a3c4SAnna Dabrowska    {
104c2f8a3c4SAnna Dabrowska        $this->rev = $rev;
105c2f8a3c4SAnna Dabrowska    }
106c2f8a3c4SAnna Dabrowska
107c2f8a3c4SAnna Dabrowska    /**
1083449f9ceSAnna Dabrowska     * @return string
109c2f8a3c4SAnna Dabrowska     */
110c2f8a3c4SAnna Dabrowska    public function getStatus()
111c2f8a3c4SAnna Dabrowska    {
112e394901aSAnna Dabrowska        return $this->status;
113c2f8a3c4SAnna Dabrowska    }
114c2f8a3c4SAnna Dabrowska
115c2f8a3c4SAnna Dabrowska    /**
1163449f9ceSAnna Dabrowska     * @param string $status
117c2f8a3c4SAnna Dabrowska     */
118c2f8a3c4SAnna Dabrowska    public function setStatus($status): void
119c2f8a3c4SAnna Dabrowska    {
120c2f8a3c4SAnna Dabrowska        $this->status = $status;
121c2f8a3c4SAnna Dabrowska    }
122c2f8a3c4SAnna Dabrowska
123c2f8a3c4SAnna Dabrowska    /**
1243449f9ceSAnna Dabrowska     * @return string
125c2f8a3c4SAnna Dabrowska     */
126c2f8a3c4SAnna Dabrowska    public function getUser()
127c2f8a3c4SAnna Dabrowska    {
128c2f8a3c4SAnna Dabrowska        return $this->user;
129c2f8a3c4SAnna Dabrowska    }
130c2f8a3c4SAnna Dabrowska
131c2f8a3c4SAnna Dabrowska    /**
1323449f9ceSAnna Dabrowska     * @param string $user
133c2f8a3c4SAnna Dabrowska     */
134c2f8a3c4SAnna Dabrowska    public function setUser($user): void
135c2f8a3c4SAnna Dabrowska    {
136c2f8a3c4SAnna Dabrowska        $this->user = $user;
137c2f8a3c4SAnna Dabrowska    }
1383449f9ceSAnna Dabrowska
139e6dd5f77SAnna Dabrowska    public function getDatetime()
140e394901aSAnna Dabrowska    {
141e6dd5f77SAnna Dabrowska        return $this->datetime;
142e394901aSAnna Dabrowska    }
143e394901aSAnna Dabrowska
144*5c2215e8SAndreas Gohr    public function getTimestamp()
145*5c2215e8SAndreas Gohr    {
146*5c2215e8SAndreas Gohr        return strtotime($this->datetime);
147*5c2215e8SAndreas Gohr    }
148*5c2215e8SAndreas Gohr
149e6dd5f77SAnna Dabrowska    public function setDatetime($time)
150e394901aSAnna Dabrowska    {
151*5c2215e8SAndreas Gohr        $this->datetime = $time;
152*5c2215e8SAndreas Gohr    }
153*5c2215e8SAndreas Gohr
154*5c2215e8SAndreas Gohr    public function getId()
155*5c2215e8SAndreas Gohr    {
156*5c2215e8SAndreas Gohr        return $this->id;
157e394901aSAnna Dabrowska    }
158e394901aSAnna Dabrowska
1593449f9ceSAnna Dabrowska    /**
1603449f9ceSAnna Dabrowska     * Update publish status in the core table
1613449f9ceSAnna Dabrowska     */
162e394901aSAnna Dabrowska    protected function updateCoreData($pid, $rid = 0)
1633449f9ceSAnna Dabrowska    {
164e394901aSAnna Dabrowska        $data = [
165e394901aSAnna Dabrowska            'status' => $this->status,
166e394901aSAnna Dabrowska            'user' => $this->user,
167*5c2215e8SAndreas Gohr            'datetime' => $this->datetime,
168e394901aSAnna Dabrowska            'revision' => $this->rev,
169e394901aSAnna Dabrowska            'version' => $this->version,
170e394901aSAnna Dabrowska        ];
1713231ebaeSAnna Dabrowska        $schema = new Schema('structpublish', 0);
1723231ebaeSAnna Dabrowska        $access = new AccessTableStructpublish($schema, $pid, 0, $rid);
1736a791fefSAnna Dabrowska        $access->setPublished($this->published);
174e394901aSAnna Dabrowska        $access->saveData($data);
175e394901aSAnna Dabrowska    }
176e394901aSAnna Dabrowska
177e7259784SAnna Dabrowska    public function getCoreData($andFilter = '')
178e394901aSAnna Dabrowska    {
179e394901aSAnna Dabrowska        $lines = [
180e394901aSAnna Dabrowska            'schema: structpublish',
181e394901aSAnna Dabrowska            'cols: *',
182e394901aSAnna Dabrowska            'filter: %pageid% = $ID$'
183e394901aSAnna Dabrowska        ];
184e7259784SAnna Dabrowska
185e7259784SAnna Dabrowska        if ($andFilter) {
186e7259784SAnna Dabrowska            $lines[] = 'filter: ' . $andFilter;
187e7259784SAnna Dabrowska        }
188e7259784SAnna Dabrowska
189e394901aSAnna Dabrowska        $parser = new ConfigParser($lines);
190e394901aSAnna Dabrowska        $config = $parser->getConfig();
19140f4519bSAnna Dabrowska        $search = new SearchConfig($config, $this->sqlite);
192e394901aSAnna Dabrowska        $data = $search->execute();
193e394901aSAnna Dabrowska        if (!empty($data)) {
19451066f27SAnna Dabrowska            // FIXME
195e394901aSAnna Dabrowska            return $data[array_key_last($data)];
196e394901aSAnna Dabrowska        }
197e394901aSAnna Dabrowska        return [];
1983449f9ceSAnna Dabrowska    }
199e7259784SAnna Dabrowska
2008d2065f7SAnna Dabrowska    /**
2010dcf68caSAnna Dabrowska     * Return "latest" published revision of a given page.
2020dcf68caSAnna Dabrowska     * If $rev is specified, "latest" means relative to the $rev revision.
2038d2065f7SAnna Dabrowska     *
2040dcf68caSAnna Dabrowska     * @param int|null $rev
205ecad4fdbSAnna Dabrowska     * @return Revision|null
2068d2065f7SAnna Dabrowska     */
2070dcf68caSAnna Dabrowska    public function getLatestPublishedRevision($rev = null)
208e7259784SAnna Dabrowska    {
2090dcf68caSAnna Dabrowska        $andFilter = 'status=' . Constants::STATUS_PUBLISHED;
2100dcf68caSAnna Dabrowska        if ($rev) {
2110dcf68caSAnna Dabrowska            $andFilter .= ' AND revision < ' . $rev;
2120dcf68caSAnna Dabrowska        }
2130dcf68caSAnna Dabrowska        $latestPublished = $this->getCoreData($andFilter);
214d00ea115SAnna Dabrowska
215ecad4fdbSAnna Dabrowska        if (empty($latestPublished)) {
216ecad4fdbSAnna Dabrowska            return null;
217ecad4fdbSAnna Dabrowska        }
218ecad4fdbSAnna Dabrowska
2190dcf68caSAnna Dabrowska        $published = new Revision($this->sqlite, $this->id, $latestPublished[$this->revisionCol->getColref() - 1]->getRawValue());
220ecad4fdbSAnna Dabrowska
2210dcf68caSAnna Dabrowska        $published->setStatus($latestPublished[$this->statusCol->getColref() - 1]->getRawValue());
2220dcf68caSAnna Dabrowska        $published->setUser($latestPublished[$this->userCol->getColref() - 1]->getRawValue());
223e6dd5f77SAnna Dabrowska        $published->setDatetime($latestPublished[$this->datetimeCol->getColref() - 1]->getRawValue());
2240dcf68caSAnna Dabrowska        $published->setVersion($latestPublished[$this->versionCol->getColref() - 1]->getRawValue());
225e7259784SAnna Dabrowska
2260dcf68caSAnna Dabrowska        return $published;
227e7259784SAnna Dabrowska    }
228c2f8a3c4SAnna Dabrowska}
229