xref: /plugin/ireadit/helper.php (revision d2cf7c78adce1664925be1a0be19ea4fc1239030)
1<?php
2/**
3 * DokuWiki Plugin struct (Helper Component)
4 *
5 * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
6 * @author  Szymon Olewniczak <dokuwiki@cosmocode.de>
7 */
8
9// must be run within Dokuwiki
10if (!defined('DOKU_INC')) {
11    die();
12}
13
14class helper_plugin_ireadit extends DokuWiki_Plugin
15{
16    /**
17     * @param array $users
18     * @param array $groups
19     * @return array
20     */
21    public function users_set($ireadit_data) {
22        global $auth;
23
24        $users = $ireadit_data['users'];
25        $groups = $ireadit_data['groups'];
26        $set = [];
27        if (empty($users) && empty($groups)) {
28            $set = $auth->retrieveUsers();
29        } else {
30            $all_users = $auth->retrieveUsers();
31            foreach ($all_users as $user => $info) {
32                if (in_array($user, $users)) {
33                    $set[$user] = true;
34                } elseif (array_intersect($groups, $info['grps'])) {
35                    $set[$user] = true;
36                }
37            }
38        }
39        return array_keys($set);
40    }
41
42    public function user_can_read_page($ireadit_data, $id, $rev, $user, &$readers=array()) {
43        try {
44            /** @var \helper_plugin_ireadit_db $db_helper */
45            $db_helper = plugin_load('helper', 'ireadit_db');
46            $sqlite = $db_helper->getDB();
47        } catch (Exception $e) {
48            msg($e->getMessage(), -1);
49            return;
50        }
51
52        $res = $sqlite->query('SELECT user, timestamp FROM ireadit
53                                        WHERE page = ?
54                                        AND rev = ?
55                                        ORDER BY timestamp', $id, $rev);
56        $readers = $sqlite->res2arr($res);
57        $users_set = $this->users_set($ireadit_data);
58        return in_array($user, $users_set) && !in_array($user, array_column($readers, 'user'));
59    }
60
61    /**
62     * @param $user NULL means overview mode
63     * @return array|false
64     */
65    public function get_list($user=NULL) {
66        try {
67            /** @var \helper_plugin_ireadit_db $db_helper */
68            $db_helper = plugin_load('helper', 'ireadit_db');
69            $sqlite = $db_helper->getDB();
70        } catch (Exception $e) {
71            msg($e->getMessage(), -1);
72            return false;
73        }
74
75        $indexer = idx_get_indexer();
76        if ($user) {
77            $current_user_pages = $indexer->lookupKey('ireadit', $user);
78        } else {
79            $current_user_pages = $indexer->getPages('ireadit');
80        }
81
82        $pages = [];
83        foreach ($current_user_pages as $page) {
84            $last_change_date = p_get_metadata($page, 'last_change date');
85            $pages[$page] = [
86                'current_rev' => $last_change_date,
87                'last_read_rev' => NULL,
88                'timestamp' => NULL
89            ];
90        }
91        if ($user) {
92            $res = $sqlite->query('SELECT page, MAX(rev) as "rev", timestamp FROM ireadit WHERE user=? GROUP BY page',
93                $user);
94        } else {
95            $res = $sqlite->query('SELECT page, MAX(rev) as "rev", timestamp FROM ireadit GROUP BY page');
96        }
97
98        while ($row = $sqlite->res_fetch_assoc($res)) {
99            $page = $row['page'];
100            $rev = (int) $row['rev'];
101            $timestamp = $row['timestamp'];
102            if (isset($pages[$page])) {
103                $pages[$page]['last_read_rev'] = $rev;
104                $pages[$page]['timestamp'] = $timestamp;
105            }
106        }
107
108        // apply states to pages
109        foreach ($pages as &$page) {
110            if ($page['current_rev'] == $page['last_read_rev']) {
111                $page['state'] = 'read';
112            } elseif ($page['last_read_rev'] == NULL) {
113                $page['state'] = 'unread';
114            } else {
115                $page['state'] = 'outdated';
116            }
117        }
118        return $pages;
119    }
120}
121