xref: /plugin/combo/ComboStrap/MetadataStoreTransfer.php (revision c3437056399326d621a01da73b649707fbb0ae69)
1*c3437056SNickeau<?php
2*c3437056SNickeau
3*c3437056SNickeau
4*c3437056SNickeaunamespace ComboStrap;
5*c3437056SNickeau
6*c3437056SNickeau
7*c3437056SNickeauclass MetadataStoreTransfer
8*c3437056SNickeau{
9*c3437056SNickeau
10*c3437056SNickeau    /**
11*c3437056SNickeau     * @var MetadataStore
12*c3437056SNickeau     */
13*c3437056SNickeau    private $sourceStore;
14*c3437056SNickeau    /**
15*c3437056SNickeau     * @var MetadataStore
16*c3437056SNickeau     */
17*c3437056SNickeau    private $targetStore;
18*c3437056SNickeau
19*c3437056SNickeau    /**
20*c3437056SNickeau     * @var Page
21*c3437056SNickeau     */
22*c3437056SNickeau    private $page;
23*c3437056SNickeau    /**
24*c3437056SNickeau     * @var array - the normalized data after processing
25*c3437056SNickeau     * Name of metadata may be deprecated
26*c3437056SNickeau     * After processing, this array will have the new keys
27*c3437056SNickeau     * Use in a frontmatter to send correct data to the rendering metadata phase
28*c3437056SNickeau     */
29*c3437056SNickeau    private $normalizedData;
30*c3437056SNickeau    /**
31*c3437056SNickeau     * @var array - the processing messages
32*c3437056SNickeau     */
33*c3437056SNickeau    private $messages;
34*c3437056SNickeau
35*c3437056SNickeau    /**
36*c3437056SNickeau     * MetadataStoreTransfer constructor.
37*c3437056SNickeau     * @param Page $resource
38*c3437056SNickeau     */
39*c3437056SNickeau    public function __construct(ResourceCombo $resource)
40*c3437056SNickeau    {
41*c3437056SNickeau        $this->page = $resource;
42*c3437056SNickeau    }
43*c3437056SNickeau
44*c3437056SNickeau
45*c3437056SNickeau    public static function createForPage($page): MetadataStoreTransfer
46*c3437056SNickeau    {
47*c3437056SNickeau        return new MetadataStoreTransfer($page);
48*c3437056SNickeau    }
49*c3437056SNickeau
50*c3437056SNickeau    public function fromStore(MetadataStore $sourceStore): MetadataStoreTransfer
51*c3437056SNickeau    {
52*c3437056SNickeau        $this->sourceStore = $sourceStore;
53*c3437056SNickeau        return $this;
54*c3437056SNickeau    }
55*c3437056SNickeau
56*c3437056SNickeau    public function toStore(MetadataStore $targetStore): MetadataStoreTransfer
57*c3437056SNickeau    {
58*c3437056SNickeau        $this->targetStore = $targetStore;
59*c3437056SNickeau        return $this;
60*c3437056SNickeau    }
61*c3437056SNickeau
62*c3437056SNickeau    /**
63*c3437056SNickeau     * @param array $data
64*c3437056SNickeau     * @return $this
65*c3437056SNickeau     */
66*c3437056SNickeau    public function process(array $data): MetadataStoreTransfer
67*c3437056SNickeau    {
68*c3437056SNickeau        $messages = [];
69*c3437056SNickeau
70*c3437056SNickeau        /**
71*c3437056SNickeau         * Pre-processing
72*c3437056SNickeau         * Check/ validity and list of metadata building
73*c3437056SNickeau         */
74*c3437056SNickeau        $metadatas = [];
75*c3437056SNickeau        foreach ($data as $persistentName => $value) {
76*c3437056SNickeau
77*c3437056SNickeau
78*c3437056SNickeau            $metadata = Metadata::getForName($persistentName);
79*c3437056SNickeau
80*c3437056SNickeau            /**
81*c3437056SNickeau             * Take old name or renaming into account
82*c3437056SNickeau             *
83*c3437056SNickeau             * ie The old key should be replace by the new one
84*c3437056SNickeau             * (ie {@link \ComboStrap\PagePublicationDate::OLD_META_KEY}
85*c3437056SNickeau             * by {@link \ComboStrap\PagePublicationDate::PROPERTY_NAME}
86*c3437056SNickeau             */
87*c3437056SNickeau            $name = $persistentName;
88*c3437056SNickeau            if ($metadata !== null) {
89*c3437056SNickeau                $name = $metadata::getName();
90*c3437056SNickeau                $persistentName = $metadata::getPersistentName();
91*c3437056SNickeau            }
92*c3437056SNickeau            $this->normalizedData[$persistentName] = $value;
93*c3437056SNickeau
94*c3437056SNickeau            /**
95*c3437056SNickeau             * Not modifiable meta check
96*c3437056SNickeau             */
97*c3437056SNickeau            if (in_array($name, Metadata::NOT_MODIFIABLE_METAS)) {
98*c3437056SNickeau                $messages[] = Message::createWarningMessage("The metadata ($name) is a protected metadata and cannot be modified")
99*c3437056SNickeau                    ->setCanonical(Metadata::CANONICAL);
100*c3437056SNickeau                continue;
101*c3437056SNickeau            }
102*c3437056SNickeau
103*c3437056SNickeau            /**
104*c3437056SNickeau             * Unknown meta
105*c3437056SNickeau             */
106*c3437056SNickeau            if ($metadata === null) {
107*c3437056SNickeau                $this->targetStore->setFromPersistentName($persistentName, $value);
108*c3437056SNickeau                continue;
109*c3437056SNickeau            }
110*c3437056SNickeau
111*c3437056SNickeau            /**
112*c3437056SNickeau             * Valid meta to proceed in the next phase
113*c3437056SNickeau             */
114*c3437056SNickeau            $metadatas[$name] = $metadata;
115*c3437056SNickeau
116*c3437056SNickeau        }
117*c3437056SNickeau
118*c3437056SNickeau
119*c3437056SNickeau        foreach ($metadatas as $metadata) {
120*c3437056SNickeau
121*c3437056SNickeau
122*c3437056SNickeau            /**
123*c3437056SNickeau             * Persistent ?
124*c3437056SNickeau             */
125*c3437056SNickeau            if ($metadata->getPersistenceType() !== Metadata::PERSISTENT_METADATA) {
126*c3437056SNickeau                $messages[] = Message::createWarningMessage("The metadata ({$metadata->getName()}) is not persistent and cannot be modified")
127*c3437056SNickeau                    ->setCanonical($metadata->getCanonical());
128*c3437056SNickeau                continue;
129*c3437056SNickeau            }
130*c3437056SNickeau
131*c3437056SNickeau            /**
132*c3437056SNickeau             * Sync
133*c3437056SNickeau             */
134*c3437056SNickeau            try {
135*c3437056SNickeau                $metadata
136*c3437056SNickeau                    ->setResource($this->page)
137*c3437056SNickeau                    ->setReadStore($this->sourceStore)
138*c3437056SNickeau                    ->buildFromReadStore()
139*c3437056SNickeau                    ->setWriteStore($this->targetStore)
140*c3437056SNickeau                    ->sendToWriteStore();
141*c3437056SNickeau            } catch (ExceptionCombo $e) {
142*c3437056SNickeau                $messages[] = Message::createErrorMessage("Error while replicating the meta ($metadata) from the store ($this->sourceStore) to the store ($this->targetStore). Message: " . $e->getMessage())
143*c3437056SNickeau                    ->setCanonical($metadata->getCanonical());
144*c3437056SNickeau            }
145*c3437056SNickeau        }
146*c3437056SNickeau        $this->targetStore->persist();
147*c3437056SNickeau
148*c3437056SNickeau        $this->messages = $messages;
149*c3437056SNickeau        return $this;
150*c3437056SNickeau    }
151*c3437056SNickeau
152*c3437056SNickeau    /**
153*c3437056SNickeau     * @return Message[]
154*c3437056SNickeau     */
155*c3437056SNickeau    public function getMessages(): array
156*c3437056SNickeau    {
157*c3437056SNickeau        return $this->messages;
158*c3437056SNickeau    }
159*c3437056SNickeau
160*c3437056SNickeau    public function getNormalizedDataArray(): array
161*c3437056SNickeau    {
162*c3437056SNickeau        return $this->normalizedData;
163*c3437056SNickeau    }
164*c3437056SNickeau
165*c3437056SNickeau
166*c3437056SNickeau}
167