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