xref: /plugin/approve/action/approve.php (revision de24d3c4c42d78435b03fbe7f25bba620c69debc)
11aeb2b4dSghi<?php
21aeb2b4dSghi
31aeb2b4dSghiif(!defined('DOKU_INC')) die();
41aeb2b4dSghi
51aeb2b4dSghiclass action_plugin_approve_approve extends DokuWiki_Action_Plugin {
61aeb2b4dSghi
74474ed8aSSzymon Olewniczak    /** @var helper_plugin_sqlite */
84474ed8aSSzymon Olewniczak    protected $sqlite;
9bab76148SSzymon Olewniczak
101b552e87SSzymon Olewniczak    /** @var helper_plugin_approve */
111b552e87SSzymon Olewniczak    protected $helper;
121b552e87SSzymon Olewniczak
134474ed8aSSzymon Olewniczak    /**
144474ed8aSSzymon Olewniczak     * @return helper_plugin_sqlite
154474ed8aSSzymon Olewniczak     */
161b552e87SSzymon Olewniczak    protected function sqlite() {
174474ed8aSSzymon Olewniczak        if (!$this->sqlite) {
181b552e87SSzymon Olewniczak            /** @var helper_plugin_approve_db $db_helper */
194474ed8aSSzymon Olewniczak            $db_helper = plugin_load('helper', 'approve_db');
204474ed8aSSzymon Olewniczak            $this->sqlite = $db_helper->getDB();
214474ed8aSSzymon Olewniczak        }
224474ed8aSSzymon Olewniczak        return $this->sqlite;
2350481663SSzymon Olewniczak    }
2450481663SSzymon Olewniczak
254474ed8aSSzymon Olewniczak    /**
261b552e87SSzymon Olewniczak     * @return helper_plugin_approve
271b552e87SSzymon Olewniczak     */
281b552e87SSzymon Olewniczak    protected function helper() {
291b552e87SSzymon Olewniczak        if (!$this->helper) {
301b552e87SSzymon Olewniczak            $helper = plugin_load('helper', 'approve');
311b552e87SSzymon Olewniczak            $this->helper = $helper;
321b552e87SSzymon Olewniczak        }
331b552e87SSzymon Olewniczak        return $this->helper;
341b552e87SSzymon Olewniczak    }
351b552e87SSzymon Olewniczak
361b552e87SSzymon Olewniczak
371b552e87SSzymon Olewniczak    /**
384474ed8aSSzymon Olewniczak     * @param Doku_Event_Handler $controller
394474ed8aSSzymon Olewniczak     */
404474ed8aSSzymon Olewniczak    public function register(Doku_Event_Handler $controller) {
414474ed8aSSzymon Olewniczak        $controller->register_hook('TPL_ACT_RENDER', 'AFTER', $this, 'handle_diff_accept');
424474ed8aSSzymon Olewniczak        $controller->register_hook('HTML_SHOWREV_OUTPUT', 'BEFORE', $this, 'handle_showrev');
434474ed8aSSzymon Olewniczak        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_approve');
4407b13373SSzymon Olewniczak        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_mark_ready_for_approval');
454474ed8aSSzymon Olewniczak        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_viewer');
464474ed8aSSzymon Olewniczak        $controller->register_hook('TPL_ACT_RENDER', 'BEFORE', $this, 'handle_display_banner');
4755f447f4SSzymon Olewniczak        $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'AFTER', $this, 'handle_pagesave_after');
481aeb2b4dSghi    }
491aeb2b4dSghi
504474ed8aSSzymon Olewniczak    /**
514474ed8aSSzymon Olewniczak     * @param Doku_Event $event
524474ed8aSSzymon Olewniczak     */
534474ed8aSSzymon Olewniczak    public function handle_diff_accept(Doku_Event $event) {
544474ed8aSSzymon Olewniczak		global $INFO;
554474ed8aSSzymon Olewniczak
561b552e87SSzymon Olewniczak		if (!$this->helper()->use_approve_here($INFO['id'])) return;
5750481663SSzymon Olewniczak
581aeb2b4dSghi		if ($event->data == 'diff' && isset($_GET['approve'])) {
594474ed8aSSzymon Olewniczak		    $href = wl($INFO['id'], ['approve' => 'approve']);
604474ed8aSSzymon Olewniczak			ptln('<a href="' . $href . '">'.$this->getLang('approve').'</a>');
611aeb2b4dSghi		}
6284047bdaSRuud
634474ed8aSSzymon Olewniczak        if ($this->getConf('ready_for_approval') && $event->data == 'diff' && isset($_GET['ready_for_approval'])) {
644474ed8aSSzymon Olewniczak            $href = wl($INFO['id'], ['ready_for_approval' => 'ready_for_approval']);
65058bad72SSzymon Olewniczak            ptln('<a href="' . $href . '">'.$this->getLang('approve_ready').'</a>');
6684047bdaSRuud		}
671aeb2b4dSghi	}
681aeb2b4dSghi
694474ed8aSSzymon Olewniczak    /**
704474ed8aSSzymon Olewniczak     * @param Doku_Event $event
714474ed8aSSzymon Olewniczak     */
724474ed8aSSzymon Olewniczak    public function handle_showrev(Doku_Event $event) {
734474ed8aSSzymon Olewniczak        global $INFO;
741aeb2b4dSghi
751b552e87SSzymon Olewniczak        if (!$this->helper()->use_approve_here($INFO['id'])) return;
764474ed8aSSzymon Olewniczak
771b552e87SSzymon Olewniczak        $last_approved_rev = $this->helper()->find_last_approved($INFO['id']);
784474ed8aSSzymon Olewniczak		if ($last_approved_rev == $INFO['rev']) {
791aeb2b4dSghi            $event->preventDefault();
801aeb2b4dSghi        }
811aeb2b4dSghi	}
821aeb2b4dSghi
834474ed8aSSzymon Olewniczak	/**
844474ed8aSSzymon Olewniczak     * @param Doku_Event $event
854474ed8aSSzymon Olewniczak     */
864474ed8aSSzymon Olewniczak    public function handle_approve(Doku_Event $event) {
874474ed8aSSzymon Olewniczak		global $INFO;
884474ed8aSSzymon Olewniczak
8907b13373SSzymon Olewniczak        if ($event->data != 'show') return;
9007b13373SSzymon Olewniczak        if (!isset($_GET['approve'])) return;
9107b13373SSzymon Olewniczak        if (!$this->helper()->use_approve_here($INFO['id'], $approver)) return;
9207b13373SSzymon Olewniczak        if (!$this->helper()->client_can_approve($INFO['id'], $approver)) return;
934474ed8aSSzymon Olewniczak
944474ed8aSSzymon Olewniczak        $res = $this->sqlite()->query('SELECT MAX(version)+1 FROM revision
954474ed8aSSzymon Olewniczak                                        WHERE page=?', $INFO['id']);
964474ed8aSSzymon Olewniczak        $next_version = $this->sqlite()->res2single($res);
974474ed8aSSzymon Olewniczak        if (!$next_version) {
984474ed8aSSzymon Olewniczak            $next_version = 1;
9984047bdaSRuud        }
1004474ed8aSSzymon Olewniczak        //approved IS NULL prevents from overriding already approved page
1014474ed8aSSzymon Olewniczak        $this->sqlite()->query('UPDATE revision
102c7d53eabSSzymon Olewniczak                        SET approved=?, approved_by=?, version=?
1034474ed8aSSzymon Olewniczak                        WHERE page=? AND current=1 AND approved IS NULL',
104c7d53eabSSzymon Olewniczak                        date('c'), $INFO['client'], $next_version, $INFO['id']);
10584047bdaSRuud
1064474ed8aSSzymon Olewniczak        header('Location: ' . wl($INFO['id']));
10707b13373SSzymon Olewniczak	}
10807b13373SSzymon Olewniczak
10907b13373SSzymon Olewniczak    /**
11007b13373SSzymon Olewniczak     * @param Doku_Event $event
11107b13373SSzymon Olewniczak     */
11207b13373SSzymon Olewniczak    public function handle_mark_ready_for_approval(Doku_Event $event) {
11307b13373SSzymon Olewniczak        global $INFO;
11407b13373SSzymon Olewniczak
11507b13373SSzymon Olewniczak        if ($event->data != 'show') return;
11607b13373SSzymon Olewniczak        if (!isset($_GET['ready_for_approval'])) return;
11707b13373SSzymon Olewniczak        if (!$this->helper()->use_approve_here($INFO['id'])) return;
11807b13373SSzymon Olewniczak        if (!$this->helper()->client_can_mark_ready_for_approval($INFO['id'])) return;
11950481663SSzymon Olewniczak
120c7d53eabSSzymon Olewniczak        $this->sqlite()->query('UPDATE revision SET ready_for_approval=?, ready_for_approval_by=?
1214474ed8aSSzymon Olewniczak                                WHERE page=? AND current=1 AND ready_for_approval IS NULL',
122c7d53eabSSzymon Olewniczak        date('c'), $INFO['client'], $INFO['id']);
12350481663SSzymon Olewniczak
1244474ed8aSSzymon Olewniczak        header('Location: ' . wl($INFO['id']));
1251aeb2b4dSghi    }
12655f447f4SSzymon Olewniczak
1274474ed8aSSzymon Olewniczak    /**
1284474ed8aSSzymon Olewniczak     * Redirect to newest approved page for user that don't have EDIT permission.
1294474ed8aSSzymon Olewniczak     *
1304474ed8aSSzymon Olewniczak     * @param Doku_Event $event
1314474ed8aSSzymon Olewniczak     */
1324474ed8aSSzymon Olewniczak    public function handle_viewer(Doku_Event $event) {
1334474ed8aSSzymon Olewniczak        global $INFO;
1344474ed8aSSzymon Olewniczak
13538d03fbdSghi        if ($event->data != 'show') return;
1364474ed8aSSzymon Olewniczak        //apply only to current page
137c7d53eabSSzymon Olewniczak        if ($INFO['rev'] != 0) return;
13807b13373SSzymon Olewniczak        if (!$this->helper()->use_approve_here($INFO['id'], $approver)) return;
13907b13373SSzymon Olewniczak        if ($this->helper()->client_can_see_drafts($INFO['id'], $approver)) return;
1401aeb2b4dSghi
1411b552e87SSzymon Olewniczak        $last_approved_rev = $this->helper()->find_last_approved($INFO['id']);
14238d03fbdSghi        //no page is approved
1434474ed8aSSzymon Olewniczak        if (!$last_approved_rev) return;
14438d03fbdSghi
1454474ed8aSSzymon Olewniczak        $last_change_date = @filemtime(wikiFN($INFO['id']));
1464474ed8aSSzymon Olewniczak        //current page is approved
1474474ed8aSSzymon Olewniczak        if ($last_approved_rev == $last_change_date) return;
1484474ed8aSSzymon Olewniczak
149*de24d3c4SSzymon Olewniczak	    header("Location: " . wl($INFO['id'], ['rev' => $last_approved_rev], false, '&'));
1501aeb2b4dSghi	}
15155f447f4SSzymon Olewniczak
1524474ed8aSSzymon Olewniczak    /**
1534474ed8aSSzymon Olewniczak     * @param Doku_Event $event
1544474ed8aSSzymon Olewniczak     */
1554474ed8aSSzymon Olewniczak    public function handle_display_banner(Doku_Event $event) {
1564474ed8aSSzymon Olewniczak		global $INFO;
157bab76148SSzymon Olewniczak
1581aeb2b4dSghi        if ($event->data != 'show') return;
1591aeb2b4dSghi        if (!$INFO['exists']) return;
1602ce523c6SSzymon Olewniczak        if (!$this->helper()->use_approve_here($INFO['id'], $approver)) return;
1611aeb2b4dSghi
1624474ed8aSSzymon Olewniczak//        $last_change_date = p_get_metadata($INFO['id'], 'last_change date');
1634474ed8aSSzymon Olewniczak        $last_change_date = @filemtime(wikiFN($INFO['id']));
1644474ed8aSSzymon Olewniczak        $rev = !$INFO['rev'] ? $last_change_date : $INFO['rev'];
1651aeb2b4dSghi
16655f447f4SSzymon Olewniczak
167c7d53eabSSzymon Olewniczak        $res = $this->sqlite()->query('SELECT ready_for_approval, ready_for_approval_by,
168c7d53eabSSzymon Olewniczak                                        approved, approved_by, version
1694474ed8aSSzymon Olewniczak                                FROM revision
1704474ed8aSSzymon Olewniczak                                WHERE page=? AND rev=?', $INFO['id'], $rev);
1714474ed8aSSzymon Olewniczak
1724474ed8aSSzymon Olewniczak        $approve = $this->sqlite()->res_fetch_assoc($res);
1734474ed8aSSzymon Olewniczak
1744474ed8aSSzymon Olewniczak		$classes = [];
17555f447f4SSzymon Olewniczak		if ($this->getConf('prettyprint')) {
17655f447f4SSzymon Olewniczak		    $classes[] = 'plugin__approve_noprint';
17755f447f4SSzymon Olewniczak        }
17855f447f4SSzymon Olewniczak
1794474ed8aSSzymon Olewniczak        if ($approve['approved']) {
18055f447f4SSzymon Olewniczak		    $classes[] = 'plugin__approve_green';
1814474ed8aSSzymon Olewniczak		} elseif ($this->getConf('ready_for_approval') && $approve['ready_for_approval']) {
182bab76148SSzymon Olewniczak		    $classes[] = 'plugin__approve_ready';
18355f447f4SSzymon Olewniczak        } else {
18455f447f4SSzymon Olewniczak            $classes[] = 'plugin__approve_red';
18555f447f4SSzymon Olewniczak        }
18655f447f4SSzymon Olewniczak
18755f447f4SSzymon Olewniczak		ptln('<div id="plugin__approve" class="' . implode(' ', $classes) . '">');
1881aeb2b4dSghi
189c7d53eabSSzymon Olewniczak//		tpl_pageinfo();
190c7d53eabSSzymon Olewniczak//		ptln(' | ');
191af3e3cd8SSzymon Olewniczak
1924474ed8aSSzymon Olewniczak		if ($approve['approved']) {
193c7d53eabSSzymon Olewniczak			ptln('<strong>'.$this->getLang('approved').'</strong>');
194c7d53eabSSzymon Olewniczak            ptln(' ' . dformat(strtotime($approve['approved'])));
195d8ede060SSzymon Olewniczak            ptln(' ' . $this->getLang('by') . ' ' . userlink($approve['approved_by'], true));
196c7d53eabSSzymon Olewniczak            ptln(' (' . $this->getLang('version') .  ': ' . $approve['version'] . ')');
1974474ed8aSSzymon Olewniczak
1984474ed8aSSzymon Olewniczak			//not the newest page
1994474ed8aSSzymon Olewniczak			if ($rev != $last_change_date) {
2004474ed8aSSzymon Olewniczak                $res = $this->sqlite()->query('SELECT rev, current FROM revision
2014474ed8aSSzymon Olewniczak                                WHERE page=? AND approved IS NOT NULL
2024474ed8aSSzymon Olewniczak                                ORDER BY rev DESC LIMIT 1', $INFO['id']);
2034474ed8aSSzymon Olewniczak
204c7d53eabSSzymon Olewniczak                $last_approve = $this->sqlite()->res_fetch_assoc($res);
2054474ed8aSSzymon Olewniczak
2064474ed8aSSzymon Olewniczak			    //we can see drafts
20707b13373SSzymon Olewniczak                if ($this->helper()->client_can_see_drafts($INFO['id'], $approver)) {
2084474ed8aSSzymon Olewniczak                    ptln('<a href="' . wl($INFO['id']) . '">');
209c7d53eabSSzymon Olewniczak                    ptln($this->getLang($last_approve['current'] ? 'newest_approved' : 'newest_draft'));
2101aeb2b4dSghi                    ptln('</a>');
211c7d53eabSSzymon Olewniczak                //we cannot see link to draft but there is some newer approved version
212c7d53eabSSzymon Olewniczak                } elseif ($last_approve['rev'] != $rev) {
2134474ed8aSSzymon Olewniczak                    $urlParameters = [];
214c7d53eabSSzymon Olewniczak                    if (!$last_approve['current']) {
215c7d53eabSSzymon Olewniczak                        $urlParameters['rev'] = $last_approve['rev'];
2164474ed8aSSzymon Olewniczak                    }
2174474ed8aSSzymon Olewniczak                    ptln('<a href="' . wl($INFO['id'], $urlParameters) . '">');
2181aeb2b4dSghi                    ptln($this->getLang('newest_approved'));
2191aeb2b4dSghi                    ptln('</a>');
2201aeb2b4dSghi                }
2214474ed8aSSzymon Olewniczak            }
2224474ed8aSSzymon Olewniczak
2231aeb2b4dSghi		} else {
2244474ed8aSSzymon Olewniczak		    if ($this->getConf('ready_for_approval') && $approve['ready_for_approval']) {
225c7d53eabSSzymon Olewniczak				ptln('<strong>'.$this->getLang('marked_approve_ready').'</strong>');
226c7d53eabSSzymon Olewniczak                ptln(' ' . dformat(strtotime($approve['ready_for_approval'])));
227d8ede060SSzymon Olewniczak                ptln(' ' . $this->getLang('by') . ' ' . userlink($approve['ready_for_approval_by'], true));
228c7d53eabSSzymon Olewniczak			} else {
229c7d53eabSSzymon Olewniczak                ptln('<strong>'.$this->getLang('draft').'</strong>');
23084047bdaSRuud            }
23184047bdaSRuud
23284047bdaSRuud
2334474ed8aSSzymon Olewniczak            $res = $this->sqlite()->query('SELECT rev, current FROM revision
2344474ed8aSSzymon Olewniczak                            WHERE page=? AND approved IS NOT NULL
2354474ed8aSSzymon Olewniczak                            ORDER BY rev DESC LIMIT 1', $INFO['id']);
2364474ed8aSSzymon Olewniczak
237c7d53eabSSzymon Olewniczak            $last_approve = $this->sqlite()->res_fetch_assoc($res);
2384474ed8aSSzymon Olewniczak
2394474ed8aSSzymon Olewniczak
2404474ed8aSSzymon Olewniczak            //not exists approve for current page
241c7d53eabSSzymon Olewniczak			if (!$last_approve) {
2424474ed8aSSzymon Olewniczak                //not the newest page
2434474ed8aSSzymon Olewniczak                if ($rev != $last_change_date) {
2444474ed8aSSzymon Olewniczak				    ptln('<a href="'.wl($INFO['id']).'">');
245274d699aSghi                    ptln($this->getLang('newest_draft'));
246274d699aSghi				    ptln('</a>');
247274d699aSghi				}
248274d699aSghi			} else {
2494474ed8aSSzymon Olewniczak                $urlParameters = [];
250c7d53eabSSzymon Olewniczak                if (!$last_approve['current']) {
251c7d53eabSSzymon Olewniczak                    $urlParameters['rev'] = $last_approve['rev'];
2524474ed8aSSzymon Olewniczak                }
2534474ed8aSSzymon Olewniczak                ptln('<a href="' . wl($INFO['id'], $urlParameters) . '">');
2541aeb2b4dSghi                ptln($this->getLang('newest_approved'));
2551aeb2b4dSghi				ptln('</a>');
2561aeb2b4dSghi			}
2571aeb2b4dSghi
2584474ed8aSSzymon Olewniczak			//we are in current page
2594474ed8aSSzymon Olewniczak			if ($rev == $last_change_date) {
2604474ed8aSSzymon Olewniczak
261c7d53eabSSzymon Olewniczak			    //compare with the last approved page or 0 if there is no approved versions
2624474ed8aSSzymon Olewniczak                $last_approved_rev = 0;
263c7d53eabSSzymon Olewniczak                if (isset($last_approve['rev'])) {
264c7d53eabSSzymon Olewniczak                    $last_approved_rev = $last_approve['rev'];
2654474ed8aSSzymon Olewniczak                }
2664474ed8aSSzymon Olewniczak
2674474ed8aSSzymon Olewniczak                if ($this->getConf('ready_for_approval') &&
26807b13373SSzymon Olewniczak                    $this->helper()->client_can_mark_ready_for_approval($INFO['id']) &&
2694474ed8aSSzymon Olewniczak                    !$approve['ready_for_approval']) {
2704474ed8aSSzymon Olewniczak
2714474ed8aSSzymon Olewniczak                    $urlParameters = [
2724474ed8aSSzymon Olewniczak                        'rev' => $last_approved_rev,
2734474ed8aSSzymon Olewniczak                        'do' => 'diff',
2744474ed8aSSzymon Olewniczak                        'ready_for_approval' => 'ready_for_approval'
2754474ed8aSSzymon Olewniczak                    ];
2764474ed8aSSzymon Olewniczak                    ptln(' | <a href="'.wl($INFO['id'], $urlParameters).'">');
27784047bdaSRuud                    ptln($this->getLang('approve_ready'));
27884047bdaSRuud                    ptln('</a>');
27984047bdaSRuud                }
28084047bdaSRuud
28107b13373SSzymon Olewniczak                if ($this->helper()->client_can_approve($INFO['id'], $approver)) {
2824474ed8aSSzymon Olewniczak
2834474ed8aSSzymon Olewniczak                    $urlParameters = [
2844474ed8aSSzymon Olewniczak                        'rev' => $last_approved_rev,
2854474ed8aSSzymon Olewniczak                        'do' => 'diff',
2864474ed8aSSzymon Olewniczak                        'approve' => 'approve'
2874474ed8aSSzymon Olewniczak                    ];
2884474ed8aSSzymon Olewniczak                    ptln(' | <a href="'.wl($INFO['id'], $urlParameters).'">');
2891aeb2b4dSghi                    ptln($this->getLang('approve'));
2901aeb2b4dSghi                    ptln('</a>');
2911aeb2b4dSghi                }
292c7d53eabSSzymon Olewniczak            }
293c7d53eabSSzymon Olewniczak		}
29484047bdaSRuud
2952ce523c6SSzymon Olewniczak		if ($approver) {
2962ce523c6SSzymon Olewniczak            ptln(' | ' . $this->getLang('approver') . ': ' . userlink($approver, true));
2974474ed8aSSzymon Olewniczak        }
298c7d53eabSSzymon Olewniczak
2991aeb2b4dSghi		ptln('</div>');
3001aeb2b4dSghi	}
3011aeb2b4dSghi
302af3e3cd8SSzymon Olewniczak    /**
3034474ed8aSSzymon Olewniczak     * @return bool|string
3044474ed8aSSzymon Olewniczak     */
305b1ff32a1SSzymon Olewniczak    protected function lastRevisionHasntApprovalData($id) {
3064474ed8aSSzymon Olewniczak        $res = $this->sqlite()->query('SELECT rev FROM revision
3074474ed8aSSzymon Olewniczak                                        WHERE page=?
3084474ed8aSSzymon Olewniczak                                          AND current=1
3094474ed8aSSzymon Olewniczak                                          AND approved IS NULL
3104474ed8aSSzymon Olewniczak                                          AND ready_for_approval IS NULL', $id);
3114474ed8aSSzymon Olewniczak
3124474ed8aSSzymon Olewniczak        return $this->sqlite()->res2single($res);
3134474ed8aSSzymon Olewniczak    }
3144474ed8aSSzymon Olewniczak
3154474ed8aSSzymon Olewniczak    /**
3164474ed8aSSzymon Olewniczak     *
3174474ed8aSSzymon Olewniczak     * @param Doku_Event $event  event object by reference
3184474ed8aSSzymon Olewniczak     * @return void
3194474ed8aSSzymon Olewniczak     */
3204474ed8aSSzymon Olewniczak    public function handle_pagesave_after(Doku_Event $event) {
3211b552e87SSzymon Olewniczak        //no content was changed
3224474ed8aSSzymon Olewniczak        if (!$event->data['contentChanged']) return;
3234474ed8aSSzymon Olewniczak
3244474ed8aSSzymon Olewniczak        $changeType = $event->data['changeType'];
3254474ed8aSSzymon Olewniczak        if ($changeType == DOKU_CHANGE_TYPE_REVERT) {
3264474ed8aSSzymon Olewniczak            if ($event->data['oldContent'] == '') {
3274474ed8aSSzymon Olewniczak                $changeType = DOKU_CHANGE_TYPE_CREATE;
3284474ed8aSSzymon Olewniczak            } else {
3294474ed8aSSzymon Olewniczak                $changeType = DOKU_CHANGE_TYPE_EDIT;
3304474ed8aSSzymon Olewniczak            }
3314474ed8aSSzymon Olewniczak        }
3324474ed8aSSzymon Olewniczak
3334474ed8aSSzymon Olewniczak        $id = $event->data['id'];
3344474ed8aSSzymon Olewniczak        switch ($changeType) {
3354474ed8aSSzymon Olewniczak            case DOKU_CHANGE_TYPE_EDIT:
3364474ed8aSSzymon Olewniczak            case DOKU_CHANGE_TYPE_REVERT:
3374474ed8aSSzymon Olewniczak            case DOKU_CHANGE_TYPE_MINOR_EDIT:
3384474ed8aSSzymon Olewniczak                $last_change_date = $event->data['newRevision'];
3394474ed8aSSzymon Olewniczak
3404474ed8aSSzymon Olewniczak                //if the current page has approved or ready_for_approval -- keep it
341b1ff32a1SSzymon Olewniczak                $rev = $this->lastRevisionHasntApprovalData($id);
342b1ff32a1SSzymon Olewniczak                if ($rev) {
3434474ed8aSSzymon Olewniczak                    $this->sqlite()->query('UPDATE revision SET rev=? WHERE page=? AND rev=?',
344b1ff32a1SSzymon Olewniczak                        $last_change_date, $id, $rev);
3454474ed8aSSzymon Olewniczak
3464474ed8aSSzymon Olewniczak                } else {
3474474ed8aSSzymon Olewniczak                    //keep previous record
3484474ed8aSSzymon Olewniczak                    $this->sqlite()->query('UPDATE revision SET current=0
3494474ed8aSSzymon Olewniczak                                            WHERE page=?
3504474ed8aSSzymon Olewniczak                                            AND current=1', $id);
3514474ed8aSSzymon Olewniczak
3524474ed8aSSzymon Olewniczak                    $this->sqlite()->storeEntry('revision', [
3534474ed8aSSzymon Olewniczak                        'page' => $id,
3544474ed8aSSzymon Olewniczak                        'rev' => $last_change_date,
3554474ed8aSSzymon Olewniczak                        'current' => 1
3564474ed8aSSzymon Olewniczak                    ]);
3574474ed8aSSzymon Olewniczak                }
3584474ed8aSSzymon Olewniczak                break;
3594474ed8aSSzymon Olewniczak            case DOKU_CHANGE_TYPE_DELETE:
3604474ed8aSSzymon Olewniczak                //delete information about availability of a page but keep the history
3614474ed8aSSzymon Olewniczak                $this->sqlite()->query('DELETE FROM page WHERE page=?', $id);
3624474ed8aSSzymon Olewniczak
3634474ed8aSSzymon Olewniczak                //delete revision if no information about approvals
364b1ff32a1SSzymon Olewniczak                $rev = $this->lastRevisionHasntApprovalData($id);
365b1ff32a1SSzymon Olewniczak                if ($rev) {
366b1ff32a1SSzymon Olewniczak                    $this->sqlite()->query('DELETE FROM revision WHERE page=? AND rev=?', $id, $rev);
3674474ed8aSSzymon Olewniczak                } else {
368b1ff32a1SSzymon Olewniczak                    $this->sqlite()->query('UPDATE revision SET current=0 WHERE page=? AND current=1', $id);
3694474ed8aSSzymon Olewniczak                }
3704474ed8aSSzymon Olewniczak
3714474ed8aSSzymon Olewniczak                break;
3724474ed8aSSzymon Olewniczak            case DOKU_CHANGE_TYPE_CREATE:
3732ce523c6SSzymon Olewniczak                if ($this->helper()->isPageAssigned($id, $newApprover)) {
374b1ff32a1SSzymon Olewniczak                    $data = [
3751b552e87SSzymon Olewniczak                        'page' => $id,
376b1ff32a1SSzymon Olewniczak                        'hidden' => $this->helper()->in_hidden_namespace($id) ? '1' : '0'
377b1ff32a1SSzymon Olewniczak                    ];
3782ce523c6SSzymon Olewniczak                    if (!blank($newApprover)) {
3792ce523c6SSzymon Olewniczak                        $data['approver'] = $newApprover;
380b1ff32a1SSzymon Olewniczak                    }
381b1ff32a1SSzymon Olewniczak                    $this->sqlite()->storeEntry('page', $data);
382b1ff32a1SSzymon Olewniczak                }
3834474ed8aSSzymon Olewniczak
384b1ff32a1SSzymon Olewniczak                //store revision
385b1ff32a1SSzymon Olewniczak                $last_change_date = $event->data['newRevision'];
3864474ed8aSSzymon Olewniczak                $this->sqlite()->storeEntry('revision', [
3874474ed8aSSzymon Olewniczak                    'page' => $id,
3884474ed8aSSzymon Olewniczak                    'rev' => $last_change_date,
3894474ed8aSSzymon Olewniczak                    'current' => 1
3904474ed8aSSzymon Olewniczak                ]);
3914474ed8aSSzymon Olewniczak                break;
3924474ed8aSSzymon Olewniczak        }
3934474ed8aSSzymon Olewniczak    }
3941aeb2b4dSghi}
395