xref: /plugin/combo/action/backlinkmutation.php (revision d899a2a62926ce6e7f78d85d882eb464caef0a95)
1c3437056SNickeau<?php
2c3437056SNickeau
37c479386Sgerardnicorequire_once(__DIR__ . '/../vendor/autoload.php');
47c479386Sgerardnico
54cadd4f8SNickeauuse ComboStrap\CacheLog;
6c3437056SNickeauuse ComboStrap\Event;
704fd306cSNickeauuse ComboStrap\ExceptionCompile;
87c479386Sgerardnicouse ComboStrap\ExceptionNotExists;
94cadd4f8SNickeauuse ComboStrap\LogUtility;
107c479386Sgerardnicouse ComboStrap\MarkupCacheDependencies;
1104fd306cSNickeauuse ComboStrap\MarkupPath;
1204fd306cSNickeauuse ComboStrap\MetadataMutation;
13c3437056SNickeauuse ComboStrap\PagePath;
14c3437056SNickeauuse ComboStrap\Reference;
15c3437056SNickeauuse ComboStrap\References;
16c3437056SNickeau
17c3437056SNickeau
18c3437056SNickeau/**
19c3437056SNickeau * Refresh the analytics when a backlink mutation occurs for a page
20c3437056SNickeau */
21c3437056SNickeauclass action_plugin_combo_backlinkmutation extends DokuWiki_Action_Plugin
22c3437056SNickeau{
23c3437056SNickeau
24c3437056SNickeau
254cadd4f8SNickeau    public const BACKLINK_MUTATION_EVENT_NAME = 'backlink_mutation';
26c3437056SNickeau
27c3437056SNickeau
28c3437056SNickeau    public function register(Doku_Event_Handler $controller)
29c3437056SNickeau    {
30c3437056SNickeau
31c3437056SNickeau
32c3437056SNickeau        /**
33c3437056SNickeau         * create the async event
34c3437056SNickeau         */
3504fd306cSNickeau        $controller->register_hook(MetadataMutation::PAGE_METADATA_MUTATION_EVENT, 'AFTER', $this, 'create_backlink_mutation', array());
36c3437056SNickeau
37c3437056SNickeau        /**
384cadd4f8SNickeau         * process the Async event
39c3437056SNickeau         */
40c3437056SNickeau        $controller->register_hook(self::BACKLINK_MUTATION_EVENT_NAME, 'AFTER', $this, 'handle_backlink_mutation');
41c3437056SNickeau
42c3437056SNickeau
43c3437056SNickeau    }
44c3437056SNickeau
4504fd306cSNickeau    /**
4604fd306cSNickeau     * @param Doku_Event $event
4704fd306cSNickeau     * @param $param
4804fd306cSNickeau     * @return void
4904fd306cSNickeau     */
50c3437056SNickeau    public function handle_backlink_mutation(Doku_Event $event, $param)
51c3437056SNickeau    {
52c3437056SNickeau
53c3437056SNickeau
54c3437056SNickeau        $data = $event->data;
55991743e6Sgerardnico        $pagePath = $data[PagePath::getPersistentName()] ?? null;
56991743e6Sgerardnico        if ($pagePath === null) {
57991743e6Sgerardnico            // https://github.com/ComboStrap/combo/issues/58
58991743e6Sgerardnico            LogUtility::internalError("The page path should be present");
59991743e6Sgerardnico            return;
60991743e6Sgerardnico        }
6104fd306cSNickeau        $reference = MarkupPath::createPageFromAbsoluteId($pagePath);
62c3437056SNickeau
6304fd306cSNickeau        if ($reference->isSlot()) {
644cadd4f8SNickeau            return;
654cadd4f8SNickeau        }
664cadd4f8SNickeau
674cadd4f8SNickeau        /**
684cadd4f8SNickeau         * Delete and recompute analytics
694cadd4f8SNickeau         */
7004fd306cSNickeau        try {
7104fd306cSNickeau            $analyticsDocument = $reference->fetchAnalyticsDocument();
7204fd306cSNickeau        } catch (ExceptionNotExists $e) {
7304fd306cSNickeau            return;
7404fd306cSNickeau        }
754cadd4f8SNickeau        CacheLog::deleteCacheIfExistsAndLog(
7604fd306cSNickeau            $analyticsDocument,
774cadd4f8SNickeau            self::BACKLINK_MUTATION_EVENT_NAME,
784cadd4f8SNickeau            "Backlink mutation"
794cadd4f8SNickeau        );
8004fd306cSNickeau
814cadd4f8SNickeau        try {
8204fd306cSNickeau            /**
8304fd306cSNickeau             * This is only to recompute the {@link \ComboStrap\Meta\Field\BacklinkCount backlinks metric} and
8404fd306cSNickeau             * {@link \ComboStrap\LowQualityPage low quality page metrics}
8504fd306cSNickeau             * TODO: when the derived meta are in the meta array and not in the {@link renderer_plugin_combo_analytics document},
8604fd306cSNickeau             *   we could just compute them there and modify it with a plus 1
8704fd306cSNickeau             */
884cadd4f8SNickeau            $reference->getDatabasePage()->replicateAnalytics();
8904fd306cSNickeau        } catch (ExceptionCompile $e) {
904cadd4f8SNickeau            LogUtility::msg("Backlink Mutation: Error while trying to replicate the analytics. Error: {$e->getMessage()}");
914cadd4f8SNickeau        }
924cadd4f8SNickeau
934cadd4f8SNickeau        /**
944cadd4f8SNickeau         * Render the (footer slot) if it has a backlink dependency
954cadd4f8SNickeau         */
9604fd306cSNickeau        MarkupCacheDependencies::reRenderSideSlotIfNeeded(
974cadd4f8SNickeau            $pagePath,
9804fd306cSNickeau            MarkupCacheDependencies::BACKLINKS_DEPENDENCY,
994cadd4f8SNickeau            self::BACKLINK_MUTATION_EVENT_NAME
1004cadd4f8SNickeau        );
1014cadd4f8SNickeau
102c3437056SNickeau
103c3437056SNickeau    }
104c3437056SNickeau
105c3437056SNickeau    /**
106c3437056SNickeau     */
107c3437056SNickeau    function create_backlink_mutation(Doku_Event $event, $params)
108c3437056SNickeau    {
109c3437056SNickeau
110c3437056SNickeau
111c3437056SNickeau        $data = $event->data;
112c3437056SNickeau
113c3437056SNickeau        /**
114c3437056SNickeau         * If this is not a mutation on references we return.
115c3437056SNickeau         */
11604fd306cSNickeau        if ($data[MetadataMutation::NAME_ATTRIBUTE] !== References::getPersistentName()) {
117c3437056SNickeau            return;
118c3437056SNickeau        };
119c3437056SNickeau
12004fd306cSNickeau        $actualReferenceDatas = $data[MetadataMutation::NEW_VALUE_ATTRIBUTE];
12104fd306cSNickeau        $oldReferenceDatas = $data[MetadataMutation::OLD_VALUE_ATTRIBUTE];
122c3437056SNickeau
12304fd306cSNickeau        /**
12404fd306cSNickeau         * Create an array of the actual reference with the key as path
12504fd306cSNickeau         */
12604fd306cSNickeau        $actualReferences = [];
12704fd306cSNickeau        if ($actualReferenceDatas !== null) {
12804fd306cSNickeau            foreach ($actualReferenceDatas as $actualReferenceData) {
12904fd306cSNickeau                $actualReferenceWikiPathString = $actualReferenceData[Reference::getPersistentName()];
13004fd306cSNickeau                $actualReferences[$actualReferenceWikiPathString] = $actualReferenceWikiPathString;
131c3437056SNickeau            }
132c3437056SNickeau        }
133c3437056SNickeau
13404fd306cSNickeau        if ($oldReferenceDatas !== null) {
13504fd306cSNickeau            foreach ($oldReferenceDatas as $oldReferenceData) {
13604fd306cSNickeau
137*d899a2a6Sgerardnico                $oldReferenceWikiPathString = $oldReferenceData[Reference::getPersistentName()] ?? null;
13804fd306cSNickeau
13904fd306cSNickeau                if (isset($actualReferences[$oldReferenceWikiPathString])) {
14004fd306cSNickeau                    unset($actualReferences[$oldReferenceWikiPathString]);
14104fd306cSNickeau                    continue;
14204fd306cSNickeau                }
14304fd306cSNickeau
14404fd306cSNickeau                /**
14504fd306cSNickeau                 * Deleted reference
14604fd306cSNickeau                 */
1474cadd4f8SNickeau                Event::createEvent(
1484cadd4f8SNickeau                    action_plugin_combo_backlinkmutation::BACKLINK_MUTATION_EVENT_NAME,
1494cadd4f8SNickeau                    [
15004fd306cSNickeau                        PagePath::getPersistentName() => $oldReferenceWikiPathString
1514cadd4f8SNickeau                    ]
1524cadd4f8SNickeau                );
15304fd306cSNickeau
154c3437056SNickeau            }
155c3437056SNickeau        }
15604fd306cSNickeau
15704fd306cSNickeau        /**
15804fd306cSNickeau         * The new references
15904fd306cSNickeau         */
16004fd306cSNickeau        foreach ($actualReferences as $newReference) {
1614cadd4f8SNickeau            Event::createEvent(
1624cadd4f8SNickeau                action_plugin_combo_backlinkmutation::BACKLINK_MUTATION_EVENT_NAME,
1634cadd4f8SNickeau                [PagePath::getPersistentName() => $newReference]);
164c3437056SNickeau        }
165c3437056SNickeau
166c3437056SNickeau
167c3437056SNickeau    }
168c3437056SNickeau
169c3437056SNickeau
170c3437056SNickeau}
171