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