xref: /plugin/structpublish/meta/Revision.php (revision 51066f2725104728ed4ca433dc247fff64bfc68e)
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
21e7259784SAnna Dabrowska
22c2f8a3c4SAnna Dabrowska    protected $id;
23c2f8a3c4SAnna Dabrowska    protected $rev;
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;
47c2f8a3c4SAnna Dabrowska
48e7259784SAnna Dabrowska        $this->schema = new Schema('structpublish');
49e7259784SAnna Dabrowska        $this->statusCol = $this->schema->findColumn('status');
50e7259784SAnna Dabrowska        $this->versionCol = $this->schema->findColumn('version');
51e7259784SAnna Dabrowska        $this->userCol = $this->schema->findColumn('user');
52e7259784SAnna Dabrowska        $this->dateCol = $this->schema->findColumn('date');
53e7259784SAnna Dabrowska        $this->revisionCol = $this->schema->findColumn('revision');
543449f9ceSAnna Dabrowska
55e394901aSAnna Dabrowska        /** @var Value[] $values */
56*51066f27SAnna Dabrowska        $values = $this->getCoreData('revision=' . $this->rev);
57e394901aSAnna Dabrowska
58e394901aSAnna Dabrowska        if (!empty($values)) {
59e7259784SAnna Dabrowska            $this->status = $values[$this->statusCol->getColref() - 1]->getRawValue();
60e7259784SAnna Dabrowska            $this->version = $values[$this->versionCol->getColref() - 1]->getRawValue();
61e7259784SAnna Dabrowska            $this->user = $values[$this->userCol->getColref() - 1]->getRawValue();
62e7259784SAnna Dabrowska            $this->date = $values[$this->dateCol->getColref() - 1]->getRawValue();
633449f9ceSAnna Dabrowska        }
64c2f8a3c4SAnna Dabrowska    }
65c2f8a3c4SAnna Dabrowska
66c2f8a3c4SAnna Dabrowska    public function save()
67c2f8a3c4SAnna Dabrowska    {
68e394901aSAnna Dabrowska        // drafts reference the latest version
69e394901aSAnna Dabrowska        if ($this->status === self::STATUS_DRAFT) {
70e394901aSAnna Dabrowska            //FIXME no rev yet
71e394901aSAnna Dabrowska            $this->setVersion($this->getVersion());
72e394901aSAnna Dabrowska        }
73e394901aSAnna Dabrowska
743449f9ceSAnna Dabrowska        // TODO reset publish status of older revisions
753449f9ceSAnna Dabrowska
76e394901aSAnna Dabrowska            $this->updateCoreData($this->id);
77c2f8a3c4SAnna Dabrowska    }
78c2f8a3c4SAnna Dabrowska
79c2f8a3c4SAnna Dabrowska    /**
803449f9ceSAnna Dabrowska     * @return int
81c2f8a3c4SAnna Dabrowska     */
82c2f8a3c4SAnna Dabrowska    public function getVersion()
83c2f8a3c4SAnna Dabrowska    {
843231ebaeSAnna Dabrowska        return (int)$this->version;
85c2f8a3c4SAnna Dabrowska    }
86c2f8a3c4SAnna Dabrowska
87c2f8a3c4SAnna Dabrowska    /**
883449f9ceSAnna Dabrowska     * @param int $version
89c2f8a3c4SAnna Dabrowska     */
90c2f8a3c4SAnna Dabrowska    public function setVersion($version): void
91c2f8a3c4SAnna Dabrowska    {
92c2f8a3c4SAnna Dabrowska        $this->version = $version;
93c2f8a3c4SAnna Dabrowska    }
94c2f8a3c4SAnna Dabrowska
95c2f8a3c4SAnna Dabrowska    /**
963449f9ceSAnna Dabrowska     * @return int
97c2f8a3c4SAnna Dabrowska     */
98c2f8a3c4SAnna Dabrowska    public function getRev()
99c2f8a3c4SAnna Dabrowska    {
100c2f8a3c4SAnna Dabrowska        return $this->rev;
101c2f8a3c4SAnna Dabrowska    }
102c2f8a3c4SAnna Dabrowska
103c2f8a3c4SAnna Dabrowska    /**
1043449f9ceSAnna Dabrowska     * @param int $rev
105c2f8a3c4SAnna Dabrowska     */
106c2f8a3c4SAnna Dabrowska    public function setRev($rev): void
107c2f8a3c4SAnna Dabrowska    {
108c2f8a3c4SAnna Dabrowska        $this->rev = $rev;
109c2f8a3c4SAnna Dabrowska    }
110c2f8a3c4SAnna Dabrowska
111c2f8a3c4SAnna Dabrowska    /**
1123449f9ceSAnna Dabrowska     * @return string
113c2f8a3c4SAnna Dabrowska     */
114c2f8a3c4SAnna Dabrowska    public function getStatus()
115c2f8a3c4SAnna Dabrowska    {
116e394901aSAnna Dabrowska        return $this->status;
117c2f8a3c4SAnna Dabrowska    }
118c2f8a3c4SAnna Dabrowska
119c2f8a3c4SAnna Dabrowska    /**
1203449f9ceSAnna Dabrowska     * @param string $status
121c2f8a3c4SAnna Dabrowska     */
122c2f8a3c4SAnna Dabrowska    public function setStatus($status): void
123c2f8a3c4SAnna Dabrowska    {
124c2f8a3c4SAnna Dabrowska        $this->status = $status;
125c2f8a3c4SAnna Dabrowska    }
126c2f8a3c4SAnna Dabrowska
127c2f8a3c4SAnna Dabrowska    /**
1283449f9ceSAnna Dabrowska     * @return string
129c2f8a3c4SAnna Dabrowska     */
130c2f8a3c4SAnna Dabrowska    public function getUser()
131c2f8a3c4SAnna Dabrowska    {
132c2f8a3c4SAnna Dabrowska        return $this->user;
133c2f8a3c4SAnna Dabrowska    }
134c2f8a3c4SAnna Dabrowska
135c2f8a3c4SAnna Dabrowska    /**
1363449f9ceSAnna Dabrowska     * @param string $user
137c2f8a3c4SAnna Dabrowska     */
138c2f8a3c4SAnna Dabrowska    public function setUser($user): void
139c2f8a3c4SAnna Dabrowska    {
140c2f8a3c4SAnna Dabrowska        $this->user = $user;
141c2f8a3c4SAnna Dabrowska    }
1423449f9ceSAnna Dabrowska
143e394901aSAnna Dabrowska    public function getDate()
144e394901aSAnna Dabrowska    {
145e394901aSAnna Dabrowska        return $this->date;
146e394901aSAnna Dabrowska    }
147e394901aSAnna Dabrowska
148e394901aSAnna Dabrowska    public function setDate($time)
149e394901aSAnna Dabrowska    {
150e394901aSAnna Dabrowska        $this->date = date('Y-m-d', $time);
151e394901aSAnna Dabrowska    }
152e394901aSAnna Dabrowska
1533449f9ceSAnna Dabrowska    /**
1543449f9ceSAnna Dabrowska     * Update publish status in the core table
1553449f9ceSAnna Dabrowska     */
156e394901aSAnna Dabrowska    protected function updateCoreData($pid, $rid = 0)
1573449f9ceSAnna Dabrowska    {
158e394901aSAnna Dabrowska        $data = [
159e394901aSAnna Dabrowska            'status' => $this->status,
160e394901aSAnna Dabrowska            'user' => $this->user,
161e394901aSAnna Dabrowska            'date' => $this->date,
162e394901aSAnna Dabrowska            'revision' => $this->rev,
163e394901aSAnna Dabrowska            'version' => $this->version,
164e394901aSAnna Dabrowska        ];
1653231ebaeSAnna Dabrowska        $schema = new Schema('structpublish', 0);
1663231ebaeSAnna Dabrowska        $access = new AccessTableStructpublish($schema, $pid, 0, $rid);
167e394901aSAnna Dabrowska        $access->saveData($data);
168e394901aSAnna Dabrowska    }
169e394901aSAnna Dabrowska
170e7259784SAnna Dabrowska    public function getCoreData($andFilter = '')
171e394901aSAnna Dabrowska    {
172e394901aSAnna Dabrowska        $lines = [
173e394901aSAnna Dabrowska            'schema: structpublish',
174e394901aSAnna Dabrowska            'cols: *',
175e394901aSAnna Dabrowska            'filter: %pageid% = $ID$'
176e394901aSAnna Dabrowska        ];
177e7259784SAnna Dabrowska
178e7259784SAnna Dabrowska        if ($andFilter) {
179e7259784SAnna Dabrowska            $lines[] = 'filter: ' . $andFilter;
180e7259784SAnna Dabrowska        }
181e7259784SAnna Dabrowska
182e394901aSAnna Dabrowska        $parser = new ConfigParser($lines);
183e394901aSAnna Dabrowska        $config = $parser->getConfig();
184e394901aSAnna Dabrowska        $search = new SearchConfig($config);
185e394901aSAnna Dabrowska        $data = $search->execute();
186e394901aSAnna Dabrowska        if (!empty($data)) {
187*51066f27SAnna Dabrowska            // FIXME
188e394901aSAnna Dabrowska            return $data[array_key_last($data)];
189e394901aSAnna Dabrowska        }
190e394901aSAnna Dabrowska        return [];
1913449f9ceSAnna Dabrowska    }
192e7259784SAnna Dabrowska
193e7259784SAnna Dabrowska    public function getLatestPublished()
194e7259784SAnna Dabrowska    {
195e7259784SAnna Dabrowska        return $this->getCoreData('status=' . self::STATUS_PUBLISHED);
196e7259784SAnna Dabrowska    }
197e7259784SAnna Dabrowska
198e7259784SAnna Dabrowska    public function getLatestPublishedRev()
199e7259784SAnna Dabrowska    {
200e7259784SAnna Dabrowska        return $this->getLatestPublished()[$this->revisionCol->getColref() - 1]->getRawValue();
201e7259784SAnna Dabrowska    }
202c2f8a3c4SAnna Dabrowska}
203