xref: /plugin/combo/ComboStrap/MetadataStoreTransfer.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1c3437056SNickeau<?php
2c3437056SNickeau
3c3437056SNickeau
4c3437056SNickeaunamespace ComboStrap;
5c3437056SNickeau
6c3437056SNickeau
7*04fd306cSNickeauuse ComboStrap\Meta\Api\Metadata;
8*04fd306cSNickeauuse ComboStrap\Meta\Api\MetadataStore;
9*04fd306cSNickeau
10c3437056SNickeauclass MetadataStoreTransfer
11c3437056SNickeau{
12*04fd306cSNickeau    const CANONICAL = "meta-store-transfer";
13c3437056SNickeau
14c3437056SNickeau    /**
15c3437056SNickeau     * @var MetadataStore
16c3437056SNickeau     */
17c3437056SNickeau    private $sourceStore;
18c3437056SNickeau    /**
19c3437056SNickeau     * @var MetadataStore
20c3437056SNickeau     */
21c3437056SNickeau    private $targetStore;
22c3437056SNickeau
23c3437056SNickeau    /**
24*04fd306cSNickeau     * @var MarkupPath
25c3437056SNickeau     */
26c3437056SNickeau    private $page;
27*04fd306cSNickeau
28*04fd306cSNickeau
29c3437056SNickeau    /**
30c3437056SNickeau     * @var array - the processing messages
31c3437056SNickeau     */
32*04fd306cSNickeau    private array $messages = [];
33*04fd306cSNickeau
34*04fd306cSNickeau    /**
35*04fd306cSNickeau     * @var array - the validated metadata (that may be stored)
36*04fd306cSNickeau     */
37*04fd306cSNickeau    private array $metadatasThatMayBeStored;
38*04fd306cSNickeau
39*04fd306cSNickeau    /**
40*04fd306cSNickeau     * @var Metadata[] - the original metas (no default as we check if they were already set)
41*04fd306cSNickeau     */
42*04fd306cSNickeau    private array $originalMetadatas;
43c3437056SNickeau
44c3437056SNickeau    /**
45c3437056SNickeau     * MetadataStoreTransfer constructor.
46*04fd306cSNickeau     * @param MarkupPath $resource
47c3437056SNickeau     */
48c3437056SNickeau    public function __construct(ResourceCombo $resource)
49c3437056SNickeau    {
50c3437056SNickeau        $this->page = $resource;
51c3437056SNickeau    }
52c3437056SNickeau
53c3437056SNickeau
54c3437056SNickeau    public static function createForPage($page): MetadataStoreTransfer
55c3437056SNickeau    {
56c3437056SNickeau        return new MetadataStoreTransfer($page);
57c3437056SNickeau    }
58c3437056SNickeau
59*04fd306cSNickeau    /**
60*04fd306cSNickeau     * @return $this - validate the transfer (ie the metadatas). The metadata that can be retrieved via {@link self::getValidatedMetadatas()}
61*04fd306cSNickeau     * and the bad validation messages if any via {@link self::getMessages()}
62*04fd306cSNickeau     */
63*04fd306cSNickeau    public function validate(): MetadataStoreTransfer
64*04fd306cSNickeau    {
65*04fd306cSNickeau
66*04fd306cSNickeau        if (isset($this->metadatasThatMayBeStored)) {
67*04fd306cSNickeau            return $this;
68*04fd306cSNickeau        }
69*04fd306cSNickeau        if (!isset($this->originalMetadatas)) {
70*04fd306cSNickeau            throw new ExceptionRuntimeInternal("The original metadata should be defined");
71*04fd306cSNickeau        }
72*04fd306cSNickeau
73*04fd306cSNickeau        $this->metadatasThatMayBeStored = [];
74*04fd306cSNickeau        foreach ($this->originalMetadatas as $originalMetaKey => $originalMetaValue) {
75*04fd306cSNickeau
76*04fd306cSNickeau
77*04fd306cSNickeau            try {
78*04fd306cSNickeau                $metadataObject = Meta\Api\MetadataSystem::getForName($originalMetaKey);
79*04fd306cSNickeau            } catch (ExceptionNotFound $e) {
80*04fd306cSNickeau                LogUtility::warning("The meta ($originalMetaKey) was not found", self::CANONICAL, $e);
81*04fd306cSNickeau                continue;
82*04fd306cSNickeau            }
83*04fd306cSNickeau
84*04fd306cSNickeau            /**
85*04fd306cSNickeau             * Take old name or renaming into account
86*04fd306cSNickeau             *
87*04fd306cSNickeau             * ie The old key should be replace by the new one
88*04fd306cSNickeau             * (ie {@link \ComboStrap\PagePublicationDate::OLD_META_KEY}
89*04fd306cSNickeau             * by {@link \ComboStrap\PagePublicationDate::PROPERTY_NAME}
90*04fd306cSNickeau             */
91*04fd306cSNickeau            $name = $originalMetaKey;
92*04fd306cSNickeau            if ($metadataObject !== null) {
93*04fd306cSNickeau                $name = $metadataObject::getName();
94*04fd306cSNickeau                $originalMetaKey = $metadataObject::getPersistentName();
95*04fd306cSNickeau            }
96*04fd306cSNickeau
97*04fd306cSNickeau            /**
98*04fd306cSNickeau             * Not modifiable meta check
99*04fd306cSNickeau             */
100*04fd306cSNickeau            if (in_array($name, Metadata::NOT_MODIFIABLE_METAS)) {
101*04fd306cSNickeau                $this->messages[] = Message::createWarningMessage("The metadata ($name) is a protected metadata and cannot be modified")
102*04fd306cSNickeau                    ->setCanonical(Metadata::CANONICAL);
103*04fd306cSNickeau                continue;
104*04fd306cSNickeau            }
105*04fd306cSNickeau
106*04fd306cSNickeau            /**
107*04fd306cSNickeau             * Unknown meta
108*04fd306cSNickeau             */
109*04fd306cSNickeau            if ($metadataObject === null) {
110*04fd306cSNickeau                $this->messages[] = Message::createWarningMessage("The metadata ($originalMetaKey) is unknown and was not persisted")->setCanonical(Metadata::CANONICAL);
111*04fd306cSNickeau                continue;
112*04fd306cSNickeau            }
113*04fd306cSNickeau
114*04fd306cSNickeau
115*04fd306cSNickeau            /**
116*04fd306cSNickeau             * We build and not set with {@link Metadata::setFromStoreValue()}
117*04fd306cSNickeau             * because tabular data in forms have several key by columns (ie on key is a column
118*04fd306cSNickeau             * that may have several values)
119*04fd306cSNickeau             * Therefore tabular data needs to get access to the whole source store
120*04fd306cSNickeau             * to be build
121*04fd306cSNickeau             */
122*04fd306cSNickeau            $metadataObject
123*04fd306cSNickeau                ->setResource($this->page)
124*04fd306cSNickeau                ->setReadStore($this->sourceStore)
125*04fd306cSNickeau                ->setWriteStore($this->targetStore)
126*04fd306cSNickeau                ->buildFromReadStore();
127*04fd306cSNickeau
128*04fd306cSNickeau            $this->metadatasThatMayBeStored[$name] = $metadataObject;
129*04fd306cSNickeau
130*04fd306cSNickeau        }
131*04fd306cSNickeau        return $this;
132*04fd306cSNickeau    }
133*04fd306cSNickeau
134c3437056SNickeau    public function fromStore(MetadataStore $sourceStore): MetadataStoreTransfer
135c3437056SNickeau    {
136c3437056SNickeau        $this->sourceStore = $sourceStore;
137c3437056SNickeau        return $this;
138c3437056SNickeau    }
139c3437056SNickeau
140c3437056SNickeau    public function toStore(MetadataStore $targetStore): MetadataStoreTransfer
141c3437056SNickeau    {
142c3437056SNickeau        $this->targetStore = $targetStore;
143c3437056SNickeau        return $this;
144c3437056SNickeau    }
145c3437056SNickeau
146c3437056SNickeau    /**
147*04fd306cSNickeau     * @param Metadata[]|null $data - the metadadata (@deprecate for {@link self::setMetadatas()}
148c3437056SNickeau     * @return $this
149c3437056SNickeau     */
150*04fd306cSNickeau    public function process(array $data = null): MetadataStoreTransfer
151c3437056SNickeau    {
152*04fd306cSNickeau
153*04fd306cSNickeau        /**
154*04fd306cSNickeau         * We may use this object to validate, setting before the processing
155*04fd306cSNickeau         */
156*04fd306cSNickeau        if (isset($this->originalMetadatas) && $data !== null) {
157*04fd306cSNickeau            throw new ExceptionRuntimeInternal("The metadata to process were already set");
158*04fd306cSNickeau        } else {
159*04fd306cSNickeau            $this->originalMetadatas = $data;
160*04fd306cSNickeau        }
161c3437056SNickeau        $messages = [];
162c3437056SNickeau
163c3437056SNickeau        /**
164c3437056SNickeau         * Pre-processing
165c3437056SNickeau         * Check/ validity and list of metadata building
166c3437056SNickeau         */
167*04fd306cSNickeau        $validatedMetadata = $this->validate()->getValidatedMetadatas();
168c3437056SNickeau
169*04fd306cSNickeau        foreach ($validatedMetadata as $metadata) {
170c3437056SNickeau
171c3437056SNickeau            /**
172c3437056SNickeau             * Persistent ?
173c3437056SNickeau             */
174c3437056SNickeau            if ($metadata->getPersistenceType() !== Metadata::PERSISTENT_METADATA) {
175c3437056SNickeau                $messages[] = Message::createWarningMessage("The metadata ({$metadata->getName()}) is not persistent and cannot be modified")
176c3437056SNickeau                    ->setCanonical($metadata->getCanonical());
177c3437056SNickeau                continue;
178c3437056SNickeau            }
179c3437056SNickeau
180c3437056SNickeau            /**
181c3437056SNickeau             * Sync
182c3437056SNickeau             */
183c3437056SNickeau            try {
184*04fd306cSNickeau                $metadata->sendToWriteStore();
185*04fd306cSNickeau            } catch (ExceptionCompile $e) {
186c3437056SNickeau                $messages[] = Message::createErrorMessage("Error while replicating the meta ($metadata) from the store ($this->sourceStore) to the store ($this->targetStore). Message: " . $e->getMessage())
187c3437056SNickeau                    ->setCanonical($metadata->getCanonical());
188c3437056SNickeau            }
189c3437056SNickeau        }
190c3437056SNickeau        $this->targetStore->persist();
191c3437056SNickeau
192c3437056SNickeau        $this->messages = $messages;
193c3437056SNickeau        return $this;
194c3437056SNickeau    }
195c3437056SNickeau
196c3437056SNickeau    /**
197c3437056SNickeau     * @return Message[]
198c3437056SNickeau     */
199c3437056SNickeau    public function getMessages(): array
200c3437056SNickeau    {
201c3437056SNickeau        return $this->messages;
202c3437056SNickeau    }
203c3437056SNickeau
204*04fd306cSNickeau
205*04fd306cSNickeau    /**
206*04fd306cSNickeau     * @return Metadata[] - an array where the key is the name and the value a {@link Metadata} object
207*04fd306cSNickeau     */
208*04fd306cSNickeau    public function getValidatedMetadatas(): array
209c3437056SNickeau    {
210*04fd306cSNickeau        if (!isset($this->metadatasThatMayBeStored)) {
211*04fd306cSNickeau            $this->validate();
212*04fd306cSNickeau        }
213*04fd306cSNickeau        return $this->metadatasThatMayBeStored;
214*04fd306cSNickeau    }
215*04fd306cSNickeau
216*04fd306cSNickeau    /**
217*04fd306cSNickeau     * @param Metadata[] $originalMetadatas
218*04fd306cSNickeau     * @return $this
219*04fd306cSNickeau     */
220*04fd306cSNickeau    public function setMetadatas(array $originalMetadatas): MetadataStoreTransfer
221*04fd306cSNickeau    {
222*04fd306cSNickeau        $this->originalMetadatas = $originalMetadatas;
223*04fd306cSNickeau        return $this;
224c3437056SNickeau    }
225c3437056SNickeau
226c3437056SNickeau
227c3437056SNickeau}
228