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