1<?php 2 3namespace dokuwiki\plugin\approve\meta; 4 5use dokuwiki\plugin\sqlite\SQLiteDB; 6use dokuwiki\Extension\AuthPlugin; 7 8class ApproveMetadata 9{ 10 11 protected $db; 12 13 public function __construct() 14 { 15 $this->db = new SQLiteDB('approve', DOKU_PLUGIN . 'sqlite/db/'); 16 } 17 18 public function getPages($user=null, $states=['approved', 'draft', 'ready_for_approval'], $namespace='', $filter=''): array 19 { 20 /* @var AuthPlugin $auth */ 21 global $auth; 22 23 $sql = 'SELECT page.page, page.approver, revision.rev, revision.approved, revision.approved_by, 24 revision.ready_for_approval, revision.ready_for_approval_by, 25 LENGTH(page.page) - LENGTH(REPLACE(page.page, \':\', \'\')) AS colons 26 FROM page INNER JOIN revision ON page.page = revision.page 27 WHERE page.hidden = 0 AND revision.current=1 AND page.page GLOB ? AND page.page REGEXP ? 28 ORDER BY colons, page.page'; 29 $pages = $this->db->queryAll($sql, $namespace.'*', $filter); 30 31 if ($user) { 32 $user_data = $auth->getUserData($user); 33 $user_groups = $user_data['grps']; 34 $pages = array_filter($pages, function ($page) use ($user, $user_groups) { 35 return $page['approver'][0] == '@' && in_array(substr($page['approver'], 1), $user_groups) || 36 $page['approver'] == $user; 37 }); 38 } 39 40 // add status to the page 41 $pages = array_map(function ($page) { 42 if ($page['approved'] !== null) { 43 $page['status'] = 'approved'; 44 } elseif ($page['ready_for_approval'] !== null) { 45 $page['status'] = 'ready_for_approval'; 46 } else { 47 $page['status'] = 'draft'; 48 } 49 return $page; 50 }, $pages); 51 52 // filter by status 53 $pages = array_filter($pages, function ($page) use ($states) { 54 return in_array($page['status'], $states); 55 }); 56 57 return $pages; 58 } 59}