xref: /plugin/approve/action/approve.php (revision 058bad721d91002b7cb5d96b9e887ae848487327)
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');
444474ed8aSSzymon Olewniczak        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_viewer');
454474ed8aSSzymon Olewniczak        $controller->register_hook('TPL_ACT_RENDER', 'BEFORE', $this, 'handle_display_banner');
4655f447f4SSzymon Olewniczak        $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'AFTER', $this, 'handle_pagesave_after');
471aeb2b4dSghi    }
481aeb2b4dSghi
494474ed8aSSzymon Olewniczak    /**
504474ed8aSSzymon Olewniczak     * @param Doku_Event $event
514474ed8aSSzymon Olewniczak     */
524474ed8aSSzymon Olewniczak    public function handle_diff_accept(Doku_Event $event) {
534474ed8aSSzymon Olewniczak		global $INFO;
544474ed8aSSzymon Olewniczak
551b552e87SSzymon Olewniczak		if (!$this->helper()->use_approve_here($INFO['id'])) return;
5650481663SSzymon Olewniczak
571aeb2b4dSghi		if ($event->data == 'diff' && isset($_GET['approve'])) {
584474ed8aSSzymon Olewniczak		    $href = wl($INFO['id'], ['approve' => 'approve']);
594474ed8aSSzymon Olewniczak			ptln('<a href="' . $href . '">'.$this->getLang('approve').'</a>');
601aeb2b4dSghi		}
6184047bdaSRuud
624474ed8aSSzymon Olewniczak        if ($this->getConf('ready_for_approval') && $event->data == 'diff' && isset($_GET['ready_for_approval'])) {
634474ed8aSSzymon Olewniczak            $href = wl($INFO['id'], ['ready_for_approval' => 'ready_for_approval']);
64*058bad72SSzymon Olewniczak            ptln('<a href="' . $href . '">'.$this->getLang('approve_ready').'</a>');
6584047bdaSRuud		}
661aeb2b4dSghi	}
671aeb2b4dSghi
684474ed8aSSzymon Olewniczak    /**
694474ed8aSSzymon Olewniczak     * @param Doku_Event $event
704474ed8aSSzymon Olewniczak     */
714474ed8aSSzymon Olewniczak    public function handle_showrev(Doku_Event $event) {
724474ed8aSSzymon Olewniczak        global $INFO;
731aeb2b4dSghi
741b552e87SSzymon Olewniczak        if (!$this->helper()->use_approve_here($INFO['id'])) return;
754474ed8aSSzymon Olewniczak
761b552e87SSzymon Olewniczak        $last_approved_rev = $this->helper()->find_last_approved($INFO['id']);
774474ed8aSSzymon Olewniczak		if ($last_approved_rev == $INFO['rev']) {
781aeb2b4dSghi            $event->preventDefault();
791aeb2b4dSghi        }
801aeb2b4dSghi	}
811aeb2b4dSghi
824474ed8aSSzymon Olewniczak	/**
834474ed8aSSzymon Olewniczak     * @param Doku_Event $event
844474ed8aSSzymon Olewniczak     */
854474ed8aSSzymon Olewniczak    public function handle_approve(Doku_Event $event) {
864474ed8aSSzymon Olewniczak		global $INFO;
874474ed8aSSzymon Olewniczak
881b552e87SSzymon Olewniczak        if (!$this->helper()->use_approve_here($INFO['id'])) return;
894474ed8aSSzymon Olewniczak
904474ed8aSSzymon Olewniczak		if ($event->data == 'show' && isset($_GET['approve']) &&
914474ed8aSSzymon Olewniczak            auth_quickaclcheck($INFO['id']) >= AUTH_DELETE) {
924474ed8aSSzymon Olewniczak
934474ed8aSSzymon Olewniczak		    $res = $this->sqlite()->query('SELECT MAX(version)+1 FROM revision
944474ed8aSSzymon Olewniczak                                            WHERE page=?', $INFO['id']);
954474ed8aSSzymon Olewniczak		    $next_version = $this->sqlite()->res2single($res);
964474ed8aSSzymon Olewniczak		    if (!$next_version) {
974474ed8aSSzymon Olewniczak                $next_version = 1;
9884047bdaSRuud            }
994474ed8aSSzymon Olewniczak		    //approved IS NULL prevents from overriding already approved page
1004474ed8aSSzymon Olewniczak		    $this->sqlite()->query('UPDATE revision
101c7d53eabSSzymon Olewniczak		                    SET approved=?, approved_by=?, version=?
1024474ed8aSSzymon Olewniczak                            WHERE page=? AND current=1 AND approved IS NULL',
103c7d53eabSSzymon Olewniczak                            date('c'), $INFO['client'], $next_version, $INFO['id']);
10484047bdaSRuud
1054474ed8aSSzymon Olewniczak			header('Location: ' . wl($INFO['id']));
1064474ed8aSSzymon Olewniczak		} elseif ($event->data == 'show' && isset($_GET['ready_for_approval']) &&
1074474ed8aSSzymon Olewniczak            auth_quickaclcheck($INFO['id']) >= AUTH_EDIT) {
10850481663SSzymon Olewniczak
109c7d53eabSSzymon Olewniczak            $this->sqlite()->query('UPDATE revision SET ready_for_approval=?, ready_for_approval_by=?
1104474ed8aSSzymon Olewniczak                            WHERE page=? AND current=1 AND ready_for_approval IS NULL',
111c7d53eabSSzymon Olewniczak                            date('c'), $INFO['client'], $INFO['id']);
11250481663SSzymon Olewniczak
1134474ed8aSSzymon Olewniczak            header('Location: ' . wl($INFO['id']));
1141aeb2b4dSghi		}
11538d03fbdSghi	}
11655f447f4SSzymon Olewniczak
1174474ed8aSSzymon Olewniczak    /**
1184474ed8aSSzymon Olewniczak     * Redirect to newest approved page for user that don't have EDIT permission.
1194474ed8aSSzymon Olewniczak     *
1204474ed8aSSzymon Olewniczak     * @param Doku_Event $event
1214474ed8aSSzymon Olewniczak     */
1224474ed8aSSzymon Olewniczak    public function handle_viewer(Doku_Event $event) {
1234474ed8aSSzymon Olewniczak        global $INFO;
1244474ed8aSSzymon Olewniczak
12538d03fbdSghi        if ($event->data != 'show') return;
1264474ed8aSSzymon Olewniczak        //apply only to current page
127c7d53eabSSzymon Olewniczak        if ($INFO['rev'] != 0) return;
1284474ed8aSSzymon Olewniczak        if (auth_quickaclcheck($INFO['id']) >= AUTH_EDIT) return;
1291b552e87SSzymon Olewniczak        if (!$this->helper()->use_approve_here($INFO['id'])) return;
1301aeb2b4dSghi
1311b552e87SSzymon Olewniczak        $last_approved_rev = $this->helper()->find_last_approved($INFO['id']);
13238d03fbdSghi        //no page is approved
1334474ed8aSSzymon Olewniczak        if (!$last_approved_rev) return;
13438d03fbdSghi
1354474ed8aSSzymon Olewniczak        $last_change_date = @filemtime(wikiFN($INFO['id']));
1364474ed8aSSzymon Olewniczak        //current page is approved
1374474ed8aSSzymon Olewniczak        if ($last_approved_rev == $last_change_date) return;
1384474ed8aSSzymon Olewniczak
1394474ed8aSSzymon Olewniczak	    header("Location: " . wl($INFO['id'], ['rev' => $last_approved_rev]));
1401aeb2b4dSghi	}
14155f447f4SSzymon Olewniczak
1424474ed8aSSzymon Olewniczak    /**
1434474ed8aSSzymon Olewniczak     * @param Doku_Event $event
1444474ed8aSSzymon Olewniczak     */
1454474ed8aSSzymon Olewniczak    public function handle_display_banner(Doku_Event $event) {
1464474ed8aSSzymon Olewniczak		global $INFO;
147bab76148SSzymon Olewniczak
1481aeb2b4dSghi        if ($event->data != 'show') return;
1491aeb2b4dSghi        if (!$INFO['exists']) return;
150c7d53eabSSzymon Olewniczak        if (!$this->helper()->use_approve_here($INFO['id'], $maintainer)) return;
1511aeb2b4dSghi
1524474ed8aSSzymon Olewniczak//        $last_change_date = p_get_metadata($INFO['id'], 'last_change date');
1534474ed8aSSzymon Olewniczak        $last_change_date = @filemtime(wikiFN($INFO['id']));
1544474ed8aSSzymon Olewniczak        $rev = !$INFO['rev'] ? $last_change_date : $INFO['rev'];
1551aeb2b4dSghi
15655f447f4SSzymon Olewniczak
157c7d53eabSSzymon Olewniczak        $res = $this->sqlite()->query('SELECT ready_for_approval, ready_for_approval_by,
158c7d53eabSSzymon Olewniczak                                        approved, approved_by, version
1594474ed8aSSzymon Olewniczak                                FROM revision
1604474ed8aSSzymon Olewniczak                                WHERE page=? AND rev=?', $INFO['id'], $rev);
1614474ed8aSSzymon Olewniczak
1624474ed8aSSzymon Olewniczak        $approve = $this->sqlite()->res_fetch_assoc($res);
1634474ed8aSSzymon Olewniczak
1644474ed8aSSzymon Olewniczak		$classes = [];
16555f447f4SSzymon Olewniczak		if ($this->getConf('prettyprint')) {
16655f447f4SSzymon Olewniczak		    $classes[] = 'plugin__approve_noprint';
16755f447f4SSzymon Olewniczak        }
16855f447f4SSzymon Olewniczak
1694474ed8aSSzymon Olewniczak        if ($approve['approved']) {
17055f447f4SSzymon Olewniczak		    $classes[] = 'plugin__approve_green';
1714474ed8aSSzymon Olewniczak		} elseif ($this->getConf('ready_for_approval') && $approve['ready_for_approval']) {
172bab76148SSzymon Olewniczak		    $classes[] = 'plugin__approve_ready';
17355f447f4SSzymon Olewniczak        } else {
17455f447f4SSzymon Olewniczak            $classes[] = 'plugin__approve_red';
17555f447f4SSzymon Olewniczak        }
17655f447f4SSzymon Olewniczak
17755f447f4SSzymon Olewniczak		ptln('<div id="plugin__approve" class="' . implode(' ', $classes) . '">');
1781aeb2b4dSghi
179c7d53eabSSzymon Olewniczak//		tpl_pageinfo();
180c7d53eabSSzymon Olewniczak//		ptln(' | ');
181af3e3cd8SSzymon Olewniczak
1824474ed8aSSzymon Olewniczak		if ($approve['approved']) {
183c7d53eabSSzymon Olewniczak			ptln('<strong>'.$this->getLang('approved').'</strong>');
184c7d53eabSSzymon Olewniczak            ptln(' ' . dformat(strtotime($approve['approved'])));
185d8ede060SSzymon Olewniczak            ptln(' ' . $this->getLang('by') . ' ' . userlink($approve['approved_by'], true));
186c7d53eabSSzymon Olewniczak            ptln(' (' . $this->getLang('version') .  ': ' . $approve['version'] . ')');
1874474ed8aSSzymon Olewniczak
1884474ed8aSSzymon Olewniczak			//not the newest page
1894474ed8aSSzymon Olewniczak			if ($rev != $last_change_date) {
1904474ed8aSSzymon Olewniczak                $res = $this->sqlite()->query('SELECT rev, current FROM revision
1914474ed8aSSzymon Olewniczak                                WHERE page=? AND approved IS NOT NULL
1924474ed8aSSzymon Olewniczak                                ORDER BY rev DESC LIMIT 1', $INFO['id']);
1934474ed8aSSzymon Olewniczak
194c7d53eabSSzymon Olewniczak                $last_approve = $this->sqlite()->res_fetch_assoc($res);
1954474ed8aSSzymon Olewniczak
1964474ed8aSSzymon Olewniczak			    //we can see drafts
1974474ed8aSSzymon Olewniczak                if (auth_quickaclcheck($INFO['id']) >= AUTH_EDIT) {
1984474ed8aSSzymon Olewniczak                    ptln('<a href="' . wl($INFO['id']) . '">');
199c7d53eabSSzymon Olewniczak                    ptln($this->getLang($last_approve['current'] ? 'newest_approved' : 'newest_draft'));
2001aeb2b4dSghi                    ptln('</a>');
201c7d53eabSSzymon Olewniczak                //we cannot see link to draft but there is some newer approved version
202c7d53eabSSzymon Olewniczak                } elseif ($last_approve['rev'] != $rev) {
2034474ed8aSSzymon Olewniczak                    $urlParameters = [];
204c7d53eabSSzymon Olewniczak                    if (!$last_approve['current']) {
205c7d53eabSSzymon Olewniczak                        $urlParameters['rev'] = $last_approve['rev'];
2064474ed8aSSzymon Olewniczak                    }
2074474ed8aSSzymon Olewniczak                    ptln('<a href="' . wl($INFO['id'], $urlParameters) . '">');
2081aeb2b4dSghi                    ptln($this->getLang('newest_approved'));
2091aeb2b4dSghi                    ptln('</a>');
2101aeb2b4dSghi                }
2114474ed8aSSzymon Olewniczak            }
2124474ed8aSSzymon Olewniczak
2131aeb2b4dSghi		} else {
2144474ed8aSSzymon Olewniczak		    if ($this->getConf('ready_for_approval') && $approve['ready_for_approval']) {
215c7d53eabSSzymon Olewniczak				ptln('<strong>'.$this->getLang('marked_approve_ready').'</strong>');
216c7d53eabSSzymon Olewniczak                ptln(' ' . dformat(strtotime($approve['ready_for_approval'])));
217d8ede060SSzymon Olewniczak                ptln(' ' . $this->getLang('by') . ' ' . userlink($approve['ready_for_approval_by'], true));
218c7d53eabSSzymon Olewniczak			} else {
219c7d53eabSSzymon Olewniczak                ptln('<strong>'.$this->getLang('draft').'</strong>');
22084047bdaSRuud            }
22184047bdaSRuud
22284047bdaSRuud
2234474ed8aSSzymon Olewniczak            $res = $this->sqlite()->query('SELECT rev, current FROM revision
2244474ed8aSSzymon Olewniczak                            WHERE page=? AND approved IS NOT NULL
2254474ed8aSSzymon Olewniczak                            ORDER BY rev DESC LIMIT 1', $INFO['id']);
2264474ed8aSSzymon Olewniczak
227c7d53eabSSzymon Olewniczak            $last_approve = $this->sqlite()->res_fetch_assoc($res);
2284474ed8aSSzymon Olewniczak
2294474ed8aSSzymon Olewniczak
2304474ed8aSSzymon Olewniczak            //not exists approve for current page
231c7d53eabSSzymon Olewniczak			if (!$last_approve) {
2324474ed8aSSzymon Olewniczak                //not the newest page
2334474ed8aSSzymon Olewniczak                if ($rev != $last_change_date) {
2344474ed8aSSzymon Olewniczak				    ptln('<a href="'.wl($INFO['id']).'">');
235274d699aSghi                    ptln($this->getLang('newest_draft'));
236274d699aSghi				    ptln('</a>');
237274d699aSghi				}
238274d699aSghi			} else {
2394474ed8aSSzymon Olewniczak                $urlParameters = [];
240c7d53eabSSzymon Olewniczak                if (!$last_approve['current']) {
241c7d53eabSSzymon Olewniczak                    $urlParameters['rev'] = $last_approve['rev'];
2424474ed8aSSzymon Olewniczak                }
2434474ed8aSSzymon Olewniczak                ptln('<a href="' . wl($INFO['id'], $urlParameters) . '">');
2441aeb2b4dSghi                ptln($this->getLang('newest_approved'));
2451aeb2b4dSghi				ptln('</a>');
2461aeb2b4dSghi			}
2471aeb2b4dSghi
2484474ed8aSSzymon Olewniczak			//we are in current page
2494474ed8aSSzymon Olewniczak			if ($rev == $last_change_date) {
2504474ed8aSSzymon Olewniczak
251c7d53eabSSzymon Olewniczak			    //compare with the last approved page or 0 if there is no approved versions
2524474ed8aSSzymon Olewniczak                $last_approved_rev = 0;
253c7d53eabSSzymon Olewniczak                if (isset($last_approve['rev'])) {
254c7d53eabSSzymon Olewniczak                    $last_approved_rev = $last_approve['rev'];
2554474ed8aSSzymon Olewniczak                }
2564474ed8aSSzymon Olewniczak
2574474ed8aSSzymon Olewniczak                if ($this->getConf('ready_for_approval') &&
2584474ed8aSSzymon Olewniczak                    auth_quickaclcheck($INFO['id']) >= AUTH_EDIT &&
2594474ed8aSSzymon Olewniczak                    !$approve['ready_for_approval']) {
2604474ed8aSSzymon Olewniczak
2614474ed8aSSzymon Olewniczak                    $urlParameters = [
2624474ed8aSSzymon Olewniczak                        'rev' => $last_approved_rev,
2634474ed8aSSzymon Olewniczak                        'do' => 'diff',
2644474ed8aSSzymon Olewniczak                        'ready_for_approval' => 'ready_for_approval'
2654474ed8aSSzymon Olewniczak                    ];
2664474ed8aSSzymon Olewniczak                    ptln(' | <a href="'.wl($INFO['id'], $urlParameters).'">');
26784047bdaSRuud                    ptln($this->getLang('approve_ready'));
26884047bdaSRuud                    ptln('</a>');
26984047bdaSRuud                }
27084047bdaSRuud
2714474ed8aSSzymon Olewniczak                if (auth_quickaclcheck($INFO['id']) >= AUTH_DELETE) {
2724474ed8aSSzymon Olewniczak
2734474ed8aSSzymon Olewniczak                    $urlParameters = [
2744474ed8aSSzymon Olewniczak                        'rev' => $last_approved_rev,
2754474ed8aSSzymon Olewniczak                        'do' => 'diff',
2764474ed8aSSzymon Olewniczak                        'approve' => 'approve'
2774474ed8aSSzymon Olewniczak                    ];
2784474ed8aSSzymon Olewniczak                    ptln(' | <a href="'.wl($INFO['id'], $urlParameters).'">');
2791aeb2b4dSghi                    ptln($this->getLang('approve'));
2801aeb2b4dSghi                    ptln('</a>');
2811aeb2b4dSghi                }
282c7d53eabSSzymon Olewniczak            }
283c7d53eabSSzymon Olewniczak		}
28484047bdaSRuud
285c7d53eabSSzymon Olewniczak		if ($maintainer) {
286d8ede060SSzymon Olewniczak            ptln(' | ' . $this->getLang('maintainer') . ': ' . userlink($maintainer, true));
2874474ed8aSSzymon Olewniczak        }
288c7d53eabSSzymon Olewniczak
2891aeb2b4dSghi		ptln('</div>');
2901aeb2b4dSghi	}
2911aeb2b4dSghi
292af3e3cd8SSzymon Olewniczak    /**
2934474ed8aSSzymon Olewniczak     * @return bool|string
2944474ed8aSSzymon Olewniczak     */
295b1ff32a1SSzymon Olewniczak    protected function lastRevisionHasntApprovalData($id) {
2964474ed8aSSzymon Olewniczak        $res = $this->sqlite()->query('SELECT rev FROM revision
2974474ed8aSSzymon Olewniczak                                        WHERE page=?
2984474ed8aSSzymon Olewniczak                                          AND current=1
2994474ed8aSSzymon Olewniczak                                          AND approved IS NULL
3004474ed8aSSzymon Olewniczak                                          AND ready_for_approval IS NULL', $id);
3014474ed8aSSzymon Olewniczak
3024474ed8aSSzymon Olewniczak        return $this->sqlite()->res2single($res);
3034474ed8aSSzymon Olewniczak    }
3044474ed8aSSzymon Olewniczak
3054474ed8aSSzymon Olewniczak    /**
3064474ed8aSSzymon Olewniczak     *
3074474ed8aSSzymon Olewniczak     * @param Doku_Event $event  event object by reference
3084474ed8aSSzymon Olewniczak     * @return void
3094474ed8aSSzymon Olewniczak     */
3104474ed8aSSzymon Olewniczak    public function handle_pagesave_after(Doku_Event $event) {
3111b552e87SSzymon Olewniczak        //no content was changed
3124474ed8aSSzymon Olewniczak        if (!$event->data['contentChanged']) return;
3134474ed8aSSzymon Olewniczak
3144474ed8aSSzymon Olewniczak        $changeType = $event->data['changeType'];
3154474ed8aSSzymon Olewniczak        if ($changeType == DOKU_CHANGE_TYPE_REVERT) {
3164474ed8aSSzymon Olewniczak            if ($event->data['oldContent'] == '') {
3174474ed8aSSzymon Olewniczak                $changeType = DOKU_CHANGE_TYPE_CREATE;
3184474ed8aSSzymon Olewniczak            } else {
3194474ed8aSSzymon Olewniczak                $changeType = DOKU_CHANGE_TYPE_EDIT;
3204474ed8aSSzymon Olewniczak            }
3214474ed8aSSzymon Olewniczak        }
3224474ed8aSSzymon Olewniczak
3234474ed8aSSzymon Olewniczak        $id = $event->data['id'];
3244474ed8aSSzymon Olewniczak        switch ($changeType) {
3254474ed8aSSzymon Olewniczak            case DOKU_CHANGE_TYPE_EDIT:
3264474ed8aSSzymon Olewniczak            case DOKU_CHANGE_TYPE_REVERT:
3274474ed8aSSzymon Olewniczak            case DOKU_CHANGE_TYPE_MINOR_EDIT:
3284474ed8aSSzymon Olewniczak                $last_change_date = $event->data['newRevision'];
3294474ed8aSSzymon Olewniczak
3304474ed8aSSzymon Olewniczak                //if the current page has approved or ready_for_approval -- keep it
331b1ff32a1SSzymon Olewniczak                $rev = $this->lastRevisionHasntApprovalData($id);
332b1ff32a1SSzymon Olewniczak                if ($rev) {
3334474ed8aSSzymon Olewniczak                    $this->sqlite()->query('UPDATE revision SET rev=? WHERE page=? AND rev=?',
334b1ff32a1SSzymon Olewniczak                        $last_change_date, $id, $rev);
3354474ed8aSSzymon Olewniczak
3364474ed8aSSzymon Olewniczak                } else {
3374474ed8aSSzymon Olewniczak                    //keep previous record
3384474ed8aSSzymon Olewniczak                    $this->sqlite()->query('UPDATE revision SET current=0
3394474ed8aSSzymon Olewniczak                                            WHERE page=?
3404474ed8aSSzymon Olewniczak                                            AND current=1', $id);
3414474ed8aSSzymon Olewniczak
3424474ed8aSSzymon Olewniczak                    $this->sqlite()->storeEntry('revision', [
3434474ed8aSSzymon Olewniczak                        'page' => $id,
3444474ed8aSSzymon Olewniczak                        'rev' => $last_change_date,
3454474ed8aSSzymon Olewniczak                        'current' => 1
3464474ed8aSSzymon Olewniczak                    ]);
3474474ed8aSSzymon Olewniczak                }
3484474ed8aSSzymon Olewniczak                break;
3494474ed8aSSzymon Olewniczak            case DOKU_CHANGE_TYPE_DELETE:
3504474ed8aSSzymon Olewniczak                //delete information about availability of a page but keep the history
3514474ed8aSSzymon Olewniczak                $this->sqlite()->query('DELETE FROM page WHERE page=?', $id);
3524474ed8aSSzymon Olewniczak
3534474ed8aSSzymon Olewniczak                //delete revision if no information about approvals
354b1ff32a1SSzymon Olewniczak                $rev = $this->lastRevisionHasntApprovalData($id);
355b1ff32a1SSzymon Olewniczak                if ($rev) {
356b1ff32a1SSzymon Olewniczak                    $this->sqlite()->query('DELETE FROM revision WHERE page=? AND rev=?', $id, $rev);
3574474ed8aSSzymon Olewniczak                } else {
358b1ff32a1SSzymon Olewniczak                    $this->sqlite()->query('UPDATE revision SET current=0 WHERE page=? AND current=1', $id);
3594474ed8aSSzymon Olewniczak                }
3604474ed8aSSzymon Olewniczak
3614474ed8aSSzymon Olewniczak                break;
3624474ed8aSSzymon Olewniczak            case DOKU_CHANGE_TYPE_CREATE:
363b1ff32a1SSzymon Olewniczak                if ($this->helper()->isPageAssigned($id, $newMaintainer)) {
364b1ff32a1SSzymon Olewniczak                    $data = [
3651b552e87SSzymon Olewniczak                        'page' => $id,
366b1ff32a1SSzymon Olewniczak                        'hidden' => $this->helper()->in_hidden_namespace($id) ? '1' : '0'
367b1ff32a1SSzymon Olewniczak                    ];
368b1ff32a1SSzymon Olewniczak                    if (!blank($newMaintainer)) {
369b1ff32a1SSzymon Olewniczak                        $data['maintainer'] = $newMaintainer;
370b1ff32a1SSzymon Olewniczak                    }
371b1ff32a1SSzymon Olewniczak                    $this->sqlite()->storeEntry('page', $data);
372b1ff32a1SSzymon Olewniczak                }
3734474ed8aSSzymon Olewniczak
374b1ff32a1SSzymon Olewniczak                //store revision
375b1ff32a1SSzymon Olewniczak                $last_change_date = $event->data['newRevision'];
3764474ed8aSSzymon Olewniczak                $this->sqlite()->storeEntry('revision', [
3774474ed8aSSzymon Olewniczak                    'page' => $id,
3784474ed8aSSzymon Olewniczak                    'rev' => $last_change_date,
3794474ed8aSSzymon Olewniczak                    'current' => 1
3804474ed8aSSzymon Olewniczak                ]);
3814474ed8aSSzymon Olewniczak                break;
3824474ed8aSSzymon Olewniczak        }
3834474ed8aSSzymon Olewniczak    }
3841aeb2b4dSghi}
385