14d6d17d0SAndreas Gohr<?php 24d6d17d0SAndreas Gohr/** 34d6d17d0SAndreas Gohr * DokuWiki Plugin acknowledge (Helper Component) 44d6d17d0SAndreas Gohr * 54d6d17d0SAndreas Gohr * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 64d6d17d0SAndreas Gohr * @author Andreas Gohr, Anna Dabrowska <dokuwiki@cosmocode.de> 74d6d17d0SAndreas Gohr */ 84d6d17d0SAndreas Gohr 94d6d17d0SAndreas Gohr 104d6d17d0SAndreas Gohrclass helper_plugin_acknowledge extends DokuWiki_Plugin 114d6d17d0SAndreas Gohr{ 124d6d17d0SAndreas Gohr 13cabb51d3SAndreas Gohr /** 14cabb51d3SAndreas Gohr * @return helper_plugin_sqlite|null 15cabb51d3SAndreas Gohr */ 16cabb51d3SAndreas Gohr public function getDB() 17cabb51d3SAndreas Gohr { 18cabb51d3SAndreas Gohr /** @var \helper_plugin_sqlite $sqlite */ 19cabb51d3SAndreas Gohr $sqlite = plugin_load('helper', 'sqlite'); 20cabb51d3SAndreas Gohr if ($sqlite === null) { 21cabb51d3SAndreas Gohr msg($this->getLang('error sqlite plugin missing'), -1); 22cabb51d3SAndreas Gohr return null; 23cabb51d3SAndreas Gohr } 24cabb51d3SAndreas Gohr if (!$sqlite->init('acknowledgement', __DIR__ . '/db')) { 25cabb51d3SAndreas Gohr return null; 26cabb51d3SAndreas Gohr } 27cabb51d3SAndreas Gohr 28cabb51d3SAndreas Gohr return $sqlite; 29cabb51d3SAndreas Gohr } 30cabb51d3SAndreas Gohr 31cabb51d3SAndreas Gohr /** 32ef3ab392SAndreas Gohr * Delete a page 33ef3ab392SAndreas Gohr * 34ef3ab392SAndreas Gohr * Cascades to delete all assigned data, etc. 35ef3ab392SAndreas Gohr * 36ef3ab392SAndreas Gohr * @param string $page Page ID 37ef3ab392SAndreas Gohr */ 38ef3ab392SAndreas Gohr public function removePage($page) 39ef3ab392SAndreas Gohr { 40ef3ab392SAndreas Gohr $sqlite = $this->getDB(); 41ef3ab392SAndreas Gohr if (!$sqlite) return; 42ef3ab392SAndreas Gohr 43ef3ab392SAndreas Gohr $sql = "DELETE FROM pages WHERE page = ?"; 44ef3ab392SAndreas Gohr $sqlite->query($sql, $page); 45ef3ab392SAndreas Gohr } 46ef3ab392SAndreas Gohr 47ef3ab392SAndreas Gohr /** 48ef3ab392SAndreas Gohr * Update last modified date of page 49ef3ab392SAndreas Gohr * 50ef3ab392SAndreas Gohr * @param string $page Page ID 51ef3ab392SAndreas Gohr * @param int $lastmod timestamp of last non-minor change 52ef3ab392SAndreas Gohr */ 53ef3ab392SAndreas Gohr public function storePageDate($page, $lastmod) 54ef3ab392SAndreas Gohr { 55ef3ab392SAndreas Gohr $sqlite = $this->getDB(); 56ef3ab392SAndreas Gohr if (!$sqlite) return; 57ef3ab392SAndreas Gohr 58ef3ab392SAndreas Gohr $sql = "REPLACE INTO pages (page, lastmod) VALUES (?,?)"; 59ef3ab392SAndreas Gohr $sqlite->query($sql, $page, $lastmod); 60ef3ab392SAndreas Gohr } 61ef3ab392SAndreas Gohr 62ef3ab392SAndreas Gohr /** 63cabb51d3SAndreas Gohr * @param string $page Page ID 64cabb51d3SAndreas Gohr * @param string $assignees comma separated list of users and groups 65cabb51d3SAndreas Gohr */ 66cabb51d3SAndreas Gohr public function setAssignees($page, $assignees) 67cabb51d3SAndreas Gohr { 68cabb51d3SAndreas Gohr $sqlite = $this->getDB(); 69cabb51d3SAndreas Gohr if (!$sqlite) return; 70cabb51d3SAndreas Gohr 71cabb51d3SAndreas Gohr $sql = "REPLACE INTO assignments ('page', 'assignee') VALUES (?,?)"; 72cabb51d3SAndreas Gohr $sqlite->query($sql, $page, $assignees); 73cabb51d3SAndreas Gohr } 74cabb51d3SAndreas Gohr 75ef3ab392SAndreas Gohr /** 76*5773dd37SAnna Dabrowska * Clears assignments for a page 77ef3ab392SAndreas Gohr * 78ef3ab392SAndreas Gohr * @param string $page Page ID 79ef3ab392SAndreas Gohr */ 80ef3ab392SAndreas Gohr public function clearAssignments($page) 81ef3ab392SAndreas Gohr { 82ef3ab392SAndreas Gohr $sqlite = $this->getDB(); 83ef3ab392SAndreas Gohr if (!$sqlite) return; 84cabb51d3SAndreas Gohr 85ef3ab392SAndreas Gohr $sql = "DELETE FROM assignments WHERE page = ?"; 86ef3ab392SAndreas Gohr $sqlite->query($sql, $page); 87ef3ab392SAndreas Gohr } 88ef3ab392SAndreas Gohr 89ef3ab392SAndreas Gohr 90ef3ab392SAndreas Gohr /** 91ef3ab392SAndreas Gohr * Is the given user one of the assignees for this page 92ef3ab392SAndreas Gohr * 93ef3ab392SAndreas Gohr * @param string $page Page ID 94ef3ab392SAndreas Gohr * @param string $user user name to check 95ef3ab392SAndreas Gohr * @param string[] $groups groups this user is in 96ef3ab392SAndreas Gohr * @return bool 97ef3ab392SAndreas Gohr */ 98ef3ab392SAndreas Gohr public function isUserAssigned($page, $user, $groups) 99ef3ab392SAndreas Gohr { 100ef3ab392SAndreas Gohr $sqlite = $this->getDB(); 101ef3ab392SAndreas Gohr if (!$sqlite) return false; 102ef3ab392SAndreas Gohr 103ef3ab392SAndreas Gohr 104ef3ab392SAndreas Gohr $sql = "SELECT assignee FROM assignments WHERE page = ?"; 105ef3ab392SAndreas Gohr $result = $sqlite->query($sql, $page); 106ef3ab392SAndreas Gohr $assignees = (string)$sqlite->res2single($result); 107ef3ab392SAndreas Gohr $sqlite->res_close($result); 108ef3ab392SAndreas Gohr 109ef3ab392SAndreas Gohr return auth_isMember($assignees, $user, $groups); 110ef3ab392SAndreas Gohr } 111ef3ab392SAndreas Gohr 112ef3ab392SAndreas Gohr /** 113ef3ab392SAndreas Gohr * Has the given user acknowledged the given page? 114ef3ab392SAndreas Gohr * 115ef3ab392SAndreas Gohr * @param string $page 116ef3ab392SAndreas Gohr * @param string $user 117*5773dd37SAnna Dabrowska * @return bool|int timestamp of acknowledgement or false 118ef3ab392SAndreas Gohr */ 119ef3ab392SAndreas Gohr public function hasUserAcknowledged($page, $user) 120ef3ab392SAndreas Gohr { 121ef3ab392SAndreas Gohr $sqlite = $this->getDB(); 122ef3ab392SAndreas Gohr if (!$sqlite) return false; 123ef3ab392SAndreas Gohr 124ef3ab392SAndreas Gohr $sql = "SELECT ack 125ef3ab392SAndreas Gohr FROM acks A, pages B 126ef3ab392SAndreas Gohr WHERE A.page = B.page 127*5773dd37SAnna Dabrowska AND A.page = ? 128*5773dd37SAnna Dabrowska AND A.user = ? 129ef3ab392SAndreas Gohr AND A.ack >= B.lastmod"; 130ef3ab392SAndreas Gohr 131ef3ab392SAndreas Gohr $result = $sqlite->query($sql, $page, $user); 132ef3ab392SAndreas Gohr $acktime = $sqlite->res2single($result); 133ef3ab392SAndreas Gohr $sqlite->res_close($result); 134ef3ab392SAndreas Gohr 135ef3ab392SAndreas Gohr return $acktime ? (int)$acktime : false; 136ef3ab392SAndreas Gohr } 137*5773dd37SAnna Dabrowska 138*5773dd37SAnna Dabrowska /** 139*5773dd37SAnna Dabrowska * Save user's acknowledgement for a given page 140*5773dd37SAnna Dabrowska * 141*5773dd37SAnna Dabrowska * @param string $page 142*5773dd37SAnna Dabrowska * @param string $user 143*5773dd37SAnna Dabrowska * @return bool 144*5773dd37SAnna Dabrowska */ 145*5773dd37SAnna Dabrowska public function saveAcknowledgement($page, $user) 146*5773dd37SAnna Dabrowska { 147*5773dd37SAnna Dabrowska $sqlite = $this->getDB(); 148*5773dd37SAnna Dabrowska if (!$sqlite) return false; 149*5773dd37SAnna Dabrowska 150*5773dd37SAnna Dabrowska $sql = "REPLACE INTO acks (page, user, ack) VALUES (?,?, strftime('%s','now'))"; 151*5773dd37SAnna Dabrowska 152*5773dd37SAnna Dabrowska $result = $sqlite->query($sql, $page, $user); 153*5773dd37SAnna Dabrowska $sqlite->res_close($result); 154*5773dd37SAnna Dabrowska return true; 155*5773dd37SAnna Dabrowska 156*5773dd37SAnna Dabrowska } 1574d6d17d0SAndreas Gohr} 1584d6d17d0SAndreas Gohr 159