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