1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeaunamespace ComboStrap\Api; 4*04fd306cSNickeau 5*04fd306cSNickeau 6*04fd306cSNickeauuse ComboStrap\DataType; 7*04fd306cSNickeauuse ComboStrap\ExceptionCompile; 8*04fd306cSNickeauuse ComboStrap\ExceptionNotFound; 9*04fd306cSNickeauuse ComboStrap\ExecutionContext; 10*04fd306cSNickeauuse ComboStrap\HttpResponseStatus; 11*04fd306cSNickeauuse ComboStrap\Identity; 12*04fd306cSNickeauuse ComboStrap\Json; 13*04fd306cSNickeauuse ComboStrap\LogUtility; 14*04fd306cSNickeauuse ComboStrap\LowQualityPageOverwrite; 15*04fd306cSNickeauuse ComboStrap\MarkupPath; 16*04fd306cSNickeauuse ComboStrap\Message; 17*04fd306cSNickeauuse ComboStrap\Meta\Api\Metadata; 18*04fd306cSNickeauuse ComboStrap\Meta\Api\MetadataSystem; 19*04fd306cSNickeauuse ComboStrap\Meta\Form\FormMeta; 20*04fd306cSNickeauuse ComboStrap\Meta\Form\FormMetaField; 21*04fd306cSNickeauuse ComboStrap\Meta\Store\MetadataDokuWikiStore; 22*04fd306cSNickeauuse ComboStrap\MetadataFormDataStore; 23*04fd306cSNickeauuse ComboStrap\MetadataFrontmatterStore; 24*04fd306cSNickeauuse ComboStrap\MetadataStoreTransfer; 25*04fd306cSNickeauuse ComboStrap\MetaManagerForm; 26*04fd306cSNickeauuse ComboStrap\Mime; 27*04fd306cSNickeauuse ComboStrap\PluginUtility; 28*04fd306cSNickeauuse ComboStrap\QualityDynamicMonitoringOverwrite; 29*04fd306cSNickeauuse Doku_Event; 30*04fd306cSNickeauuse dokuwiki\Extension\Event; 31*04fd306cSNickeau 32*04fd306cSNickeauclass MetaManagerHandler 33*04fd306cSNickeau{ 34*04fd306cSNickeau 35*04fd306cSNickeau public const SUCCESS_MESSAGE = "The data were updated without errors."; 36*04fd306cSNickeau public const CANONICAL = "meta-manager"; 37*04fd306cSNickeau public const META_MANAGER_CALL_ID = "combo-meta-manager"; 38*04fd306cSNickeau public const META_VIEWER_CALL_ID = "combo-meta-viewer"; 39*04fd306cSNickeau 40*04fd306cSNickeau public static function handle(Event $event) 41*04fd306cSNickeau { 42*04fd306cSNickeau $call = $event->data; 43*04fd306cSNickeau 44*04fd306cSNickeau /** 45*04fd306cSNickeau * Shared check between post and get HTTP method 46*04fd306cSNickeau */ 47*04fd306cSNickeau $id = $_GET["id"]; 48*04fd306cSNickeau if ($id === null) { 49*04fd306cSNickeau /** 50*04fd306cSNickeau * With {@link TestRequest} 51*04fd306cSNickeau * for instance 52*04fd306cSNickeau */ 53*04fd306cSNickeau $id = $_REQUEST["id"]; 54*04fd306cSNickeau } 55*04fd306cSNickeau $executionContext = ExecutionContext::getActualOrCreateFromEnv(); 56*04fd306cSNickeau if (empty($id)) { 57*04fd306cSNickeau $executionContext 58*04fd306cSNickeau ->response() 59*04fd306cSNickeau ->setStatus(HttpResponseStatus::BAD_REQUEST) 60*04fd306cSNickeau ->setEvent($event) 61*04fd306cSNickeau ->setCanonical(MetaManagerHandler::CANONICAL) 62*04fd306cSNickeau ->setBodyAsJsonMessage("The page path (id form) is empty") 63*04fd306cSNickeau ->end(); 64*04fd306cSNickeau return; 65*04fd306cSNickeau } 66*04fd306cSNickeau $page = MarkupPath::createMarkupFromId($id); 67*04fd306cSNickeau if (!$page->exists()) { 68*04fd306cSNickeau $executionContext->response() 69*04fd306cSNickeau ->setStatus(HttpResponseStatus::DOES_NOT_EXIST) 70*04fd306cSNickeau ->setEvent($event) 71*04fd306cSNickeau ->setCanonical(MetaManagerHandler::CANONICAL) 72*04fd306cSNickeau ->setBodyAsJsonMessage("The page ($id) does not exist") 73*04fd306cSNickeau ->end(); 74*04fd306cSNickeau return; 75*04fd306cSNickeau } 76*04fd306cSNickeau 77*04fd306cSNickeau /** 78*04fd306cSNickeau * Security 79*04fd306cSNickeau */ 80*04fd306cSNickeau if (!$page->canBeUpdatedByCurrentUser()) { 81*04fd306cSNickeau $user = Identity::getUser(); 82*04fd306cSNickeau $executionContext->response() 83*04fd306cSNickeau ->setStatus(HttpResponseStatus::NOT_AUTHORIZED) 84*04fd306cSNickeau ->setEvent($event) 85*04fd306cSNickeau ->setCanonical(MetaManagerHandler::CANONICAL) 86*04fd306cSNickeau ->setBodyAsJsonMessage("Not Authorized: The user ($user) has not the `write` permission for the page (:$id).") 87*04fd306cSNickeau ->end(); 88*04fd306cSNickeau return; 89*04fd306cSNickeau } 90*04fd306cSNickeau 91*04fd306cSNickeau /** 92*04fd306cSNickeau * Functional code 93*04fd306cSNickeau */ 94*04fd306cSNickeau 95*04fd306cSNickeau $requestMethod = $_SERVER['REQUEST_METHOD']; 96*04fd306cSNickeau switch ($requestMethod) { 97*04fd306cSNickeau case 'POST': 98*04fd306cSNickeau 99*04fd306cSNickeau if ($_SERVER["CONTENT_TYPE"] !== "application/json") { 100*04fd306cSNickeau /** 101*04fd306cSNickeau * We can't set the mime content in a {@link TestRequest} 102*04fd306cSNickeau */ 103*04fd306cSNickeau if (!PluginUtility::isTest()) { 104*04fd306cSNickeau $executionContext 105*04fd306cSNickeau ->response()->setStatus(HttpResponseStatus::UNSUPPORTED_MEDIA_TYPE) 106*04fd306cSNickeau ->setEvent($event) 107*04fd306cSNickeau ->setCanonical(MetaManagerHandler::CANONICAL) 108*04fd306cSNickeau ->setBodyAsJsonMessage("The post content should be in json format") 109*04fd306cSNickeau ->end(); 110*04fd306cSNickeau return; 111*04fd306cSNickeau } 112*04fd306cSNickeau } 113*04fd306cSNickeau 114*04fd306cSNickeau /** 115*04fd306cSNickeau * We can't simulate a php://input in a {@link TestRequest} 116*04fd306cSNickeau * We set therefore the post 117*04fd306cSNickeau */ 118*04fd306cSNickeau if (!PluginUtility::isTest()) { 119*04fd306cSNickeau $jsonString = file_get_contents('php://input'); 120*04fd306cSNickeau try { 121*04fd306cSNickeau $_POST = Json::createFromString($jsonString)->toArray(); 122*04fd306cSNickeau } catch (ExceptionCompile $e) { 123*04fd306cSNickeau $executionContext 124*04fd306cSNickeau ->response() 125*04fd306cSNickeau ->setStatus(HttpResponseStatus::BAD_REQUEST) 126*04fd306cSNickeau ->setEvent($event) 127*04fd306cSNickeau ->setCanonical(MetaManagerHandler::CANONICAL) 128*04fd306cSNickeau ->setBodyAsJsonMessage("The json payload could not decoded. Error: {$e->getMessage()}") 129*04fd306cSNickeau ->end(); 130*04fd306cSNickeau return; 131*04fd306cSNickeau } 132*04fd306cSNickeau } 133*04fd306cSNickeau 134*04fd306cSNickeau if ($call === MetaManagerHandler::META_MANAGER_CALL_ID) { 135*04fd306cSNickeau self::handleManagerPost($event, $page, $_POST); 136*04fd306cSNickeau } else { 137*04fd306cSNickeau self::handleViewerPost($event, $page, $_POST); 138*04fd306cSNickeau } 139*04fd306cSNickeau 140*04fd306cSNickeau return; 141*04fd306cSNickeau case "GET": 142*04fd306cSNickeau 143*04fd306cSNickeau if ($call === MetaManagerHandler::META_MANAGER_CALL_ID) { 144*04fd306cSNickeau self::handleManagerGet($event, $page); 145*04fd306cSNickeau } else { 146*04fd306cSNickeau self::handleViewerGet($event, $page); 147*04fd306cSNickeau } 148*04fd306cSNickeau return; 149*04fd306cSNickeau 150*04fd306cSNickeau } 151*04fd306cSNickeau 152*04fd306cSNickeau } 153*04fd306cSNickeau 154*04fd306cSNickeau /** 155*04fd306cSNickeau * @param $event 156*04fd306cSNickeau * @param MarkupPath $page 157*04fd306cSNickeau * @param array $post 158*04fd306cSNickeau */ 159*04fd306cSNickeau private static function handleManagerPost($event, MarkupPath $page, array $post) 160*04fd306cSNickeau { 161*04fd306cSNickeau 162*04fd306cSNickeau $formStore = MetadataFormDataStore::getOrCreateFromResource($page, $post); 163*04fd306cSNickeau $targetStore = MetadataDokuWikiStore::getOrCreateFromResource($page); 164*04fd306cSNickeau 165*04fd306cSNickeau /** 166*04fd306cSNickeau * Boolean form field (default values) 167*04fd306cSNickeau * are not send back by the HTML form 168*04fd306cSNickeau */ 169*04fd306cSNickeau $defaultBooleanMetadata = [ 170*04fd306cSNickeau LowQualityPageOverwrite::PROPERTY_NAME, 171*04fd306cSNickeau QualityDynamicMonitoringOverwrite::PROPERTY_NAME 172*04fd306cSNickeau ]; 173*04fd306cSNickeau $defaultBoolean = []; 174*04fd306cSNickeau foreach ($defaultBooleanMetadata as $booleanMeta) { 175*04fd306cSNickeau try { 176*04fd306cSNickeau $metadata = MetadataSystem::getForName($booleanMeta) 177*04fd306cSNickeau ->setResource($page) 178*04fd306cSNickeau ->setReadStore($formStore) 179*04fd306cSNickeau ->setWriteStore($targetStore); 180*04fd306cSNickeau } catch (ExceptionNotFound $e) { 181*04fd306cSNickeau LogUtility::internalError("The boolean metadata name ($booleanMeta) was not found", self::CANONICAL, $e); 182*04fd306cSNickeau continue; 183*04fd306cSNickeau } 184*04fd306cSNickeau $defaultBoolean[$metadata::getName()] = $metadata->toStoreDefaultValue(); 185*04fd306cSNickeau } 186*04fd306cSNickeau $post = array_merge($defaultBoolean, $post); 187*04fd306cSNickeau 188*04fd306cSNickeau /** 189*04fd306cSNickeau * Processing 190*04fd306cSNickeau */ 191*04fd306cSNickeau $transfer = MetadataStoreTransfer::createForPage($page) 192*04fd306cSNickeau ->fromStore($formStore) 193*04fd306cSNickeau ->toStore($targetStore) 194*04fd306cSNickeau ->process($post); 195*04fd306cSNickeau $processingMessages = $transfer->getMessages(); 196*04fd306cSNickeau 197*04fd306cSNickeau 198*04fd306cSNickeau $responseMessages = []; 199*04fd306cSNickeau $responseStatus = HttpResponseStatus::ALL_GOOD; 200*04fd306cSNickeau foreach ($processingMessages as $upsertMessages) { 201*04fd306cSNickeau $responseMessage = [ucfirst($upsertMessages->getType())]; 202*04fd306cSNickeau $documentationHyperlink = $upsertMessages->getDocumentationHyperLink(); 203*04fd306cSNickeau if ($documentationHyperlink !== null) { 204*04fd306cSNickeau $responseMessage[] = $documentationHyperlink; 205*04fd306cSNickeau } 206*04fd306cSNickeau $responseMessage[] = $upsertMessages->getContent(Mime::PLAIN_TEXT); 207*04fd306cSNickeau $responseMessages[] = implode(" - ", $responseMessage); 208*04fd306cSNickeau if ($upsertMessages->getType() === Message::TYPE_ERROR && $responseStatus !== HttpResponseStatus::BAD_REQUEST) { 209*04fd306cSNickeau $responseStatus = HttpResponseStatus::BAD_REQUEST; 210*04fd306cSNickeau } 211*04fd306cSNickeau } 212*04fd306cSNickeau 213*04fd306cSNickeau if (sizeof($responseMessages) === 0) { 214*04fd306cSNickeau $responseMessages[] = MetaManagerHandler::SUCCESS_MESSAGE; 215*04fd306cSNickeau } 216*04fd306cSNickeau 217*04fd306cSNickeau try { 218*04fd306cSNickeau $frontMatterMessage = MetadataFrontmatterStore::createFromPage($page) 219*04fd306cSNickeau ->sync(); 220*04fd306cSNickeau $responseMessages[] = $frontMatterMessage->getPlainTextContent(); 221*04fd306cSNickeau } catch (ExceptionCompile $e) { 222*04fd306cSNickeau $responseMessages[] = $e->getMessage(); 223*04fd306cSNickeau } 224*04fd306cSNickeau 225*04fd306cSNickeau 226*04fd306cSNickeau /** 227*04fd306cSNickeau * Response 228*04fd306cSNickeau */ 229*04fd306cSNickeau ExecutionContext::getActualOrCreateFromEnv() 230*04fd306cSNickeau ->response() 231*04fd306cSNickeau ->setStatus(HttpResponseStatus::ALL_GOOD) 232*04fd306cSNickeau ->setEvent($event) 233*04fd306cSNickeau ->setBodyAsJsonMessage($responseMessages) 234*04fd306cSNickeau ->end(); 235*04fd306cSNickeau 236*04fd306cSNickeau 237*04fd306cSNickeau } 238*04fd306cSNickeau 239*04fd306cSNickeau /** 240*04fd306cSNickeau * @param Doku_Event $event 241*04fd306cSNickeau * @param MarkupPath $page 242*04fd306cSNickeau */ 243*04fd306cSNickeau private static function handleManagerGet(Doku_Event $event, MarkupPath $page) 244*04fd306cSNickeau { 245*04fd306cSNickeau $formMeta = MetaManagerForm::createForPage($page)->toFormMeta(); 246*04fd306cSNickeau $formMetaAssociativeArray = $formMeta->toAssociativeArray(); 247*04fd306cSNickeau $payload = json_encode($formMetaAssociativeArray); 248*04fd306cSNickeau ExecutionContext::getActualOrCreateFromEnv() 249*04fd306cSNickeau ->response() 250*04fd306cSNickeau ->setStatus(HttpResponseStatus::ALL_GOOD) 251*04fd306cSNickeau ->setEvent($event) 252*04fd306cSNickeau ->setBody($payload, Mime::getJson()) 253*04fd306cSNickeau ->end(); 254*04fd306cSNickeau } 255*04fd306cSNickeau 256*04fd306cSNickeau /** 257*04fd306cSNickeau * @param Doku_Event $event 258*04fd306cSNickeau * @param MarkupPath $page 259*04fd306cSNickeau */ 260*04fd306cSNickeau private static function handleViewerGet(Doku_Event $event, MarkupPath $page) 261*04fd306cSNickeau { 262*04fd306cSNickeau if (!Identity::isManager()) { 263*04fd306cSNickeau ExecutionContext::getActualOrCreateFromEnv() 264*04fd306cSNickeau ->response() 265*04fd306cSNickeau ->setStatus(HttpResponseStatus::NOT_AUTHORIZED) 266*04fd306cSNickeau ->setEvent($event) 267*04fd306cSNickeau ->setCanonical(MetaManagerHandler::CANONICAL) 268*04fd306cSNickeau ->setBodyAsJsonMessage("Not Authorized (managers only)") 269*04fd306cSNickeau ->end(); 270*04fd306cSNickeau return; 271*04fd306cSNickeau } 272*04fd306cSNickeau $metadata = MetadataDokuWikiStore::getOrCreateFromResource($page)->getDataCurrentAndPersistent(); 273*04fd306cSNickeau $persistent = $metadata[MetadataDokuWikiStore::PERSISTENT_DOKUWIKI_KEY]; 274*04fd306cSNickeau ksort($persistent); 275*04fd306cSNickeau $current = $metadata[MetadataDokuWikiStore::CURRENT_METADATA]; 276*04fd306cSNickeau ksort($current); 277*04fd306cSNickeau $form = FormMeta::create("raw_metadata") 278*04fd306cSNickeau ->addField( 279*04fd306cSNickeau FormMetaField::create(MetadataDokuWikiStore::PERSISTENT_DOKUWIKI_KEY, DataType::JSON_TYPE_VALUE) 280*04fd306cSNickeau ->setLabel("Persistent Metadata (User Metadata)") 281*04fd306cSNickeau ->setTab("persistent") 282*04fd306cSNickeau ->setDescription("The persistent metadata contains raw values. They contains the values set by the user and the fixed values such as page id.") 283*04fd306cSNickeau ->addValue(json_encode($persistent)) 284*04fd306cSNickeau ) 285*04fd306cSNickeau ->addField(FormMetaField::create(MetadataDokuWikiStore::CURRENT_METADATA, DataType::JSON_TYPE_VALUE) 286*04fd306cSNickeau ->setLabel("Current (Derived) Metadata") 287*04fd306cSNickeau ->setTab("current") 288*04fd306cSNickeau ->setDescription("The current metadata are the derived / calculated / runtime metadata values (extended with the persistent metadata).") 289*04fd306cSNickeau ->addValue(json_encode($current)) 290*04fd306cSNickeau ->setMutable(false) 291*04fd306cSNickeau ) 292*04fd306cSNickeau ->toAssociativeArray(); 293*04fd306cSNickeau 294*04fd306cSNickeau ExecutionContext::getActualOrCreateFromEnv() 295*04fd306cSNickeau ->response() 296*04fd306cSNickeau ->setStatus(HttpResponseStatus::ALL_GOOD) 297*04fd306cSNickeau ->setEvent($event) 298*04fd306cSNickeau ->setCanonical(MetaManagerHandler::CANONICAL) 299*04fd306cSNickeau ->setBody(json_encode($form), Mime::getJson()) 300*04fd306cSNickeau ->end(); 301*04fd306cSNickeau 302*04fd306cSNickeau } 303*04fd306cSNickeau 304*04fd306cSNickeau private static function handleViewerPost(Doku_Event $event, MarkupPath $page, array $post) 305*04fd306cSNickeau { 306*04fd306cSNickeau 307*04fd306cSNickeau $metadataStore = MetadataDokuWikiStore::getOrCreateFromResource($page); 308*04fd306cSNickeau $actualMeta = $metadataStore->getDataCurrentAndPersistent(); 309*04fd306cSNickeau 310*04fd306cSNickeau /** 311*04fd306cSNickeau * @var Message[] 312*04fd306cSNickeau */ 313*04fd306cSNickeau $messages = []; 314*04fd306cSNickeau /** 315*04fd306cSNickeau * Technically, persistent is a copy of persistent data 316*04fd306cSNickeau * but on the ui for now, only persistent data can be modified 317*04fd306cSNickeau */ 318*04fd306cSNickeau $postMeta = json_decode($post[MetadataDokuWikiStore::PERSISTENT_DOKUWIKI_KEY], true); 319*04fd306cSNickeau if ($postMeta === null) { 320*04fd306cSNickeau ExecutionContext::getActualOrCreateFromEnv() 321*04fd306cSNickeau ->response() 322*04fd306cSNickeau ->setStatus(HttpResponseStatus::BAD_REQUEST) 323*04fd306cSNickeau ->setEvent($event) 324*04fd306cSNickeau ->setBodyAsJsonMessage("The metadata should be in json format") 325*04fd306cSNickeau ->end(); 326*04fd306cSNickeau return; 327*04fd306cSNickeau } 328*04fd306cSNickeau 329*04fd306cSNickeau 330*04fd306cSNickeau $managedMetaMessageSuffix = "is a managed metadata, you need to use the metadata manager to delete it"; 331*04fd306cSNickeau 332*04fd306cSNickeau /** 333*04fd306cSNickeau * Process the actual attribute 334*04fd306cSNickeau * We loop only over the persistent metadata 335*04fd306cSNickeau * that are the one that we want change 336*04fd306cSNickeau */ 337*04fd306cSNickeau $persistentMetadata = $actualMeta[MetadataDokuWikiStore::PERSISTENT_DOKUWIKI_KEY]; 338*04fd306cSNickeau foreach ($persistentMetadata as $key => $value) { 339*04fd306cSNickeau 340*04fd306cSNickeau $postMetaValue = null; 341*04fd306cSNickeau if (isset($postMeta[$key])) { 342*04fd306cSNickeau $postMetaValue = $postMeta[$key]; 343*04fd306cSNickeau unset($postMeta[$key]); 344*04fd306cSNickeau } 345*04fd306cSNickeau 346*04fd306cSNickeau try { 347*04fd306cSNickeau $metadata = MetadataSystem::getForName($key); 348*04fd306cSNickeau } catch (ExceptionNotFound $e) { 349*04fd306cSNickeau $metadata = null; 350*04fd306cSNickeau } 351*04fd306cSNickeau 352*04fd306cSNickeau if ($postMetaValue === null) { 353*04fd306cSNickeau 354*04fd306cSNickeau if ($metadata!==null && $metadata->isMutable()) { 355*04fd306cSNickeau $messages[] = Message::createInfoMessage("The metadata ($key) $managedMetaMessageSuffix"); 356*04fd306cSNickeau continue; 357*04fd306cSNickeau } 358*04fd306cSNickeau if (in_array($key, Metadata::NOT_MODIFIABLE_PERSISTENT_METADATA)) { 359*04fd306cSNickeau $messages[] = Message::createInfoMessage("The metadata ($key) is a internal metadata, you can't delete it"); 360*04fd306cSNickeau continue; 361*04fd306cSNickeau } 362*04fd306cSNickeau unset($actualMeta[MetadataDokuWikiStore::CURRENT_METADATA][$key]); 363*04fd306cSNickeau unset($actualMeta[MetadataDokuWikiStore::PERSISTENT_DOKUWIKI_KEY][$key]); 364*04fd306cSNickeau $messages[] = Message::createInfoMessage("The metadata ($key) with the value ($value) was deleted"); 365*04fd306cSNickeau } else { 366*04fd306cSNickeau if ($value !== $postMetaValue) { 367*04fd306cSNickeau if ($metadata!==null && $metadata->isMutable()) { 368*04fd306cSNickeau $messages[] = Message::createInfoMessage("The metadata ($key) $managedMetaMessageSuffix"); 369*04fd306cSNickeau continue; 370*04fd306cSNickeau } 371*04fd306cSNickeau if (in_array($key, Metadata::NOT_MODIFIABLE_PERSISTENT_METADATA)) { 372*04fd306cSNickeau $messages[] = Message::createInfoMessage("The metadata ($key) is a internal metadata, you can't modify it"); 373*04fd306cSNickeau continue; 374*04fd306cSNickeau } 375*04fd306cSNickeau $actualMeta[MetadataDokuWikiStore::CURRENT_METADATA][$key] = $postMetaValue; 376*04fd306cSNickeau $actualMeta[MetadataDokuWikiStore::PERSISTENT_DOKUWIKI_KEY][$key] = $postMetaValue; 377*04fd306cSNickeau $messages[] = Message::createInfoMessage("The metadata ($key) was updated to the value ($postMetaValue) - Old value ($value)"); 378*04fd306cSNickeau } 379*04fd306cSNickeau } 380*04fd306cSNickeau } 381*04fd306cSNickeau /** 382*04fd306cSNickeau * Process the new attribute 383*04fd306cSNickeau */ 384*04fd306cSNickeau foreach ($postMeta as $key => $value) { 385*04fd306cSNickeau 386*04fd306cSNickeau try { 387*04fd306cSNickeau $metadata = MetadataSystem::getForName($key); 388*04fd306cSNickeau if ($metadata->isMutable()) { 389*04fd306cSNickeau // This meta should be modified via the form 390*04fd306cSNickeau $messages[] = Message::createInfoMessage("The metadata ($key) can only be added via the meta manager"); 391*04fd306cSNickeau continue; 392*04fd306cSNickeau } 393*04fd306cSNickeau } catch (ExceptionNotFound $e) { 394*04fd306cSNickeau // 395*04fd306cSNickeau } 396*04fd306cSNickeau 397*04fd306cSNickeau if (in_array($key, Metadata::NOT_MODIFIABLE_PERSISTENT_METADATA)) { 398*04fd306cSNickeau // this meta are not modifiable 399*04fd306cSNickeau $messages[] = Message::createInfoMessage("The metadata ($key) is a internal metadata, you can't modify it"); 400*04fd306cSNickeau continue; 401*04fd306cSNickeau } 402*04fd306cSNickeau $actualMeta[MetadataDokuWikiStore::CURRENT_METADATA][$key] = $value; 403*04fd306cSNickeau $actualMeta[MetadataDokuWikiStore::PERSISTENT_DOKUWIKI_KEY][$key] = $value; 404*04fd306cSNickeau $messages[] = Message::createInfoMessage("The metadata ($key) was created with the value ($value)"); 405*04fd306cSNickeau } 406*04fd306cSNickeau 407*04fd306cSNickeau 408*04fd306cSNickeau p_save_metadata($page->getWikiId(), $actualMeta); 409*04fd306cSNickeau 410*04fd306cSNickeau if (sizeof($messages) !== 0) { 411*04fd306cSNickeau $messagesToSend = []; 412*04fd306cSNickeau foreach ($messages as $message) { 413*04fd306cSNickeau $messagesToSend[] = $message->getPlainTextContent(); 414*04fd306cSNickeau } 415*04fd306cSNickeau } else { 416*04fd306cSNickeau $messagesToSend = "No metadata has been changed."; 417*04fd306cSNickeau } 418*04fd306cSNickeau ExecutionContext::getActualOrCreateFromEnv() 419*04fd306cSNickeau ->response() 420*04fd306cSNickeau ->setStatus(HttpResponseStatus::ALL_GOOD) 421*04fd306cSNickeau ->setEvent($event) 422*04fd306cSNickeau ->setBodyAsJsonMessage($messagesToSend) 423*04fd306cSNickeau ->end(); 424*04fd306cSNickeau 425*04fd306cSNickeau } 426*04fd306cSNickeau} 427