xref: /template/strap/ComboStrap/Api/MetaManagerHandler.php (revision 70bbd7f1f72440223cc13f3495efdcb2b0a11514)
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