xref: /plugin/combo/action/backlinkmutation.php (revision c3437056399326d621a01da73b649707fbb0ae69)
1*c3437056SNickeau<?php
2*c3437056SNickeau
3*c3437056SNickeauuse ComboStrap\Event;
4*c3437056SNickeauuse ComboStrap\ExceptionCombo;
5*c3437056SNickeauuse ComboStrap\FileSystems;
6*c3437056SNickeauuse ComboStrap\MetadataDokuWikiStore;
7*c3437056SNickeauuse ComboStrap\Page;
8*c3437056SNickeauuse ComboStrap\PagePath;
9*c3437056SNickeauuse ComboStrap\Reference;
10*c3437056SNickeauuse ComboStrap\References;
11*c3437056SNickeau
12*c3437056SNickeau
13*c3437056SNickeaurequire_once(__DIR__ . '/../ComboStrap/PluginUtility.php');
14*c3437056SNickeau
15*c3437056SNickeau/**
16*c3437056SNickeau * Refresh the analytics when a backlink mutation occurs for a page
17*c3437056SNickeau */
18*c3437056SNickeauclass action_plugin_combo_backlinkmutation extends DokuWiki_Action_Plugin
19*c3437056SNickeau{
20*c3437056SNickeau
21*c3437056SNickeau
22*c3437056SNickeau    public const BACKLINK_MUTATION_EVENT_NAME = 'BACKLINK_MUTATION';
23*c3437056SNickeau
24*c3437056SNickeau
25*c3437056SNickeau    public function register(Doku_Event_Handler $controller)
26*c3437056SNickeau    {
27*c3437056SNickeau
28*c3437056SNickeau
29*c3437056SNickeau        /**
30*c3437056SNickeau         * create the async event
31*c3437056SNickeau         */
32*c3437056SNickeau        $controller->register_hook(MetadataDokuWikiStore::PAGE_METADATA_MUTATION_EVENT, 'AFTER', $this, 'create_backlink_mutation', array());
33*c3437056SNickeau
34*c3437056SNickeau        /**
35*c3437056SNickeau         * process the async event
36*c3437056SNickeau         */
37*c3437056SNickeau        $controller->register_hook(self::BACKLINK_MUTATION_EVENT_NAME, 'AFTER', $this, 'handle_backlink_mutation');
38*c3437056SNickeau
39*c3437056SNickeau
40*c3437056SNickeau    }
41*c3437056SNickeau
42*c3437056SNickeau
43*c3437056SNickeau    public function handle_backlink_mutation(Doku_Event $event, $param)
44*c3437056SNickeau    {
45*c3437056SNickeau
46*c3437056SNickeau
47*c3437056SNickeau        $data = $event->data;
48*c3437056SNickeau        $pagePath = $data[PagePath::getPersistentName()];
49*c3437056SNickeau        $page = Page::createPageFromQualifiedPath($pagePath);
50*c3437056SNickeau
51*c3437056SNickeau        // delete analytics
52*c3437056SNickeau        FileSystems::deleteIfExists($page->getAnalyticsDocument()->getCachePath());
53*c3437056SNickeau        $page->getDatabasePage()->replicateAnalytics();
54*c3437056SNickeau
55*c3437056SNickeau
56*c3437056SNickeau    }
57*c3437056SNickeau
58*c3437056SNickeau    /**
59*c3437056SNickeau     */
60*c3437056SNickeau    function create_backlink_mutation(Doku_Event $event, $params)
61*c3437056SNickeau    {
62*c3437056SNickeau
63*c3437056SNickeau
64*c3437056SNickeau        $data = $event->data;
65*c3437056SNickeau
66*c3437056SNickeau        /**
67*c3437056SNickeau         * If this is not a mutation on references we return.
68*c3437056SNickeau         */
69*c3437056SNickeau        if ($data["name"] !== References::getPersistentName()) {
70*c3437056SNickeau            return;
71*c3437056SNickeau        };
72*c3437056SNickeau
73*c3437056SNickeau        $newRows = $data["new_value"];
74*c3437056SNickeau        $oldRows = $data["old_value"];
75*c3437056SNickeau
76*c3437056SNickeau        $afterReferences = [];
77*c3437056SNickeau        if ($newRows !== null) {
78*c3437056SNickeau            foreach ($newRows as $rowNewValue) {
79*c3437056SNickeau                $reference = $rowNewValue[Reference::getPersistentName()];
80*c3437056SNickeau                $afterReferences[$reference] = $reference;
81*c3437056SNickeau            }
82*c3437056SNickeau        }
83*c3437056SNickeau
84*c3437056SNickeau        if ($oldRows !== null) {
85*c3437056SNickeau            foreach ($oldRows as $oldRow) {
86*c3437056SNickeau                $beforeReference = $oldRow[Reference::getPersistentName()];
87*c3437056SNickeau                if (isset($afterReferences[$beforeReference])) {
88*c3437056SNickeau                    unset($afterReferences[$beforeReference]);
89*c3437056SNickeau                } else {
90*c3437056SNickeau                    Event::createEvent(action_plugin_combo_backlinkmutation::BACKLINK_MUTATION_EVENT_NAME, [PagePath::getPersistentName() => $beforeReference]);
91*c3437056SNickeau                    /**
92*c3437056SNickeau                     * Delete the analytics
93*c3437056SNickeau                     */
94*c3437056SNickeau                    FileSystems::deleteIfExists(Page::createPageFromQualifiedPath($beforeReference)->getAnalyticsDocument()->getCachePath());
95*c3437056SNickeau                }
96*c3437056SNickeau            }
97*c3437056SNickeau        }
98*c3437056SNickeau        foreach ($afterReferences as $newReference) {
99*c3437056SNickeau            Page::createPageFromQualifiedPath($newReference)
100*c3437056SNickeau                ->getAnalyticsDocument()
101*c3437056SNickeau                ->deleteIfExists();
102*c3437056SNickeau            Event::createEvent(action_plugin_combo_backlinkmutation::BACKLINK_MUTATION_EVENT_NAME, [PagePath::getPersistentName() => $newReference]);
103*c3437056SNickeau            /**
104*c3437056SNickeau             * Delete the analytics
105*c3437056SNickeau             */
106*c3437056SNickeau            FileSystems::deleteIfExists(Page::createPageFromQualifiedPath($newReference)->getAnalyticsDocument()->getCachePath());
107*c3437056SNickeau        }
108*c3437056SNickeau
109*c3437056SNickeau
110*c3437056SNickeau    }
111*c3437056SNickeau
112*c3437056SNickeau
113*c3437056SNickeau}
114*c3437056SNickeau
115*c3437056SNickeau
116*c3437056SNickeau
117