xref: /plugin/structpublish/meta/Revision.php (revision e31c94d7935dccc7709b66e483c744379995197d)
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;
23e394901aSAnna Dabrowska    protected $date;
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;
30e7259784SAnna Dabrowska    protected $dateCol;
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;
44c2f8a3c4SAnna Dabrowska
45e7259784SAnna Dabrowska        $this->schema = new Schema('structpublish');
46e7259784SAnna Dabrowska        $this->statusCol = $this->schema->findColumn('status');
47e7259784SAnna Dabrowska        $this->versionCol = $this->schema->findColumn('version');
48e7259784SAnna Dabrowska        $this->userCol = $this->schema->findColumn('user');
49e7259784SAnna Dabrowska        $this->dateCol = $this->schema->findColumn('date');
50e7259784SAnna Dabrowska        $this->revisionCol = $this->schema->findColumn('revision');
513449f9ceSAnna Dabrowska
52e394901aSAnna Dabrowska        /** @var Value[] $values */
5351066f27SAnna Dabrowska        $values = $this->getCoreData('revision=' . $this->rev);
54e394901aSAnna Dabrowska
55e394901aSAnna Dabrowska        if (!empty($values)) {
56e7259784SAnna Dabrowska            $this->status = $values[$this->statusCol->getColref() - 1]->getRawValue();
57e7259784SAnna Dabrowska            $this->version = $values[$this->versionCol->getColref() - 1]->getRawValue();
58e7259784SAnna Dabrowska            $this->user = $values[$this->userCol->getColref() - 1]->getRawValue();
59e7259784SAnna Dabrowska            $this->date = $values[$this->dateCol->getColref() - 1]->getRawValue();
603449f9ceSAnna Dabrowska        }
61c2f8a3c4SAnna Dabrowska    }
62c2f8a3c4SAnna Dabrowska
63c2f8a3c4SAnna Dabrowska    public function save()
64c2f8a3c4SAnna Dabrowska    {
65e394901aSAnna Dabrowska        // drafts reference the latest version
66*e31c94d7SAndreas Gohr        if ($this->status === Constants::STATUS_DRAFT) {
67e394901aSAnna Dabrowska            //FIXME no rev yet
68e394901aSAnna Dabrowska            $this->setVersion($this->getVersion());
69e394901aSAnna Dabrowska        }
70e394901aSAnna Dabrowska
71*e31c94d7SAndreas Gohr        if ($this->status === Constants::STATUS_PUBLISHED) {
726a791fefSAnna Dabrowska            $this->published = 1;
736a791fefSAnna Dabrowska        }
743449f9ceSAnna Dabrowska
75e394901aSAnna Dabrowska        $this->updateCoreData($this->id);
766a791fefSAnna Dabrowska        // TODO reset publish status of older revisions
776a791fefSAnna Dabrowska
78c2f8a3c4SAnna Dabrowska    }
79c2f8a3c4SAnna Dabrowska
80c2f8a3c4SAnna Dabrowska    /**
813449f9ceSAnna Dabrowska     * @return int
82c2f8a3c4SAnna Dabrowska     */
83c2f8a3c4SAnna Dabrowska    public function getVersion()
84c2f8a3c4SAnna Dabrowska    {
853231ebaeSAnna Dabrowska        return (int)$this->version;
86c2f8a3c4SAnna Dabrowska    }
87c2f8a3c4SAnna Dabrowska
88c2f8a3c4SAnna Dabrowska    /**
893449f9ceSAnna Dabrowska     * @param int $version
90c2f8a3c4SAnna Dabrowska     */
91c2f8a3c4SAnna Dabrowska    public function setVersion($version): void
92c2f8a3c4SAnna Dabrowska    {
93c2f8a3c4SAnna Dabrowska        $this->version = $version;
94c2f8a3c4SAnna Dabrowska    }
95c2f8a3c4SAnna Dabrowska
96c2f8a3c4SAnna Dabrowska    /**
973449f9ceSAnna Dabrowska     * @return int
98c2f8a3c4SAnna Dabrowska     */
99c2f8a3c4SAnna Dabrowska    public function getRev()
100c2f8a3c4SAnna Dabrowska    {
101c2f8a3c4SAnna Dabrowska        return $this->rev;
102c2f8a3c4SAnna Dabrowska    }
103c2f8a3c4SAnna Dabrowska
104c2f8a3c4SAnna Dabrowska    /**
1053449f9ceSAnna Dabrowska     * @param int $rev
106c2f8a3c4SAnna Dabrowska     */
107c2f8a3c4SAnna Dabrowska    public function setRev($rev): void
108c2f8a3c4SAnna Dabrowska    {
109c2f8a3c4SAnna Dabrowska        $this->rev = $rev;
110c2f8a3c4SAnna Dabrowska    }
111c2f8a3c4SAnna Dabrowska
112c2f8a3c4SAnna Dabrowska    /**
1133449f9ceSAnna Dabrowska     * @return string
114c2f8a3c4SAnna Dabrowska     */
115c2f8a3c4SAnna Dabrowska    public function getStatus()
116c2f8a3c4SAnna Dabrowska    {
117e394901aSAnna Dabrowska        return $this->status;
118c2f8a3c4SAnna Dabrowska    }
119c2f8a3c4SAnna Dabrowska
120c2f8a3c4SAnna Dabrowska    /**
1213449f9ceSAnna Dabrowska     * @param string $status
122c2f8a3c4SAnna Dabrowska     */
123c2f8a3c4SAnna Dabrowska    public function setStatus($status): void
124c2f8a3c4SAnna Dabrowska    {
125c2f8a3c4SAnna Dabrowska        $this->status = $status;
126c2f8a3c4SAnna Dabrowska    }
127c2f8a3c4SAnna Dabrowska
128c2f8a3c4SAnna Dabrowska    /**
1293449f9ceSAnna Dabrowska     * @return string
130c2f8a3c4SAnna Dabrowska     */
131c2f8a3c4SAnna Dabrowska    public function getUser()
132c2f8a3c4SAnna Dabrowska    {
133c2f8a3c4SAnna Dabrowska        return $this->user;
134c2f8a3c4SAnna Dabrowska    }
135c2f8a3c4SAnna Dabrowska
136c2f8a3c4SAnna Dabrowska    /**
1373449f9ceSAnna Dabrowska     * @param string $user
138c2f8a3c4SAnna Dabrowska     */
139c2f8a3c4SAnna Dabrowska    public function setUser($user): void
140c2f8a3c4SAnna Dabrowska    {
141c2f8a3c4SAnna Dabrowska        $this->user = $user;
142c2f8a3c4SAnna Dabrowska    }
1433449f9ceSAnna Dabrowska
144e394901aSAnna Dabrowska    public function getDate()
145e394901aSAnna Dabrowska    {
146e394901aSAnna Dabrowska        return $this->date;
147e394901aSAnna Dabrowska    }
148e394901aSAnna Dabrowska
149e394901aSAnna Dabrowska    public function setDate($time)
150e394901aSAnna Dabrowska    {
151e394901aSAnna Dabrowska        $this->date = date('Y-m-d', $time);
152e394901aSAnna Dabrowska    }
153e394901aSAnna Dabrowska
1543449f9ceSAnna Dabrowska    /**
1553449f9ceSAnna Dabrowska     * Update publish status in the core table
1563449f9ceSAnna Dabrowska     */
157e394901aSAnna Dabrowska    protected function updateCoreData($pid, $rid = 0)
1583449f9ceSAnna Dabrowska    {
159e394901aSAnna Dabrowska        $data = [
160e394901aSAnna Dabrowska            'status' => $this->status,
161e394901aSAnna Dabrowska            'user' => $this->user,
162e394901aSAnna Dabrowska            'date' => $this->date,
163e394901aSAnna Dabrowska            'revision' => $this->rev,
164e394901aSAnna Dabrowska            'version' => $this->version,
165e394901aSAnna Dabrowska        ];
1663231ebaeSAnna Dabrowska        $schema = new Schema('structpublish', 0);
1673231ebaeSAnna Dabrowska        $access = new AccessTableStructpublish($schema, $pid, 0, $rid);
1686a791fefSAnna Dabrowska        $access->setPublished($this->published);
169e394901aSAnna Dabrowska        $access->saveData($data);
170e394901aSAnna Dabrowska    }
171e394901aSAnna Dabrowska
172e7259784SAnna Dabrowska    public function getCoreData($andFilter = '')
173e394901aSAnna Dabrowska    {
174e394901aSAnna Dabrowska        $lines = [
175e394901aSAnna Dabrowska            'schema: structpublish',
176e394901aSAnna Dabrowska            'cols: *',
177e394901aSAnna Dabrowska            'filter: %pageid% = $ID$'
178e394901aSAnna Dabrowska        ];
179e7259784SAnna Dabrowska
180e7259784SAnna Dabrowska        if ($andFilter) {
181e7259784SAnna Dabrowska            $lines[] = 'filter: ' . $andFilter;
182e7259784SAnna Dabrowska        }
183e7259784SAnna Dabrowska
184e394901aSAnna Dabrowska        $parser = new ConfigParser($lines);
185e394901aSAnna Dabrowska        $config = $parser->getConfig();
18640f4519bSAnna Dabrowska        $search = new SearchConfig($config, $this->sqlite);
187e394901aSAnna Dabrowska        $data = $search->execute();
188e394901aSAnna Dabrowska        if (!empty($data)) {
18951066f27SAnna Dabrowska            // FIXME
190e394901aSAnna Dabrowska            return $data[array_key_last($data)];
191e394901aSAnna Dabrowska        }
192e394901aSAnna Dabrowska        return [];
1933449f9ceSAnna Dabrowska    }
194e7259784SAnna Dabrowska
1958d2065f7SAnna Dabrowska    /**
1968d2065f7SAnna Dabrowska     * Get a property of the latest published revision associated with the current one
1978d2065f7SAnna Dabrowska     *
1988d2065f7SAnna Dabrowska     * @param string $key
1998d2065f7SAnna Dabrowska     * @return string
2008d2065f7SAnna Dabrowska     */
2018d2065f7SAnna Dabrowska    public function getLatestPublished($key)
202e7259784SAnna Dabrowska    {
203*e31c94d7SAndreas Gohr        $latestPublished = $this->getCoreData('status=' . Constants::STATUS_PUBLISHED);
204d00ea115SAnna Dabrowska        if (!$latestPublished) return '';
205d00ea115SAnna Dabrowska
2068d2065f7SAnna Dabrowska        $data = [
2078d2065f7SAnna Dabrowska            'status' => $latestPublished[$this->statusCol->getColref() - 1]->getRawValue(),
2088d2065f7SAnna Dabrowska            'user' => $latestPublished[$this->userCol->getColref() - 1]->getRawValue(),
2098d2065f7SAnna Dabrowska            'date' => $latestPublished[$this->dateCol->getColref() - 1]->getRawValue(),
2108d2065f7SAnna Dabrowska            'revision' => $latestPublished[$this->revisionCol->getColref() - 1]->getRawValue(),
2118d2065f7SAnna Dabrowska            'version' => $latestPublished[$this->versionCol->getColref() - 1]->getRawValue(),
2128d2065f7SAnna Dabrowska        ];
213e7259784SAnna Dabrowska
2148d2065f7SAnna Dabrowska        return $data[$key] ?? '';
215e7259784SAnna Dabrowska    }
216c2f8a3c4SAnna Dabrowska}
217