xref: /plugin/structpublish/meta/Revision.php (revision 8903e50c967ac334e4014ec75da16f8b2002df77)
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
10*8903e50cSAndreas Gohr/**
11*8903e50cSAndreas Gohr * Object representing a page revision and its properties
12*8903e50cSAndreas Gohr */
13c2f8a3c4SAnna Dabrowskaclass Revision
14c2f8a3c4SAnna Dabrowska{
15e394901aSAnna Dabrowska    /** @var \helper_plugin_sqlite */
16c2f8a3c4SAnna Dabrowska    protected $sqlite;
17e7259784SAnna Dabrowska
18e7259784SAnna Dabrowska    protected $schema;
19e7259784SAnna Dabrowska
20c2f8a3c4SAnna Dabrowska    protected $id;
21c2f8a3c4SAnna Dabrowska    protected $rev;
226a791fefSAnna Dabrowska    protected $published;
23c2f8a3c4SAnna Dabrowska    protected $status;
24e394901aSAnna Dabrowska    protected $version;
25c2f8a3c4SAnna Dabrowska    protected $user;
26e6dd5f77SAnna Dabrowska    protected $datetime;
27*8903e50cSAndreas Gohr    /** @var bool|\dokuwiki\plugin\struct\meta\Column */
28e7259784SAnna Dabrowska    protected $statusCol;
29e7259784SAnna Dabrowska    protected $versionCol;
30e7259784SAnna Dabrowska    protected $userCol;
31e6dd5f77SAnna Dabrowska    protected $datetimeCol;
32e7259784SAnna Dabrowska    protected $revisionCol;
33c2f8a3c4SAnna Dabrowska
34c2f8a3c4SAnna Dabrowska    /**
35*8903e50cSAndreas Gohr     * Constructor
36*8903e50cSAndreas Gohr     *
37*8903e50cSAndreas Gohr     * @param \helper_plugin_sqlite $sqlite
38*8903e50cSAndreas Gohr     * @param string $id page id
39*8903e50cSAndreas Gohr     * @param int $rev revision
40c2f8a3c4SAnna Dabrowska     */
413449f9ceSAnna Dabrowska    public function __construct($sqlite, $id, $rev)
42c2f8a3c4SAnna Dabrowska    {
43c2f8a3c4SAnna Dabrowska        $this->sqlite = $sqlite;
44c2f8a3c4SAnna Dabrowska        $this->id = $id;
45c2f8a3c4SAnna Dabrowska        $this->rev = $rev;
466a791fefSAnna Dabrowska        $this->published = 0;
47e6dd5f77SAnna Dabrowska        $this->status = Constants::STATUS_DRAFT;
48c2f8a3c4SAnna Dabrowska
49e7259784SAnna Dabrowska        $this->schema = new Schema('structpublish');
50e7259784SAnna Dabrowska        $this->statusCol = $this->schema->findColumn('status');
51e7259784SAnna Dabrowska        $this->versionCol = $this->schema->findColumn('version');
52e7259784SAnna Dabrowska        $this->userCol = $this->schema->findColumn('user');
53e6dd5f77SAnna Dabrowska        $this->datetimeCol = $this->schema->findColumn('datetime');
54e7259784SAnna Dabrowska        $this->revisionCol = $this->schema->findColumn('revision');
553449f9ceSAnna Dabrowska
56e394901aSAnna Dabrowska        /** @var Value[] $values */
5751066f27SAnna Dabrowska        $values = $this->getCoreData('revision=' . $this->rev);
58e394901aSAnna Dabrowska
59e394901aSAnna Dabrowska        if (!empty($values)) {
60e7259784SAnna Dabrowska            $this->status = $values[$this->statusCol->getColref() - 1]->getRawValue();
61e7259784SAnna Dabrowska            $this->version = $values[$this->versionCol->getColref() - 1]->getRawValue();
62e7259784SAnna Dabrowska            $this->user = $values[$this->userCol->getColref() - 1]->getRawValue();
63e6dd5f77SAnna Dabrowska            $this->datetime = $values[$this->datetimeCol->getColref() - 1]->getRawValue();
643449f9ceSAnna Dabrowska        }
65c2f8a3c4SAnna Dabrowska    }
66c2f8a3c4SAnna Dabrowska
67*8903e50cSAndreas Gohr    /**
68*8903e50cSAndreas Gohr     * Store the currently set structpublish meta data in the database
69*8903e50cSAndreas Gohr     * @return void
70*8903e50cSAndreas Gohr     */
71c2f8a3c4SAnna Dabrowska    public function save()
72c2f8a3c4SAnna Dabrowska    {
73e31c94d7SAndreas Gohr        if ($this->status === Constants::STATUS_PUBLISHED) {
746a791fefSAnna Dabrowska            $this->published = 1;
756a791fefSAnna Dabrowska        }
763449f9ceSAnna Dabrowska
77e394901aSAnna Dabrowska        $this->updateCoreData($this->id);
786a791fefSAnna Dabrowska        // TODO reset publish status of older revisions
79c2f8a3c4SAnna Dabrowska    }
80c2f8a3c4SAnna Dabrowska
81c2f8a3c4SAnna Dabrowska    /**
82*8903e50cSAndreas Gohr     * Return the version of a published revision
83*8903e50cSAndreas Gohr     *
84*8903e50cSAndreas Gohr     * @return string|null
85c2f8a3c4SAnna Dabrowska     */
86c2f8a3c4SAnna Dabrowska    public function getVersion()
87c2f8a3c4SAnna Dabrowska    {
88*8903e50cSAndreas Gohr        return $this->version;
89c2f8a3c4SAnna Dabrowska    }
90c2f8a3c4SAnna Dabrowska
91c2f8a3c4SAnna Dabrowska    /**
92*8903e50cSAndreas Gohr     * Set the version of a published revision
93*8903e50cSAndreas Gohr     *
94*8903e50cSAndreas Gohr     * @param string $version
95c2f8a3c4SAnna Dabrowska     */
96*8903e50cSAndreas Gohr    public function setVersion($version)
97c2f8a3c4SAnna Dabrowska    {
98c2f8a3c4SAnna Dabrowska        $this->version = $version;
99c2f8a3c4SAnna Dabrowska    }
100c2f8a3c4SAnna Dabrowska
101c2f8a3c4SAnna Dabrowska    /**
102*8903e50cSAndreas Gohr     * The revision timestamp
103*8903e50cSAndreas Gohr     *
1043449f9ceSAnna Dabrowska     * @return int
105c2f8a3c4SAnna Dabrowska     */
106c2f8a3c4SAnna Dabrowska    public function getRev()
107c2f8a3c4SAnna Dabrowska    {
108c2f8a3c4SAnna Dabrowska        return $this->rev;
109c2f8a3c4SAnna Dabrowska    }
110c2f8a3c4SAnna Dabrowska
111c2f8a3c4SAnna Dabrowska    /**
112*8903e50cSAndreas Gohr     * Get the current status of this revision
113*8903e50cSAndreas Gohr     *
1143449f9ceSAnna Dabrowska     * @return string
115c2f8a3c4SAnna Dabrowska     */
116c2f8a3c4SAnna Dabrowska    public function getStatus()
117c2f8a3c4SAnna Dabrowska    {
118e394901aSAnna Dabrowska        return $this->status;
119c2f8a3c4SAnna Dabrowska    }
120c2f8a3c4SAnna Dabrowska
121c2f8a3c4SAnna Dabrowska    /**
122*8903e50cSAndreas Gohr     * Set the current status of this revision
123*8903e50cSAndreas Gohr     *
1243449f9ceSAnna Dabrowska     * @param string $status
125c2f8a3c4SAnna Dabrowska     */
126*8903e50cSAndreas Gohr    public function setStatus($status)
127c2f8a3c4SAnna Dabrowska    {
128c2f8a3c4SAnna Dabrowska        $this->status = $status;
129c2f8a3c4SAnna Dabrowska    }
130c2f8a3c4SAnna Dabrowska
131c2f8a3c4SAnna Dabrowska    /**
132*8903e50cSAndreas Gohr     * Get the user that changed the status of this revision
133*8903e50cSAndreas Gohr     *
134*8903e50cSAndreas Gohr     * Not available for drafts
135*8903e50cSAndreas Gohr     *
136*8903e50cSAndreas Gohr     * @return string|null
137c2f8a3c4SAnna Dabrowska     */
138c2f8a3c4SAnna Dabrowska    public function getUser()
139c2f8a3c4SAnna Dabrowska    {
140c2f8a3c4SAnna Dabrowska        return $this->user;
141c2f8a3c4SAnna Dabrowska    }
142c2f8a3c4SAnna Dabrowska
143c2f8a3c4SAnna Dabrowska    /**
144*8903e50cSAndreas Gohr     * Set the user that changed the revision status
145*8903e50cSAndreas Gohr     *
1463449f9ceSAnna Dabrowska     * @param string $user
147c2f8a3c4SAnna Dabrowska     */
148c2f8a3c4SAnna Dabrowska    public function setUser($user): void
149c2f8a3c4SAnna Dabrowska    {
150c2f8a3c4SAnna Dabrowska        $this->user = $user;
151c2f8a3c4SAnna Dabrowska    }
1523449f9ceSAnna Dabrowska
153*8903e50cSAndreas Gohr    /**
154*8903e50cSAndreas Gohr     * The datetime when the status of this revision was changed
155*8903e50cSAndreas Gohr     *
156*8903e50cSAndreas Gohr     * Uses ISO Format. Not available for drafts
157*8903e50cSAndreas Gohr     *
158*8903e50cSAndreas Gohr     * @return string|null
159*8903e50cSAndreas Gohr     */
160e6dd5f77SAnna Dabrowska    public function getDatetime()
161e394901aSAnna Dabrowska    {
162e6dd5f77SAnna Dabrowska        return $this->datetime;
163e394901aSAnna Dabrowska    }
164e394901aSAnna Dabrowska
165*8903e50cSAndreas Gohr    /**
166*8903e50cSAndreas Gohr     * The timestamp of when the status of this revision was changed
167*8903e50cSAndreas Gohr     *
168*8903e50cSAndreas Gohr     * Not available for drafts
169*8903e50cSAndreas Gohr     *
170*8903e50cSAndreas Gohr     * @return int|null
171*8903e50cSAndreas Gohr     */
1725c2215e8SAndreas Gohr    public function getTimestamp()
1735c2215e8SAndreas Gohr    {
174*8903e50cSAndreas Gohr        if ($this->datetime === null) {
175*8903e50cSAndreas Gohr            return null;
176*8903e50cSAndreas Gohr        }
1775c2215e8SAndreas Gohr        return strtotime($this->datetime);
1785c2215e8SAndreas Gohr    }
1795c2215e8SAndreas Gohr
180*8903e50cSAndreas Gohr    /**
181*8903e50cSAndreas Gohr     * Set the datetime when the status of this revision was changed
182*8903e50cSAndreas Gohr     *
183*8903e50cSAndreas Gohr     * Uses ISO Format
184*8903e50cSAndreas Gohr     *
185*8903e50cSAndreas Gohr     * @param string $time
186*8903e50cSAndreas Gohr     */
187e6dd5f77SAnna Dabrowska    public function setDatetime($time)
188e394901aSAnna Dabrowska    {
1895c2215e8SAndreas Gohr        $this->datetime = $time;
1905c2215e8SAndreas Gohr    }
1915c2215e8SAndreas Gohr
192*8903e50cSAndreas Gohr    /**
193*8903e50cSAndreas Gohr     * The page ID this revision is for
194*8903e50cSAndreas Gohr     * @return string
195*8903e50cSAndreas Gohr     */
1965c2215e8SAndreas Gohr    public function getId()
1975c2215e8SAndreas Gohr    {
1985c2215e8SAndreas Gohr        return $this->id;
199e394901aSAnna Dabrowska    }
200e394901aSAnna Dabrowska
2013449f9ceSAnna Dabrowska    /**
2023449f9ceSAnna Dabrowska     * Update publish status in the core table
203*8903e50cSAndreas Gohr     *
204*8903e50cSAndreas Gohr     * @param string $pid
205*8903e50cSAndreas Gohr     * @param int $rid
2063449f9ceSAnna Dabrowska     */
207e394901aSAnna Dabrowska    protected function updateCoreData($pid, $rid = 0)
2083449f9ceSAnna Dabrowska    {
209e394901aSAnna Dabrowska        $data = [
210e394901aSAnna Dabrowska            'status' => $this->status,
211e394901aSAnna Dabrowska            'user' => $this->user,
2125c2215e8SAndreas Gohr            'datetime' => $this->datetime,
213e394901aSAnna Dabrowska            'revision' => $this->rev,
214e394901aSAnna Dabrowska            'version' => $this->version,
215e394901aSAnna Dabrowska        ];
2163231ebaeSAnna Dabrowska        $schema = new Schema('structpublish', 0);
2173231ebaeSAnna Dabrowska        $access = new AccessTableStructpublish($schema, $pid, 0, $rid);
2186a791fefSAnna Dabrowska        $access->setPublished($this->published);
219e394901aSAnna Dabrowska        $access->saveData($data);
220e394901aSAnna Dabrowska    }
221e394901aSAnna Dabrowska
222*8903e50cSAndreas Gohr    /**
223*8903e50cSAndreas Gohr     * @param string $andFilter
224*8903e50cSAndreas Gohr     * @return array|Value[]
225*8903e50cSAndreas Gohr     * @fixme fix fixme, update doc block
226*8903e50cSAndreas Gohr     */
227e7259784SAnna Dabrowska    public function getCoreData($andFilter = '')
228e394901aSAnna Dabrowska    {
229e394901aSAnna Dabrowska        $lines = [
230e394901aSAnna Dabrowska            'schema: structpublish',
231e394901aSAnna Dabrowska            'cols: *',
232e394901aSAnna Dabrowska            'filter: %pageid% = $ID$'
233e394901aSAnna Dabrowska        ];
234e7259784SAnna Dabrowska
235e7259784SAnna Dabrowska        if ($andFilter) {
236e7259784SAnna Dabrowska            $lines[] = 'filter: ' . $andFilter;
237e7259784SAnna Dabrowska        }
238e7259784SAnna Dabrowska
239e394901aSAnna Dabrowska        $parser = new ConfigParser($lines);
240e394901aSAnna Dabrowska        $config = $parser->getConfig();
24140f4519bSAnna Dabrowska        $search = new SearchConfig($config, $this->sqlite);
242e394901aSAnna Dabrowska        $data = $search->execute();
243e394901aSAnna Dabrowska        if (!empty($data)) {
24451066f27SAnna Dabrowska            // FIXME
245e394901aSAnna Dabrowska            return $data[array_key_last($data)];
246e394901aSAnna Dabrowska        }
247e394901aSAnna Dabrowska        return [];
2483449f9ceSAnna Dabrowska    }
249e7259784SAnna Dabrowska
2508d2065f7SAnna Dabrowska    /**
2510dcf68caSAnna Dabrowska     * Return "latest" published revision of a given page.
2520dcf68caSAnna Dabrowska     * If $rev is specified, "latest" means relative to the $rev revision.
2538d2065f7SAnna Dabrowska     *
2540dcf68caSAnna Dabrowska     * @param int|null $rev
255ecad4fdbSAnna Dabrowska     * @return Revision|null
2568d2065f7SAnna Dabrowska     */
2570dcf68caSAnna Dabrowska    public function getLatestPublishedRevision($rev = null)
258e7259784SAnna Dabrowska    {
2590dcf68caSAnna Dabrowska        $andFilter = 'status=' . Constants::STATUS_PUBLISHED;
2600dcf68caSAnna Dabrowska        if ($rev) {
2610dcf68caSAnna Dabrowska            $andFilter .= ' AND revision < ' . $rev;
2620dcf68caSAnna Dabrowska        }
2630dcf68caSAnna Dabrowska        $latestPublished = $this->getCoreData($andFilter);
264d00ea115SAnna Dabrowska
265ecad4fdbSAnna Dabrowska        if (empty($latestPublished)) {
266ecad4fdbSAnna Dabrowska            return null;
267ecad4fdbSAnna Dabrowska        }
268ecad4fdbSAnna Dabrowska
269*8903e50cSAndreas Gohr        $published = new Revision($this->sqlite, $this->id,
270*8903e50cSAndreas Gohr            $latestPublished[$this->revisionCol->getColref() - 1]->getRawValue());
271ecad4fdbSAnna Dabrowska
2720dcf68caSAnna Dabrowska        $published->setStatus($latestPublished[$this->statusCol->getColref() - 1]->getRawValue());
2730dcf68caSAnna Dabrowska        $published->setUser($latestPublished[$this->userCol->getColref() - 1]->getRawValue());
274e6dd5f77SAnna Dabrowska        $published->setDatetime($latestPublished[$this->datetimeCol->getColref() - 1]->getRawValue());
2750dcf68caSAnna Dabrowska        $published->setVersion($latestPublished[$this->versionCol->getColref() - 1]->getRawValue());
276e7259784SAnna Dabrowska
2770dcf68caSAnna Dabrowska        return $published;
278e7259784SAnna Dabrowska    }
279c2f8a3c4SAnna Dabrowska}
280