xref: /plugin/combo/action/backlinkmutation.php (revision 4cadd4f8c541149bdda95f080e38a6d4e3a640ca)
1c3437056SNickeau<?php
2c3437056SNickeau
3*4cadd4f8SNickeauuse ComboStrap\CacheDependencies;
4*4cadd4f8SNickeauuse ComboStrap\CacheLog;
5*4cadd4f8SNickeauuse ComboStrap\CacheManager;
6c3437056SNickeauuse ComboStrap\Event;
7c3437056SNickeauuse ComboStrap\ExceptionCombo;
8c3437056SNickeauuse ComboStrap\FileSystems;
9*4cadd4f8SNickeauuse ComboStrap\LogUtility;
10c3437056SNickeauuse ComboStrap\MetadataDokuWikiStore;
11c3437056SNickeauuse ComboStrap\Page;
12c3437056SNickeauuse ComboStrap\PagePath;
13c3437056SNickeauuse ComboStrap\Reference;
14c3437056SNickeauuse ComboStrap\References;
15c3437056SNickeau
16c3437056SNickeau
17c3437056SNickeaurequire_once(__DIR__ . '/../ComboStrap/PluginUtility.php');
18c3437056SNickeau
19c3437056SNickeau/**
20c3437056SNickeau * Refresh the analytics when a backlink mutation occurs for a page
21c3437056SNickeau */
22c3437056SNickeauclass action_plugin_combo_backlinkmutation extends DokuWiki_Action_Plugin
23c3437056SNickeau{
24c3437056SNickeau
25c3437056SNickeau
26*4cadd4f8SNickeau    public const BACKLINK_MUTATION_EVENT_NAME = 'backlink_mutation';
27c3437056SNickeau
28c3437056SNickeau
29c3437056SNickeau    public function register(Doku_Event_Handler $controller)
30c3437056SNickeau    {
31c3437056SNickeau
32c3437056SNickeau
33c3437056SNickeau        /**
34c3437056SNickeau         * create the async event
35c3437056SNickeau         */
36c3437056SNickeau        $controller->register_hook(MetadataDokuWikiStore::PAGE_METADATA_MUTATION_EVENT, 'AFTER', $this, 'create_backlink_mutation', array());
37c3437056SNickeau
38c3437056SNickeau        /**
39*4cadd4f8SNickeau         * process the Async event
40c3437056SNickeau         */
41c3437056SNickeau        $controller->register_hook(self::BACKLINK_MUTATION_EVENT_NAME, 'AFTER', $this, 'handle_backlink_mutation');
42c3437056SNickeau
43c3437056SNickeau
44c3437056SNickeau    }
45c3437056SNickeau
46c3437056SNickeau
47c3437056SNickeau    public function handle_backlink_mutation(Doku_Event $event, $param)
48c3437056SNickeau    {
49c3437056SNickeau
50c3437056SNickeau
51c3437056SNickeau        $data = $event->data;
52c3437056SNickeau        $pagePath = $data[PagePath::getPersistentName()];
53*4cadd4f8SNickeau        $reference = Page::createPageFromQualifiedPath($pagePath);
54c3437056SNickeau
55*4cadd4f8SNickeau        if ($reference->isSecondarySlot()) {
56*4cadd4f8SNickeau            return;
57*4cadd4f8SNickeau        }
58*4cadd4f8SNickeau
59*4cadd4f8SNickeau        /**
60*4cadd4f8SNickeau         * Delete and recompute analytics
61*4cadd4f8SNickeau         */
62*4cadd4f8SNickeau        CacheLog::deleteCacheIfExistsAndLog(
63*4cadd4f8SNickeau            $reference->getAnalyticsDocument(),
64*4cadd4f8SNickeau            self::BACKLINK_MUTATION_EVENT_NAME,
65*4cadd4f8SNickeau            "Backlink mutation"
66*4cadd4f8SNickeau        );
67*4cadd4f8SNickeau        try {
68*4cadd4f8SNickeau            $reference->getDatabasePage()->replicateAnalytics();
69*4cadd4f8SNickeau        } catch (ExceptionCombo $e) {
70*4cadd4f8SNickeau            LogUtility::msg("Backlink Mutation: Error while trying to replicate the analytics. Error: {$e->getMessage()}");
71*4cadd4f8SNickeau        }
72*4cadd4f8SNickeau
73*4cadd4f8SNickeau        /**
74*4cadd4f8SNickeau         * Render the (footer slot) if it has a backlink dependency
75*4cadd4f8SNickeau         */
76*4cadd4f8SNickeau        CacheDependencies::reRenderSecondarySlotsIfNeeded(
77*4cadd4f8SNickeau            $pagePath,
78*4cadd4f8SNickeau            CacheDependencies::BACKLINKS_DEPENDENCY,
79*4cadd4f8SNickeau            self::BACKLINK_MUTATION_EVENT_NAME
80*4cadd4f8SNickeau        );
81*4cadd4f8SNickeau
82c3437056SNickeau
83c3437056SNickeau
84c3437056SNickeau    }
85c3437056SNickeau
86c3437056SNickeau    /**
87c3437056SNickeau     */
88c3437056SNickeau    function create_backlink_mutation(Doku_Event $event, $params)
89c3437056SNickeau    {
90c3437056SNickeau
91c3437056SNickeau
92c3437056SNickeau        $data = $event->data;
93c3437056SNickeau
94c3437056SNickeau        /**
95c3437056SNickeau         * If this is not a mutation on references we return.
96c3437056SNickeau         */
97c3437056SNickeau        if ($data["name"] !== References::getPersistentName()) {
98c3437056SNickeau            return;
99c3437056SNickeau        };
100c3437056SNickeau
101c3437056SNickeau        $newRows = $data["new_value"];
102c3437056SNickeau        $oldRows = $data["old_value"];
103c3437056SNickeau
104c3437056SNickeau        $afterReferences = [];
105c3437056SNickeau        if ($newRows !== null) {
106c3437056SNickeau            foreach ($newRows as $rowNewValue) {
107c3437056SNickeau                $reference = $rowNewValue[Reference::getPersistentName()];
108c3437056SNickeau                $afterReferences[$reference] = $reference;
109c3437056SNickeau            }
110c3437056SNickeau        }
111c3437056SNickeau
112c3437056SNickeau        if ($oldRows !== null) {
113c3437056SNickeau            foreach ($oldRows as $oldRow) {
114c3437056SNickeau                $beforeReference = $oldRow[Reference::getPersistentName()];
115c3437056SNickeau                if (isset($afterReferences[$beforeReference])) {
116c3437056SNickeau                    unset($afterReferences[$beforeReference]);
117c3437056SNickeau                } else {
118*4cadd4f8SNickeau                    Event::createEvent(
119*4cadd4f8SNickeau                        action_plugin_combo_backlinkmutation::BACKLINK_MUTATION_EVENT_NAME,
120*4cadd4f8SNickeau                        [
121*4cadd4f8SNickeau                            PagePath::getPersistentName() => $beforeReference
122*4cadd4f8SNickeau                        ]
123*4cadd4f8SNickeau                    );
124c3437056SNickeau                }
125c3437056SNickeau            }
126c3437056SNickeau        }
127c3437056SNickeau        foreach ($afterReferences as $newReference) {
128*4cadd4f8SNickeau            Event::createEvent(
129*4cadd4f8SNickeau                action_plugin_combo_backlinkmutation::BACKLINK_MUTATION_EVENT_NAME,
130*4cadd4f8SNickeau                [PagePath::getPersistentName() => $newReference]);
131c3437056SNickeau        }
132c3437056SNickeau
133c3437056SNickeau
134c3437056SNickeau    }
135c3437056SNickeau
136c3437056SNickeau
137c3437056SNickeau}
138c3437056SNickeau
139c3437056SNickeau
140c3437056SNickeau
141