Нет описания

SegmentSaveController.php 2.2KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. <?php
  2. namespace MailPoet\Segments;
  3. if (!defined('ABSPATH')) exit;
  4. use InvalidArgumentException;
  5. use MailPoet\Entities\SegmentEntity;
  6. use MailPoet\Entities\SubscriberSegmentEntity;
  7. use MailPoetVendor\Doctrine\ORM\EntityManager;
  8. class SegmentSaveController {
  9. /** @var SegmentsRepository */
  10. private $segmentsRepository;
  11. /** @var EntityManager */
  12. private $entityManager;
  13. public function __construct(
  14. SegmentsRepository $segmentsRepository,
  15. EntityManager $entityManager
  16. ) {
  17. $this->segmentsRepository = $segmentsRepository;
  18. $this->entityManager = $entityManager;
  19. }
  20. public function save(array $data = []): SegmentEntity {
  21. $id = isset($data['id']) ? (int)$data['id'] : null;
  22. $name = $data['name'] ?? '';
  23. $description = $data['description'] ?? '';
  24. $this->checkSegmentUniqueName($name, $id);
  25. return $this->segmentsRepository->createOrUpdate($name, $description, SegmentEntity::TYPE_DEFAULT, [], $id);
  26. }
  27. public function duplicate(SegmentEntity $segmentEntity): SegmentEntity {
  28. $duplicate = clone $segmentEntity;
  29. $duplicate->setName(sprintf(__('Copy of %s', 'mailpoet'), $segmentEntity->getName()));
  30. $this->checkSegmentUniqueName($duplicate->getName(), $duplicate->getId());
  31. $this->entityManager->transactional(function (EntityManager $entityManager) use ($duplicate, $segmentEntity) {
  32. $entityManager->persist($duplicate);
  33. $entityManager->flush();
  34. $subscriberSegmentTable = $entityManager->getClassMetadata(SubscriberSegmentEntity::class)->getTableName();
  35. $conn = $this->entityManager->getConnection();
  36. $stmt = $conn->prepare("
  37. INSERT INTO $subscriberSegmentTable (segment_id, subscriber_id, status, created_at)
  38. SELECT :duplicateId, subscriber_id, status, NOW()
  39. FROM $subscriberSegmentTable
  40. WHERE segment_id = :segmentId
  41. ");
  42. $stmt->execute([
  43. 'duplicateId' => $duplicate->getId(),
  44. 'segmentId' => $segmentEntity->getId(),
  45. ]);
  46. });
  47. return $duplicate;
  48. }
  49. private function checkSegmentUniqueName(string $name, ?int $id): void {
  50. if (!$this->segmentsRepository->isNameUnique($name, $id)) {
  51. throw new InvalidArgumentException("Segment with name: '{$name}' already exists.");
  52. }
  53. }
  54. }