xref: /plugin/combo/action/backlinkmutation.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1c3437056SNickeau<?php
2c3437056SNickeau
3*04fd306cSNickeauuse ComboStrap\ExceptionNotExists;
4*04fd306cSNickeauuse ComboStrap\MarkupCacheDependencies;
54cadd4f8SNickeauuse ComboStrap\CacheLog;
64cadd4f8SNickeauuse ComboStrap\CacheManager;
7c3437056SNickeauuse ComboStrap\Event;
8*04fd306cSNickeauuse ComboStrap\ExceptionCompile;
9c3437056SNickeauuse ComboStrap\FileSystems;
104cadd4f8SNickeauuse ComboStrap\LogUtility;
11*04fd306cSNickeauuse ComboStrap\Meta\Store\MetadataDokuWikiStore;
12*04fd306cSNickeauuse ComboStrap\MarkupPath;
13*04fd306cSNickeauuse ComboStrap\MetadataMutation;
14c3437056SNickeauuse ComboStrap\PagePath;
15c3437056SNickeauuse ComboStrap\Reference;
16c3437056SNickeauuse ComboStrap\References;
17c3437056SNickeau
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
264cadd4f8SNickeau    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         */
36*04fd306cSNickeau        $controller->register_hook(MetadataMutation::PAGE_METADATA_MUTATION_EVENT, 'AFTER', $this, 'create_backlink_mutation', array());
37c3437056SNickeau
38c3437056SNickeau        /**
394cadd4f8SNickeau         * process the Async event
40c3437056SNickeau         */
41c3437056SNickeau        $controller->register_hook(self::BACKLINK_MUTATION_EVENT_NAME, 'AFTER', $this, 'handle_backlink_mutation');
42c3437056SNickeau
43c3437056SNickeau
44c3437056SNickeau    }
45c3437056SNickeau
46*04fd306cSNickeau    /**
47*04fd306cSNickeau     * @param Doku_Event $event
48*04fd306cSNickeau     * @param $param
49*04fd306cSNickeau     * @return void
50*04fd306cSNickeau     */
51c3437056SNickeau    public function handle_backlink_mutation(Doku_Event $event, $param)
52c3437056SNickeau    {
53c3437056SNickeau
54c3437056SNickeau
55c3437056SNickeau        $data = $event->data;
56c3437056SNickeau        $pagePath = $data[PagePath::getPersistentName()];
57*04fd306cSNickeau        $reference = MarkupPath::createPageFromAbsoluteId($pagePath);
58c3437056SNickeau
59*04fd306cSNickeau        if ($reference->isSlot()) {
604cadd4f8SNickeau            return;
614cadd4f8SNickeau        }
624cadd4f8SNickeau
634cadd4f8SNickeau        /**
644cadd4f8SNickeau         * Delete and recompute analytics
654cadd4f8SNickeau         */
66*04fd306cSNickeau        try {
67*04fd306cSNickeau            $analyticsDocument = $reference->fetchAnalyticsDocument();
68*04fd306cSNickeau        } catch (ExceptionNotExists $e) {
69*04fd306cSNickeau            return;
70*04fd306cSNickeau        }
714cadd4f8SNickeau        CacheLog::deleteCacheIfExistsAndLog(
72*04fd306cSNickeau            $analyticsDocument,
734cadd4f8SNickeau            self::BACKLINK_MUTATION_EVENT_NAME,
744cadd4f8SNickeau            "Backlink mutation"
754cadd4f8SNickeau        );
76*04fd306cSNickeau
774cadd4f8SNickeau        try {
78*04fd306cSNickeau            /**
79*04fd306cSNickeau             * This is only to recompute the {@link \ComboStrap\Meta\Field\BacklinkCount backlinks metric} and
80*04fd306cSNickeau             * {@link \ComboStrap\LowQualityPage low quality page metrics}
81*04fd306cSNickeau             * TODO: when the derived meta are in the meta array and not in the {@link renderer_plugin_combo_analytics document},
82*04fd306cSNickeau             *   we could just compute them there and modify it with a plus 1
83*04fd306cSNickeau             */
844cadd4f8SNickeau            $reference->getDatabasePage()->replicateAnalytics();
85*04fd306cSNickeau        } catch (ExceptionCompile $e) {
864cadd4f8SNickeau            LogUtility::msg("Backlink Mutation: Error while trying to replicate the analytics. Error: {$e->getMessage()}");
874cadd4f8SNickeau        }
884cadd4f8SNickeau
894cadd4f8SNickeau        /**
904cadd4f8SNickeau         * Render the (footer slot) if it has a backlink dependency
914cadd4f8SNickeau         */
92*04fd306cSNickeau        MarkupCacheDependencies::reRenderSideSlotIfNeeded(
934cadd4f8SNickeau            $pagePath,
94*04fd306cSNickeau            MarkupCacheDependencies::BACKLINKS_DEPENDENCY,
954cadd4f8SNickeau            self::BACKLINK_MUTATION_EVENT_NAME
964cadd4f8SNickeau        );
974cadd4f8SNickeau
98c3437056SNickeau
99c3437056SNickeau    }
100c3437056SNickeau
101c3437056SNickeau    /**
102c3437056SNickeau     */
103c3437056SNickeau    function create_backlink_mutation(Doku_Event $event, $params)
104c3437056SNickeau    {
105c3437056SNickeau
106c3437056SNickeau
107c3437056SNickeau        $data = $event->data;
108c3437056SNickeau
109c3437056SNickeau        /**
110c3437056SNickeau         * If this is not a mutation on references we return.
111c3437056SNickeau         */
112*04fd306cSNickeau        if ($data[MetadataMutation::NAME_ATTRIBUTE] !== References::getPersistentName()) {
113c3437056SNickeau            return;
114c3437056SNickeau        };
115c3437056SNickeau
116*04fd306cSNickeau        $actualReferenceDatas = $data[MetadataMutation::NEW_VALUE_ATTRIBUTE];
117*04fd306cSNickeau        $oldReferenceDatas = $data[MetadataMutation::OLD_VALUE_ATTRIBUTE];
118c3437056SNickeau
119*04fd306cSNickeau        /**
120*04fd306cSNickeau         * Create an array of the actual reference with the key as path
121*04fd306cSNickeau         */
122*04fd306cSNickeau        $actualReferences = [];
123*04fd306cSNickeau        if ($actualReferenceDatas !== null) {
124*04fd306cSNickeau            foreach ($actualReferenceDatas as $actualReferenceData) {
125*04fd306cSNickeau                $actualReferenceWikiPathString = $actualReferenceData[Reference::getPersistentName()];
126*04fd306cSNickeau                $actualReferences[$actualReferenceWikiPathString] = $actualReferenceWikiPathString;
127c3437056SNickeau            }
128c3437056SNickeau        }
129c3437056SNickeau
130*04fd306cSNickeau        if ($oldReferenceDatas !== null) {
131*04fd306cSNickeau            foreach ($oldReferenceDatas as $oldReferenceData) {
132*04fd306cSNickeau
133*04fd306cSNickeau                $oldReferenceWikiPathString = $oldReferenceData[Reference::getPersistentName()];
134*04fd306cSNickeau
135*04fd306cSNickeau                if (isset($actualReferences[$oldReferenceWikiPathString])) {
136*04fd306cSNickeau                    unset($actualReferences[$oldReferenceWikiPathString]);
137*04fd306cSNickeau                    continue;
138*04fd306cSNickeau                }
139*04fd306cSNickeau
140*04fd306cSNickeau                /**
141*04fd306cSNickeau                 * Deleted reference
142*04fd306cSNickeau                 */
1434cadd4f8SNickeau                Event::createEvent(
1444cadd4f8SNickeau                    action_plugin_combo_backlinkmutation::BACKLINK_MUTATION_EVENT_NAME,
1454cadd4f8SNickeau                    [
146*04fd306cSNickeau                        PagePath::getPersistentName() => $oldReferenceWikiPathString
1474cadd4f8SNickeau                    ]
1484cadd4f8SNickeau                );
149*04fd306cSNickeau
150c3437056SNickeau            }
151c3437056SNickeau        }
152*04fd306cSNickeau
153*04fd306cSNickeau        /**
154*04fd306cSNickeau         * The new references
155*04fd306cSNickeau         */
156*04fd306cSNickeau        foreach ($actualReferences as $newReference) {
1574cadd4f8SNickeau            Event::createEvent(
1584cadd4f8SNickeau                action_plugin_combo_backlinkmutation::BACKLINK_MUTATION_EVENT_NAME,
1594cadd4f8SNickeau                [PagePath::getPersistentName() => $newReference]);
160c3437056SNickeau        }
161c3437056SNickeau
162c3437056SNickeau
163c3437056SNickeau    }
164c3437056SNickeau
165c3437056SNickeau
166c3437056SNickeau}
167c3437056SNickeau
168c3437056SNickeau
169c3437056SNickeau
170