diff --git a/src/Manager/ElementMetaDataManager.php b/src/Manager/ElementMetaDataManager.php index 3407dd2..de8d402 100644 --- a/src/Manager/ElementMetaDataManager.php +++ b/src/Manager/ElementMetaDataManager.php @@ -152,54 +152,38 @@ public function saveElementData( // remove empty meta data if ($sanitizedData === null) { - if ($elementMetaData->getId() > 0) { - $this->entityManager->remove($elementMetaData); - $this->entityManager->flush(); - } - return; - } - - $elementMetaData->setData($sanitizedData); + if ($releaseType === ElementMetaDataInterface::RELEASE_TYPE_DRAFT) { - $this->entityManager->persist($elementMetaData); - $this->entityManager->flush(); - } - - private function determinateElementMetaEntity( - string $elementType, - int $elementId, - string $integratorName, - string $releaseType = ElementMetaDataInterface::RELEASE_TYPE_PUBLIC - ): ?ElementMetaDataInterface { + // if draft, we still persist an empty element + // to determinate reset when publish state is incoming - $hasDraft = $this->elementMetaDataExistsWithReleaseType($elementType, $elementId, ElementMetaDataInterface::RELEASE_TYPE_DRAFT); + if ( + $elementMetaData->getId() > 0 || + $this->elementMetaDataExistsWithReleaseType($elementType, $elementId, ElementMetaDataInterface::RELEASE_TYPE_PUBLIC, $integratorName) + ) { + $this->persistElementMetaData($elementMetaData, []); + } - if ($releaseType === ElementMetaDataInterface::RELEASE_TYPE_PUBLIC && $hasDraft === true) { + return; + } - // delete draft - $this->deleteElementData($elementType, $elementId, ElementMetaDataInterface::RELEASE_TYPE_DRAFT); + if ($elementMetaData->getId() > 0) { + $this->entityManager->remove($elementMetaData); + $this->entityManager->flush(); + } - return $this->elementMetaDataRepository->findByIntegrator($elementType, $elementId, $integratorName, $releaseType); + return; } - return $this->elementMetaDataRepository->findByIntegrator($elementType, $elementId, $integratorName, $releaseType); + $this->persistElementMetaData($elementMetaData, $sanitizedData); } - private function elementMetaDataExistsWithReleaseType(string $elementType, int $elementId, string $releaseType): bool + private function persistElementMetaData(ElementMetaDataInterface $elementMetaData, array $data): void { - $qb = $this->elementMetaDataRepository->getQueryBuilder(); - - return $qb - ->select('COUNT(e.id)') - ->andWhere('e.elementType = :elementType') - ->andWhere('e.elementId = :elementId') - ->andWhere('e.releaseType = :releaseType') - ->setParameter('elementType', $elementType) - ->setParameter('elementId', $elementId) - ->setParameter('releaseType', $releaseType) - ->getQuery() - ->getSingleScalarResult() > 0; + $elementMetaData->setData($data); + $this->entityManager->persist($elementMetaData); + $this->entityManager->flush(); } public function generatePreviewDataForElement(string $elementType, int $elementId, string $integratorName, ?string $template, array $data): array @@ -323,4 +307,49 @@ protected function getDocumentLegacyData(int $documentId): ?array 'hasTitleDescriptionIntegrator' => $hasTitleDescriptionIntegrator !== false ]; } + + private function determinateElementMetaEntity( + string $elementType, + int $elementId, + string $integratorName, + string $releaseType = ElementMetaDataInterface::RELEASE_TYPE_PUBLIC + ): ?ElementMetaDataInterface { + + $hasDraft = $this->elementMetaDataExistsWithReleaseType($elementType, $elementId, ElementMetaDataInterface::RELEASE_TYPE_DRAFT); + + if ($releaseType === ElementMetaDataInterface::RELEASE_TYPE_PUBLIC && $hasDraft === true) { + + // delete draft + $this->deleteElementData($elementType, $elementId, ElementMetaDataInterface::RELEASE_TYPE_DRAFT); + + return $this->elementMetaDataRepository->findByIntegrator($elementType, $elementId, $integratorName, $releaseType); + } + + return $this->elementMetaDataRepository->findByIntegrator($elementType, $elementId, $integratorName, $releaseType); + } + + private function elementMetaDataExistsWithReleaseType(string $elementType, int $elementId, string $releaseType, ?string $integratorName = null): bool + { + $qb = $this->elementMetaDataRepository->getQueryBuilder(); + + $qb + ->select('COUNT(e.id)') + ->andWhere('e.elementType = :elementType') + ->andWhere('e.elementId = :elementId') + ->andWhere('e.releaseType = :releaseType') + ->setParameter('elementType', $elementType) + ->setParameter('elementId', $elementId) + ->setParameter('releaseType', $releaseType); + + if ($integratorName !== null) { + $qb + ->andWhere('e.integrator = :integratorName') + ->setParameter('integratorName', $integratorName); + } + + return $qb + ->getQuery() + ->getSingleScalarResult() > 0; + } + }