104fd306cSNickeau<?php 204fd306cSNickeau 304fd306cSNickeaunamespace ComboStrap\Api; 404fd306cSNickeau 504fd306cSNickeau 604fd306cSNickeauuse ComboStrap\DataType; 704fd306cSNickeauuse ComboStrap\ExceptionCompile; 804fd306cSNickeauuse ComboStrap\ExceptionNotFound; 904fd306cSNickeauuse ComboStrap\ExecutionContext; 1004fd306cSNickeauuse ComboStrap\HttpResponseStatus; 1104fd306cSNickeauuse ComboStrap\Identity; 1204fd306cSNickeauuse ComboStrap\Json; 1304fd306cSNickeauuse ComboStrap\LogUtility; 1404fd306cSNickeauuse ComboStrap\LowQualityPageOverwrite; 1504fd306cSNickeauuse ComboStrap\MarkupPath; 1604fd306cSNickeauuse ComboStrap\Message; 1704fd306cSNickeauuse ComboStrap\Meta\Api\Metadata; 1804fd306cSNickeauuse ComboStrap\Meta\Api\MetadataSystem; 1904fd306cSNickeauuse ComboStrap\Meta\Form\FormMeta; 2004fd306cSNickeauuse ComboStrap\Meta\Form\FormMetaField; 2104fd306cSNickeauuse ComboStrap\Meta\Store\MetadataDokuWikiStore; 2204fd306cSNickeauuse ComboStrap\MetadataFormDataStore; 2304fd306cSNickeauuse ComboStrap\MetadataFrontmatterStore; 2404fd306cSNickeauuse ComboStrap\MetadataStoreTransfer; 2504fd306cSNickeauuse ComboStrap\MetaManagerForm; 2604fd306cSNickeauuse ComboStrap\Mime; 2704fd306cSNickeauuse ComboStrap\PluginUtility; 2804fd306cSNickeauuse ComboStrap\QualityDynamicMonitoringOverwrite; 2904fd306cSNickeauuse Doku_Event; 3004fd306cSNickeauuse dokuwiki\Extension\Event; 3104fd306cSNickeau 3204fd306cSNickeauclass MetaManagerHandler 3304fd306cSNickeau{ 3404fd306cSNickeau 3504fd306cSNickeau public const SUCCESS_MESSAGE = "The data were updated without errors."; 3604fd306cSNickeau public const CANONICAL = "meta-manager"; 3704fd306cSNickeau public const META_MANAGER_CALL_ID = "combo-meta-manager"; 3804fd306cSNickeau public const META_VIEWER_CALL_ID = "combo-meta-viewer"; 3904fd306cSNickeau 4004fd306cSNickeau public static function handle(Event $event) 4104fd306cSNickeau { 4204fd306cSNickeau $call = $event->data; 4304fd306cSNickeau 4404fd306cSNickeau /** 4504fd306cSNickeau * Shared check between post and get HTTP method 4604fd306cSNickeau */ 47*70bbd7f1Sgerardnico $id = $_GET["id"] ?? null; 4804fd306cSNickeau if ($id === null) { 4904fd306cSNickeau /** 5004fd306cSNickeau * With {@link TestRequest} 5104fd306cSNickeau * for instance 5204fd306cSNickeau */ 5304fd306cSNickeau $id = $_REQUEST["id"]; 5404fd306cSNickeau } 5504fd306cSNickeau $executionContext = ExecutionContext::getActualOrCreateFromEnv(); 5604fd306cSNickeau if (empty($id)) { 5704fd306cSNickeau $executionContext 5804fd306cSNickeau ->response() 5904fd306cSNickeau ->setStatus(HttpResponseStatus::BAD_REQUEST) 6004fd306cSNickeau ->setEvent($event) 6104fd306cSNickeau ->setCanonical(MetaManagerHandler::CANONICAL) 6204fd306cSNickeau ->setBodyAsJsonMessage("The page path (id form) is empty") 6304fd306cSNickeau ->end(); 6404fd306cSNickeau return; 6504fd306cSNickeau } 6604fd306cSNickeau $page = MarkupPath::createMarkupFromId($id); 6704fd306cSNickeau if (!$page->exists()) { 6804fd306cSNickeau $executionContext->response() 6904fd306cSNickeau ->setStatus(HttpResponseStatus::DOES_NOT_EXIST) 7004fd306cSNickeau ->setEvent($event) 7104fd306cSNickeau ->setCanonical(MetaManagerHandler::CANONICAL) 7204fd306cSNickeau ->setBodyAsJsonMessage("The page ($id) does not exist") 7304fd306cSNickeau ->end(); 7404fd306cSNickeau return; 7504fd306cSNickeau } 7604fd306cSNickeau 7704fd306cSNickeau /** 7804fd306cSNickeau * Security 7904fd306cSNickeau */ 8004fd306cSNickeau if (!$page->canBeUpdatedByCurrentUser()) { 8104fd306cSNickeau $user = Identity::getUser(); 8204fd306cSNickeau $executionContext->response() 8304fd306cSNickeau ->setStatus(HttpResponseStatus::NOT_AUTHORIZED) 8404fd306cSNickeau ->setEvent($event) 8504fd306cSNickeau ->setCanonical(MetaManagerHandler::CANONICAL) 8604fd306cSNickeau ->setBodyAsJsonMessage("Not Authorized: The user ($user) has not the `write` permission for the page (:$id).") 8704fd306cSNickeau ->end(); 8804fd306cSNickeau return; 8904fd306cSNickeau } 9004fd306cSNickeau 9104fd306cSNickeau /** 9204fd306cSNickeau * Functional code 9304fd306cSNickeau */ 9404fd306cSNickeau 9504fd306cSNickeau $requestMethod = $_SERVER['REQUEST_METHOD']; 9604fd306cSNickeau switch ($requestMethod) { 9704fd306cSNickeau case 'POST': 9804fd306cSNickeau 9904fd306cSNickeau if ($_SERVER["CONTENT_TYPE"] !== "application/json") { 10004fd306cSNickeau /** 10104fd306cSNickeau * We can't set the mime content in a {@link TestRequest} 10204fd306cSNickeau */ 10304fd306cSNickeau if (!PluginUtility::isTest()) { 10404fd306cSNickeau $executionContext 10504fd306cSNickeau ->response()->setStatus(HttpResponseStatus::UNSUPPORTED_MEDIA_TYPE) 10604fd306cSNickeau ->setEvent($event) 10704fd306cSNickeau ->setCanonical(MetaManagerHandler::CANONICAL) 10804fd306cSNickeau ->setBodyAsJsonMessage("The post content should be in json format") 10904fd306cSNickeau ->end(); 11004fd306cSNickeau return; 11104fd306cSNickeau } 11204fd306cSNickeau } 11304fd306cSNickeau 11404fd306cSNickeau /** 11504fd306cSNickeau * We can't simulate a php://input in a {@link TestRequest} 11604fd306cSNickeau * We set therefore the post 11704fd306cSNickeau */ 11804fd306cSNickeau if (!PluginUtility::isTest()) { 11904fd306cSNickeau $jsonString = file_get_contents('php://input'); 12004fd306cSNickeau try { 12104fd306cSNickeau $_POST = Json::createFromString($jsonString)->toArray(); 12204fd306cSNickeau } catch (ExceptionCompile $e) { 12304fd306cSNickeau $executionContext 12404fd306cSNickeau ->response() 12504fd306cSNickeau ->setStatus(HttpResponseStatus::BAD_REQUEST) 12604fd306cSNickeau ->setEvent($event) 12704fd306cSNickeau ->setCanonical(MetaManagerHandler::CANONICAL) 12804fd306cSNickeau ->setBodyAsJsonMessage("The json payload could not decoded. Error: {$e->getMessage()}") 12904fd306cSNickeau ->end(); 13004fd306cSNickeau return; 13104fd306cSNickeau } 13204fd306cSNickeau } 13304fd306cSNickeau 13404fd306cSNickeau if ($call === MetaManagerHandler::META_MANAGER_CALL_ID) { 13504fd306cSNickeau self::handleManagerPost($event, $page, $_POST); 13604fd306cSNickeau } else { 13704fd306cSNickeau self::handleViewerPost($event, $page, $_POST); 13804fd306cSNickeau } 13904fd306cSNickeau 14004fd306cSNickeau return; 14104fd306cSNickeau case "GET": 14204fd306cSNickeau 14304fd306cSNickeau if ($call === MetaManagerHandler::META_MANAGER_CALL_ID) { 14404fd306cSNickeau self::handleManagerGet($event, $page); 14504fd306cSNickeau } else { 14604fd306cSNickeau self::handleViewerGet($event, $page); 14704fd306cSNickeau } 14804fd306cSNickeau return; 14904fd306cSNickeau 15004fd306cSNickeau } 15104fd306cSNickeau 15204fd306cSNickeau } 15304fd306cSNickeau 15404fd306cSNickeau /** 15504fd306cSNickeau * @param $event 15604fd306cSNickeau * @param MarkupPath $page 15704fd306cSNickeau * @param array $post 15804fd306cSNickeau */ 15904fd306cSNickeau private static function handleManagerPost($event, MarkupPath $page, array $post) 16004fd306cSNickeau { 16104fd306cSNickeau 16204fd306cSNickeau $formStore = MetadataFormDataStore::getOrCreateFromResource($page, $post); 16304fd306cSNickeau $targetStore = MetadataDokuWikiStore::getOrCreateFromResource($page); 16404fd306cSNickeau 16504fd306cSNickeau /** 16604fd306cSNickeau * Boolean form field (default values) 16704fd306cSNickeau * are not send back by the HTML form 16804fd306cSNickeau */ 16904fd306cSNickeau $defaultBooleanMetadata = [ 17004fd306cSNickeau LowQualityPageOverwrite::PROPERTY_NAME, 17104fd306cSNickeau QualityDynamicMonitoringOverwrite::PROPERTY_NAME 17204fd306cSNickeau ]; 17304fd306cSNickeau $defaultBoolean = []; 17404fd306cSNickeau foreach ($defaultBooleanMetadata as $booleanMeta) { 17504fd306cSNickeau try { 17604fd306cSNickeau $metadata = MetadataSystem::getForName($booleanMeta) 17704fd306cSNickeau ->setResource($page) 17804fd306cSNickeau ->setReadStore($formStore) 17904fd306cSNickeau ->setWriteStore($targetStore); 18004fd306cSNickeau } catch (ExceptionNotFound $e) { 18104fd306cSNickeau LogUtility::internalError("The boolean metadata name ($booleanMeta) was not found", self::CANONICAL, $e); 18204fd306cSNickeau continue; 18304fd306cSNickeau } 18404fd306cSNickeau $defaultBoolean[$metadata::getName()] = $metadata->toStoreDefaultValue(); 18504fd306cSNickeau } 18604fd306cSNickeau $post = array_merge($defaultBoolean, $post); 18704fd306cSNickeau 18804fd306cSNickeau /** 18904fd306cSNickeau * Processing 19004fd306cSNickeau */ 19104fd306cSNickeau $transfer = MetadataStoreTransfer::createForPage($page) 19204fd306cSNickeau ->fromStore($formStore) 19304fd306cSNickeau ->toStore($targetStore) 19404fd306cSNickeau ->process($post); 19504fd306cSNickeau $processingMessages = $transfer->getMessages(); 19604fd306cSNickeau 19704fd306cSNickeau 19804fd306cSNickeau $responseMessages = []; 19904fd306cSNickeau $responseStatus = HttpResponseStatus::ALL_GOOD; 20004fd306cSNickeau foreach ($processingMessages as $upsertMessages) { 20104fd306cSNickeau $responseMessage = [ucfirst($upsertMessages->getType())]; 20204fd306cSNickeau $documentationHyperlink = $upsertMessages->getDocumentationHyperLink(); 20304fd306cSNickeau if ($documentationHyperlink !== null) { 20404fd306cSNickeau $responseMessage[] = $documentationHyperlink; 20504fd306cSNickeau } 20604fd306cSNickeau $responseMessage[] = $upsertMessages->getContent(Mime::PLAIN_TEXT); 20704fd306cSNickeau $responseMessages[] = implode(" - ", $responseMessage); 20804fd306cSNickeau if ($upsertMessages->getType() === Message::TYPE_ERROR && $responseStatus !== HttpResponseStatus::BAD_REQUEST) { 20904fd306cSNickeau $responseStatus = HttpResponseStatus::BAD_REQUEST; 21004fd306cSNickeau } 21104fd306cSNickeau } 21204fd306cSNickeau 21304fd306cSNickeau if (sizeof($responseMessages) === 0) { 21404fd306cSNickeau $responseMessages[] = MetaManagerHandler::SUCCESS_MESSAGE; 21504fd306cSNickeau } 21604fd306cSNickeau 21704fd306cSNickeau try { 21804fd306cSNickeau $frontMatterMessage = MetadataFrontmatterStore::createFromPage($page) 21904fd306cSNickeau ->sync(); 22004fd306cSNickeau $responseMessages[] = $frontMatterMessage->getPlainTextContent(); 22104fd306cSNickeau } catch (ExceptionCompile $e) { 22204fd306cSNickeau $responseMessages[] = $e->getMessage(); 22304fd306cSNickeau } 22404fd306cSNickeau 22504fd306cSNickeau 22604fd306cSNickeau /** 22704fd306cSNickeau * Response 22804fd306cSNickeau */ 22904fd306cSNickeau ExecutionContext::getActualOrCreateFromEnv() 23004fd306cSNickeau ->response() 23104fd306cSNickeau ->setStatus(HttpResponseStatus::ALL_GOOD) 23204fd306cSNickeau ->setEvent($event) 23304fd306cSNickeau ->setBodyAsJsonMessage($responseMessages) 23404fd306cSNickeau ->end(); 23504fd306cSNickeau 23604fd306cSNickeau 23704fd306cSNickeau } 23804fd306cSNickeau 23904fd306cSNickeau /** 24004fd306cSNickeau * @param Doku_Event $event 24104fd306cSNickeau * @param MarkupPath $page 24204fd306cSNickeau */ 24304fd306cSNickeau private static function handleManagerGet(Doku_Event $event, MarkupPath $page) 24404fd306cSNickeau { 24504fd306cSNickeau $formMeta = MetaManagerForm::createForPage($page)->toFormMeta(); 24604fd306cSNickeau $formMetaAssociativeArray = $formMeta->toAssociativeArray(); 24704fd306cSNickeau $payload = json_encode($formMetaAssociativeArray); 24804fd306cSNickeau ExecutionContext::getActualOrCreateFromEnv() 24904fd306cSNickeau ->response() 25004fd306cSNickeau ->setStatus(HttpResponseStatus::ALL_GOOD) 25104fd306cSNickeau ->setEvent($event) 25204fd306cSNickeau ->setBody($payload, Mime::getJson()) 25304fd306cSNickeau ->end(); 25404fd306cSNickeau } 25504fd306cSNickeau 25604fd306cSNickeau /** 25704fd306cSNickeau * @param Doku_Event $event 25804fd306cSNickeau * @param MarkupPath $page 25904fd306cSNickeau */ 26004fd306cSNickeau private static function handleViewerGet(Doku_Event $event, MarkupPath $page) 26104fd306cSNickeau { 26204fd306cSNickeau if (!Identity::isManager()) { 26304fd306cSNickeau ExecutionContext::getActualOrCreateFromEnv() 26404fd306cSNickeau ->response() 26504fd306cSNickeau ->setStatus(HttpResponseStatus::NOT_AUTHORIZED) 26604fd306cSNickeau ->setEvent($event) 26704fd306cSNickeau ->setCanonical(MetaManagerHandler::CANONICAL) 26804fd306cSNickeau ->setBodyAsJsonMessage("Not Authorized (managers only)") 26904fd306cSNickeau ->end(); 27004fd306cSNickeau return; 27104fd306cSNickeau } 27204fd306cSNickeau $metadata = MetadataDokuWikiStore::getOrCreateFromResource($page)->getDataCurrentAndPersistent(); 27304fd306cSNickeau $persistent = $metadata[MetadataDokuWikiStore::PERSISTENT_DOKUWIKI_KEY]; 27404fd306cSNickeau ksort($persistent); 27504fd306cSNickeau $current = $metadata[MetadataDokuWikiStore::CURRENT_METADATA]; 27604fd306cSNickeau ksort($current); 27704fd306cSNickeau $form = FormMeta::create("raw_metadata") 27804fd306cSNickeau ->addField( 27904fd306cSNickeau FormMetaField::create(MetadataDokuWikiStore::PERSISTENT_DOKUWIKI_KEY, DataType::JSON_TYPE_VALUE) 28004fd306cSNickeau ->setLabel("Persistent Metadata (User Metadata)") 28104fd306cSNickeau ->setTab("persistent") 28204fd306cSNickeau ->setDescription("The persistent metadata contains raw values. They contains the values set by the user and the fixed values such as page id.") 28304fd306cSNickeau ->addValue(json_encode($persistent)) 28404fd306cSNickeau ) 28504fd306cSNickeau ->addField(FormMetaField::create(MetadataDokuWikiStore::CURRENT_METADATA, DataType::JSON_TYPE_VALUE) 28604fd306cSNickeau ->setLabel("Current (Derived) Metadata") 28704fd306cSNickeau ->setTab("current") 28804fd306cSNickeau ->setDescription("The current metadata are the derived / calculated / runtime metadata values (extended with the persistent metadata).") 28904fd306cSNickeau ->addValue(json_encode($current)) 29004fd306cSNickeau ->setMutable(false) 29104fd306cSNickeau ) 29204fd306cSNickeau ->toAssociativeArray(); 29304fd306cSNickeau 29404fd306cSNickeau ExecutionContext::getActualOrCreateFromEnv() 29504fd306cSNickeau ->response() 29604fd306cSNickeau ->setStatus(HttpResponseStatus::ALL_GOOD) 29704fd306cSNickeau ->setEvent($event) 29804fd306cSNickeau ->setCanonical(MetaManagerHandler::CANONICAL) 29904fd306cSNickeau ->setBody(json_encode($form), Mime::getJson()) 30004fd306cSNickeau ->end(); 30104fd306cSNickeau 30204fd306cSNickeau } 30304fd306cSNickeau 30404fd306cSNickeau private static function handleViewerPost(Doku_Event $event, MarkupPath $page, array $post) 30504fd306cSNickeau { 30604fd306cSNickeau 30704fd306cSNickeau $metadataStore = MetadataDokuWikiStore::getOrCreateFromResource($page); 30804fd306cSNickeau $actualMeta = $metadataStore->getDataCurrentAndPersistent(); 30904fd306cSNickeau 31004fd306cSNickeau /** 31104fd306cSNickeau * @var Message[] 31204fd306cSNickeau */ 31304fd306cSNickeau $messages = []; 31404fd306cSNickeau /** 31504fd306cSNickeau * Technically, persistent is a copy of persistent data 31604fd306cSNickeau * but on the ui for now, only persistent data can be modified 31704fd306cSNickeau */ 31804fd306cSNickeau $postMeta = json_decode($post[MetadataDokuWikiStore::PERSISTENT_DOKUWIKI_KEY], true); 31904fd306cSNickeau if ($postMeta === null) { 32004fd306cSNickeau ExecutionContext::getActualOrCreateFromEnv() 32104fd306cSNickeau ->response() 32204fd306cSNickeau ->setStatus(HttpResponseStatus::BAD_REQUEST) 32304fd306cSNickeau ->setEvent($event) 32404fd306cSNickeau ->setBodyAsJsonMessage("The metadata should be in json format") 32504fd306cSNickeau ->end(); 32604fd306cSNickeau return; 32704fd306cSNickeau } 32804fd306cSNickeau 32904fd306cSNickeau 33004fd306cSNickeau $managedMetaMessageSuffix = "is a managed metadata, you need to use the metadata manager to delete it"; 33104fd306cSNickeau 33204fd306cSNickeau /** 33304fd306cSNickeau * Process the actual attribute 33404fd306cSNickeau * We loop only over the persistent metadata 33504fd306cSNickeau * that are the one that we want change 33604fd306cSNickeau */ 33704fd306cSNickeau $persistentMetadata = $actualMeta[MetadataDokuWikiStore::PERSISTENT_DOKUWIKI_KEY]; 33804fd306cSNickeau foreach ($persistentMetadata as $key => $value) { 33904fd306cSNickeau 34004fd306cSNickeau $postMetaValue = null; 34104fd306cSNickeau if (isset($postMeta[$key])) { 34204fd306cSNickeau $postMetaValue = $postMeta[$key]; 34304fd306cSNickeau unset($postMeta[$key]); 34404fd306cSNickeau } 34504fd306cSNickeau 34604fd306cSNickeau try { 34704fd306cSNickeau $metadata = MetadataSystem::getForName($key); 34804fd306cSNickeau } catch (ExceptionNotFound $e) { 34904fd306cSNickeau $metadata = null; 35004fd306cSNickeau } 35104fd306cSNickeau 35204fd306cSNickeau if ($postMetaValue === null) { 35304fd306cSNickeau 35404fd306cSNickeau if ($metadata !== null && $metadata->isMutable()) { 35504fd306cSNickeau $messages[] = Message::createInfoMessage("The metadata ($key) $managedMetaMessageSuffix"); 35604fd306cSNickeau continue; 35704fd306cSNickeau } 35804fd306cSNickeau if (in_array($key, Metadata::NOT_MODIFIABLE_PERSISTENT_METADATA)) { 35904fd306cSNickeau $messages[] = Message::createInfoMessage("The metadata ($key) is a internal metadata, you can't delete it"); 36004fd306cSNickeau continue; 36104fd306cSNickeau } 36204fd306cSNickeau unset($actualMeta[MetadataDokuWikiStore::CURRENT_METADATA][$key]); 36304fd306cSNickeau unset($actualMeta[MetadataDokuWikiStore::PERSISTENT_DOKUWIKI_KEY][$key]); 364*70bbd7f1Sgerardnico $stringValue = DataType::toString($value); 365*70bbd7f1Sgerardnico $messages[] = Message::createInfoMessage("The metadata ($key) with the value ($stringValue) was deleted"); 36604fd306cSNickeau } else { 36704fd306cSNickeau if ($value !== $postMetaValue) { 36804fd306cSNickeau if ($metadata !== null && $metadata->isMutable()) { 36904fd306cSNickeau $messages[] = Message::createInfoMessage("The metadata ($key) $managedMetaMessageSuffix"); 37004fd306cSNickeau continue; 37104fd306cSNickeau } 37204fd306cSNickeau if (in_array($key, Metadata::NOT_MODIFIABLE_PERSISTENT_METADATA)) { 37304fd306cSNickeau $messages[] = Message::createInfoMessage("The metadata ($key) is a internal metadata, you can't modify it"); 37404fd306cSNickeau continue; 37504fd306cSNickeau } 37604fd306cSNickeau $actualMeta[MetadataDokuWikiStore::CURRENT_METADATA][$key] = $postMetaValue; 37704fd306cSNickeau $actualMeta[MetadataDokuWikiStore::PERSISTENT_DOKUWIKI_KEY][$key] = $postMetaValue; 37804fd306cSNickeau $messages[] = Message::createInfoMessage("The metadata ($key) was updated to the value ($postMetaValue) - Old value ($value)"); 37904fd306cSNickeau } 38004fd306cSNickeau } 38104fd306cSNickeau } 38204fd306cSNickeau /** 38304fd306cSNickeau * Process the new attribute 38404fd306cSNickeau */ 38504fd306cSNickeau foreach ($postMeta as $key => $value) { 38604fd306cSNickeau 38704fd306cSNickeau try { 38804fd306cSNickeau $metadata = MetadataSystem::getForName($key); 38904fd306cSNickeau if ($metadata->isMutable()) { 39004fd306cSNickeau // This meta should be modified via the form 39104fd306cSNickeau $messages[] = Message::createInfoMessage("The metadata ($key) can only be added via the meta manager"); 39204fd306cSNickeau continue; 39304fd306cSNickeau } 39404fd306cSNickeau } catch (ExceptionNotFound $e) { 39504fd306cSNickeau // 39604fd306cSNickeau } 39704fd306cSNickeau 39804fd306cSNickeau if (in_array($key, Metadata::NOT_MODIFIABLE_PERSISTENT_METADATA)) { 39904fd306cSNickeau // this meta are not modifiable 40004fd306cSNickeau $messages[] = Message::createInfoMessage("The metadata ($key) is a internal metadata, you can't modify it"); 40104fd306cSNickeau continue; 40204fd306cSNickeau } 40304fd306cSNickeau $actualMeta[MetadataDokuWikiStore::CURRENT_METADATA][$key] = $value; 40404fd306cSNickeau $actualMeta[MetadataDokuWikiStore::PERSISTENT_DOKUWIKI_KEY][$key] = $value; 40504fd306cSNickeau $messages[] = Message::createInfoMessage("The metadata ($key) was created with the value ($value)"); 40604fd306cSNickeau } 40704fd306cSNickeau 40804fd306cSNickeau 40904fd306cSNickeau p_save_metadata($page->getWikiId(), $actualMeta); 41004fd306cSNickeau 41104fd306cSNickeau if (sizeof($messages) !== 0) { 41204fd306cSNickeau $messagesToSend = []; 41304fd306cSNickeau foreach ($messages as $message) { 41404fd306cSNickeau $messagesToSend[] = $message->getPlainTextContent(); 41504fd306cSNickeau } 41604fd306cSNickeau } else { 41704fd306cSNickeau $messagesToSend = "No metadata has been changed."; 41804fd306cSNickeau } 41904fd306cSNickeau ExecutionContext::getActualOrCreateFromEnv() 42004fd306cSNickeau ->response() 42104fd306cSNickeau ->setStatus(HttpResponseStatus::ALL_GOOD) 42204fd306cSNickeau ->setEvent($event) 42304fd306cSNickeau ->setBodyAsJsonMessage($messagesToSend) 42404fd306cSNickeau ->end(); 42504fd306cSNickeau 42604fd306cSNickeau } 42704fd306cSNickeau} 428