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