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}