xref: /plugin/structpublish/meta/Revision.php (revision d00ea115c508cb387f56896a3fa3adc5f5ed395c)
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{
12c2f8a3c4SAnna Dabrowska    const STATUS_DRAFT = 'draft';
133231ebaeSAnna Dabrowska    const STATUS_APPROVED = 'approved';
14c2f8a3c4SAnna Dabrowska    const STATUS_PUBLISHED = 'published';
15c2f8a3c4SAnna Dabrowska
16e394901aSAnna Dabrowska    /** @var \helper_plugin_sqlite */
17c2f8a3c4SAnna Dabrowska    protected $sqlite;
18e7259784SAnna Dabrowska
19e7259784SAnna Dabrowska    protected $schema;
20e7259784SAnna Dabrowska
21c2f8a3c4SAnna Dabrowska    protected $id;
22c2f8a3c4SAnna Dabrowska    protected $rev;
236a791fefSAnna Dabrowska    protected $published;
24c2f8a3c4SAnna Dabrowska    protected $status;
25e394901aSAnna Dabrowska    protected $version;
26c2f8a3c4SAnna Dabrowska    protected $user;
27e394901aSAnna Dabrowska    protected $date;
28e7259784SAnna Dabrowska    /**
29e7259784SAnna Dabrowska     * @var bool|\dokuwiki\plugin\struct\meta\Column
30e7259784SAnna Dabrowska     */
31e7259784SAnna Dabrowska    protected $statusCol;
32e7259784SAnna Dabrowska    protected $versionCol;
33e7259784SAnna Dabrowska    protected $userCol;
34e7259784SAnna Dabrowska    protected $dateCol;
35e7259784SAnna Dabrowska    protected $revisionCol;
36c2f8a3c4SAnna Dabrowska
37c2f8a3c4SAnna Dabrowska    /**
38c2f8a3c4SAnna Dabrowska     * @param $sqlite
393449f9ceSAnna Dabrowska     * @param string $id
403449f9ceSAnna Dabrowska     * @param int $rev
41c2f8a3c4SAnna Dabrowska     */
423449f9ceSAnna Dabrowska    public function __construct($sqlite, $id, $rev)
43c2f8a3c4SAnna Dabrowska    {
44c2f8a3c4SAnna Dabrowska        $this->sqlite = $sqlite;
45c2f8a3c4SAnna Dabrowska        $this->id = $id;
46c2f8a3c4SAnna Dabrowska        $this->rev = $rev;
476a791fefSAnna Dabrowska        $this->published = 0;
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');
53e7259784SAnna Dabrowska        $this->dateCol = $this->schema->findColumn('date');
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();
63e7259784SAnna Dabrowska            $this->date = $values[$this->dateCol->getColref() - 1]->getRawValue();
643449f9ceSAnna Dabrowska        }
65c2f8a3c4SAnna Dabrowska    }
66c2f8a3c4SAnna Dabrowska
67c2f8a3c4SAnna Dabrowska    public function save()
68c2f8a3c4SAnna Dabrowska    {
69e394901aSAnna Dabrowska        // drafts reference the latest version
70e394901aSAnna Dabrowska        if ($this->status === self::STATUS_DRAFT) {
71e394901aSAnna Dabrowska            //FIXME no rev yet
72e394901aSAnna Dabrowska            $this->setVersion($this->getVersion());
73e394901aSAnna Dabrowska        }
74e394901aSAnna Dabrowska
756a791fefSAnna Dabrowska        if ($this->status === self::STATUS_PUBLISHED) {
766a791fefSAnna Dabrowska            $this->published = 1;
776a791fefSAnna Dabrowska        }
783449f9ceSAnna Dabrowska
79e394901aSAnna Dabrowska        $this->updateCoreData($this->id);
806a791fefSAnna Dabrowska        // TODO reset publish status of older revisions
816a791fefSAnna Dabrowska
82c2f8a3c4SAnna Dabrowska    }
83c2f8a3c4SAnna Dabrowska
84c2f8a3c4SAnna Dabrowska    /**
853449f9ceSAnna Dabrowska     * @return int
86c2f8a3c4SAnna Dabrowska     */
87c2f8a3c4SAnna Dabrowska    public function getVersion()
88c2f8a3c4SAnna Dabrowska    {
893231ebaeSAnna Dabrowska        return (int)$this->version;
90c2f8a3c4SAnna Dabrowska    }
91c2f8a3c4SAnna Dabrowska
92c2f8a3c4SAnna Dabrowska    /**
933449f9ceSAnna Dabrowska     * @param int $version
94c2f8a3c4SAnna Dabrowska     */
95c2f8a3c4SAnna Dabrowska    public function setVersion($version): void
96c2f8a3c4SAnna Dabrowska    {
97c2f8a3c4SAnna Dabrowska        $this->version = $version;
98c2f8a3c4SAnna Dabrowska    }
99c2f8a3c4SAnna Dabrowska
100c2f8a3c4SAnna Dabrowska    /**
1013449f9ceSAnna Dabrowska     * @return int
102c2f8a3c4SAnna Dabrowska     */
103c2f8a3c4SAnna Dabrowska    public function getRev()
104c2f8a3c4SAnna Dabrowska    {
105c2f8a3c4SAnna Dabrowska        return $this->rev;
106c2f8a3c4SAnna Dabrowska    }
107c2f8a3c4SAnna Dabrowska
108c2f8a3c4SAnna Dabrowska    /**
1093449f9ceSAnna Dabrowska     * @param int $rev
110c2f8a3c4SAnna Dabrowska     */
111c2f8a3c4SAnna Dabrowska    public function setRev($rev): void
112c2f8a3c4SAnna Dabrowska    {
113c2f8a3c4SAnna Dabrowska        $this->rev = $rev;
114c2f8a3c4SAnna Dabrowska    }
115c2f8a3c4SAnna Dabrowska
116c2f8a3c4SAnna Dabrowska    /**
1173449f9ceSAnna Dabrowska     * @return string
118c2f8a3c4SAnna Dabrowska     */
119c2f8a3c4SAnna Dabrowska    public function getStatus()
120c2f8a3c4SAnna Dabrowska    {
121e394901aSAnna Dabrowska        return $this->status;
122c2f8a3c4SAnna Dabrowska    }
123c2f8a3c4SAnna Dabrowska
124c2f8a3c4SAnna Dabrowska    /**
1253449f9ceSAnna Dabrowska     * @param string $status
126c2f8a3c4SAnna Dabrowska     */
127c2f8a3c4SAnna Dabrowska    public function setStatus($status): void
128c2f8a3c4SAnna Dabrowska    {
129c2f8a3c4SAnna Dabrowska        $this->status = $status;
130c2f8a3c4SAnna Dabrowska    }
131c2f8a3c4SAnna Dabrowska
132c2f8a3c4SAnna Dabrowska    /**
1333449f9ceSAnna Dabrowska     * @return string
134c2f8a3c4SAnna Dabrowska     */
135c2f8a3c4SAnna Dabrowska    public function getUser()
136c2f8a3c4SAnna Dabrowska    {
137c2f8a3c4SAnna Dabrowska        return $this->user;
138c2f8a3c4SAnna Dabrowska    }
139c2f8a3c4SAnna Dabrowska
140c2f8a3c4SAnna Dabrowska    /**
1413449f9ceSAnna Dabrowska     * @param string $user
142c2f8a3c4SAnna Dabrowska     */
143c2f8a3c4SAnna Dabrowska    public function setUser($user): void
144c2f8a3c4SAnna Dabrowska    {
145c2f8a3c4SAnna Dabrowska        $this->user = $user;
146c2f8a3c4SAnna Dabrowska    }
1473449f9ceSAnna Dabrowska
148e394901aSAnna Dabrowska    public function getDate()
149e394901aSAnna Dabrowska    {
150e394901aSAnna Dabrowska        return $this->date;
151e394901aSAnna Dabrowska    }
152e394901aSAnna Dabrowska
153e394901aSAnna Dabrowska    public function setDate($time)
154e394901aSAnna Dabrowska    {
155e394901aSAnna Dabrowska        $this->date = date('Y-m-d', $time);
156e394901aSAnna Dabrowska    }
157e394901aSAnna Dabrowska
1583449f9ceSAnna Dabrowska    /**
1593449f9ceSAnna Dabrowska     * Update publish status in the core table
1603449f9ceSAnna Dabrowska     */
161e394901aSAnna Dabrowska    protected function updateCoreData($pid, $rid = 0)
1623449f9ceSAnna Dabrowska    {
163e394901aSAnna Dabrowska        $data = [
164e394901aSAnna Dabrowska            'status' => $this->status,
165e394901aSAnna Dabrowska            'user' => $this->user,
166e394901aSAnna Dabrowska            'date' => $this->date,
167e394901aSAnna Dabrowska            'revision' => $this->rev,
168e394901aSAnna Dabrowska            'version' => $this->version,
169e394901aSAnna Dabrowska        ];
1703231ebaeSAnna Dabrowska        $schema = new Schema('structpublish', 0);
1713231ebaeSAnna Dabrowska        $access = new AccessTableStructpublish($schema, $pid, 0, $rid);
1726a791fefSAnna Dabrowska        $access->setPublished($this->published);
173e394901aSAnna Dabrowska        $access->saveData($data);
174e394901aSAnna Dabrowska    }
175e394901aSAnna Dabrowska
176e7259784SAnna Dabrowska    public function getCoreData($andFilter = '')
177e394901aSAnna Dabrowska    {
178e394901aSAnna Dabrowska        $lines = [
179e394901aSAnna Dabrowska            'schema: structpublish',
180e394901aSAnna Dabrowska            'cols: *',
181e394901aSAnna Dabrowska            'filter: %pageid% = $ID$'
182e394901aSAnna Dabrowska        ];
183e7259784SAnna Dabrowska
184e7259784SAnna Dabrowska        if ($andFilter) {
185e7259784SAnna Dabrowska            $lines[] = 'filter: ' . $andFilter;
186e7259784SAnna Dabrowska        }
187e7259784SAnna Dabrowska
188e394901aSAnna Dabrowska        $parser = new ConfigParser($lines);
189e394901aSAnna Dabrowska        $config = $parser->getConfig();
19040f4519bSAnna Dabrowska        $search = new SearchConfig($config, $this->sqlite);
191e394901aSAnna Dabrowska        $data = $search->execute();
192e394901aSAnna Dabrowska        if (!empty($data)) {
19351066f27SAnna Dabrowska            // FIXME
194e394901aSAnna Dabrowska            return $data[array_key_last($data)];
195e394901aSAnna Dabrowska        }
196e394901aSAnna Dabrowska        return [];
1973449f9ceSAnna Dabrowska    }
198e7259784SAnna Dabrowska
1998d2065f7SAnna Dabrowska    /**
2008d2065f7SAnna Dabrowska     * Get a property of the latest published revision associated with the current one
2018d2065f7SAnna Dabrowska     *
2028d2065f7SAnna Dabrowska     * @param string $key
2038d2065f7SAnna Dabrowska     * @return string
2048d2065f7SAnna Dabrowska     */
2058d2065f7SAnna Dabrowska    public function getLatestPublished($key)
206e7259784SAnna Dabrowska    {
2078d2065f7SAnna Dabrowska        $latestPublished = $this->getCoreData('status=' . self::STATUS_PUBLISHED);
208*d00ea115SAnna Dabrowska        if (!$latestPublished) return '';
209*d00ea115SAnna Dabrowska
2108d2065f7SAnna Dabrowska        $data = [
2118d2065f7SAnna Dabrowska            'status' => $latestPublished[$this->statusCol->getColref() - 1]->getRawValue(),
2128d2065f7SAnna Dabrowska            'user' => $latestPublished[$this->userCol->getColref() - 1]->getRawValue(),
2138d2065f7SAnna Dabrowska            'date' => $latestPublished[$this->dateCol->getColref() - 1]->getRawValue(),
2148d2065f7SAnna Dabrowska            'revision' => $latestPublished[$this->revisionCol->getColref() - 1]->getRawValue(),
2158d2065f7SAnna Dabrowska            'version' => $latestPublished[$this->versionCol->getColref() - 1]->getRawValue(),
2168d2065f7SAnna Dabrowska        ];
217e7259784SAnna Dabrowska
2188d2065f7SAnna Dabrowska        return $data[$key] ?? '';
219e7259784SAnna Dabrowska    }
220c2f8a3c4SAnna Dabrowska}
221