xref: /plugin/combo/action/backlinkmutation.php (revision 7c479386882d4bae439b6a2a93a5e472a77a9162)
1c3437056SNickeau<?php
2c3437056SNickeau
3*7c479386Sgerardnicorequire_once(__DIR__ . '/../vendor/autoload.php');
4*7c479386Sgerardnico
54cadd4f8SNickeauuse ComboStrap\CacheLog;
6c3437056SNickeauuse ComboStrap\Event;
704fd306cSNickeauuse ComboStrap\ExceptionCompile;
8*7c479386Sgerardnicouse ComboStrap\ExceptionNotExists;
94cadd4f8SNickeauuse ComboStrap\LogUtility;
10*7c479386Sgerardnicouse 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;
55c3437056SNickeau        $pagePath = $data[PagePath::getPersistentName()];
5604fd306cSNickeau        $reference = MarkupPath::createPageFromAbsoluteId($pagePath);
57c3437056SNickeau
5804fd306cSNickeau        if ($reference->isSlot()) {
594cadd4f8SNickeau            return;
604cadd4f8SNickeau        }
614cadd4f8SNickeau
624cadd4f8SNickeau        /**
634cadd4f8SNickeau         * Delete and recompute analytics
644cadd4f8SNickeau         */
6504fd306cSNickeau        try {
6604fd306cSNickeau            $analyticsDocument = $reference->fetchAnalyticsDocument();
6704fd306cSNickeau        } catch (ExceptionNotExists $e) {
6804fd306cSNickeau            return;
6904fd306cSNickeau        }
704cadd4f8SNickeau        CacheLog::deleteCacheIfExistsAndLog(
7104fd306cSNickeau            $analyticsDocument,
724cadd4f8SNickeau            self::BACKLINK_MUTATION_EVENT_NAME,
734cadd4f8SNickeau            "Backlink mutation"
744cadd4f8SNickeau        );
7504fd306cSNickeau
764cadd4f8SNickeau        try {
7704fd306cSNickeau            /**
7804fd306cSNickeau             * This is only to recompute the {@link \ComboStrap\Meta\Field\BacklinkCount backlinks metric} and
7904fd306cSNickeau             * {@link \ComboStrap\LowQualityPage low quality page metrics}
8004fd306cSNickeau             * TODO: when the derived meta are in the meta array and not in the {@link renderer_plugin_combo_analytics document},
8104fd306cSNickeau             *   we could just compute them there and modify it with a plus 1
8204fd306cSNickeau             */
834cadd4f8SNickeau            $reference->getDatabasePage()->replicateAnalytics();
8404fd306cSNickeau        } catch (ExceptionCompile $e) {
854cadd4f8SNickeau            LogUtility::msg("Backlink Mutation: Error while trying to replicate the analytics. Error: {$e->getMessage()}");
864cadd4f8SNickeau        }
874cadd4f8SNickeau
884cadd4f8SNickeau        /**
894cadd4f8SNickeau         * Render the (footer slot) if it has a backlink dependency
904cadd4f8SNickeau         */
9104fd306cSNickeau        MarkupCacheDependencies::reRenderSideSlotIfNeeded(
924cadd4f8SNickeau            $pagePath,
9304fd306cSNickeau            MarkupCacheDependencies::BACKLINKS_DEPENDENCY,
944cadd4f8SNickeau            self::BACKLINK_MUTATION_EVENT_NAME
954cadd4f8SNickeau        );
964cadd4f8SNickeau
97c3437056SNickeau
98c3437056SNickeau    }
99c3437056SNickeau
100c3437056SNickeau    /**
101c3437056SNickeau     */
102c3437056SNickeau    function create_backlink_mutation(Doku_Event $event, $params)
103c3437056SNickeau    {
104c3437056SNickeau
105c3437056SNickeau
106c3437056SNickeau        $data = $event->data;
107c3437056SNickeau
108c3437056SNickeau        /**
109c3437056SNickeau         * If this is not a mutation on references we return.
110c3437056SNickeau         */
11104fd306cSNickeau        if ($data[MetadataMutation::NAME_ATTRIBUTE] !== References::getPersistentName()) {
112c3437056SNickeau            return;
113c3437056SNickeau        };
114c3437056SNickeau
11504fd306cSNickeau        $actualReferenceDatas = $data[MetadataMutation::NEW_VALUE_ATTRIBUTE];
11604fd306cSNickeau        $oldReferenceDatas = $data[MetadataMutation::OLD_VALUE_ATTRIBUTE];
117c3437056SNickeau
11804fd306cSNickeau        /**
11904fd306cSNickeau         * Create an array of the actual reference with the key as path
12004fd306cSNickeau         */
12104fd306cSNickeau        $actualReferences = [];
12204fd306cSNickeau        if ($actualReferenceDatas !== null) {
12304fd306cSNickeau            foreach ($actualReferenceDatas as $actualReferenceData) {
12404fd306cSNickeau                $actualReferenceWikiPathString = $actualReferenceData[Reference::getPersistentName()];
12504fd306cSNickeau                $actualReferences[$actualReferenceWikiPathString] = $actualReferenceWikiPathString;
126c3437056SNickeau            }
127c3437056SNickeau        }
128c3437056SNickeau
12904fd306cSNickeau        if ($oldReferenceDatas !== null) {
13004fd306cSNickeau            foreach ($oldReferenceDatas as $oldReferenceData) {
13104fd306cSNickeau
13204fd306cSNickeau                $oldReferenceWikiPathString = $oldReferenceData[Reference::getPersistentName()];
13304fd306cSNickeau
13404fd306cSNickeau                if (isset($actualReferences[$oldReferenceWikiPathString])) {
13504fd306cSNickeau                    unset($actualReferences[$oldReferenceWikiPathString]);
13604fd306cSNickeau                    continue;
13704fd306cSNickeau                }
13804fd306cSNickeau
13904fd306cSNickeau                /**
14004fd306cSNickeau                 * Deleted reference
14104fd306cSNickeau                 */
1424cadd4f8SNickeau                Event::createEvent(
1434cadd4f8SNickeau                    action_plugin_combo_backlinkmutation::BACKLINK_MUTATION_EVENT_NAME,
1444cadd4f8SNickeau                    [
14504fd306cSNickeau                        PagePath::getPersistentName() => $oldReferenceWikiPathString
1464cadd4f8SNickeau                    ]
1474cadd4f8SNickeau                );
14804fd306cSNickeau
149c3437056SNickeau            }
150c3437056SNickeau        }
15104fd306cSNickeau
15204fd306cSNickeau        /**
15304fd306cSNickeau         * The new references
15404fd306cSNickeau         */
15504fd306cSNickeau        foreach ($actualReferences as $newReference) {
1564cadd4f8SNickeau            Event::createEvent(
1574cadd4f8SNickeau                action_plugin_combo_backlinkmutation::BACKLINK_MUTATION_EVENT_NAME,
1584cadd4f8SNickeau                [PagePath::getPersistentName() => $newReference]);
159c3437056SNickeau        }
160c3437056SNickeau
161c3437056SNickeau
162c3437056SNickeau    }
163c3437056SNickeau
164c3437056SNickeau
165c3437056SNickeau}
166c3437056SNickeau
167c3437056SNickeau
168c3437056SNickeau
169