diff --git a/lib/API/JSON/v1/ImportExport.php b/lib/API/JSON/v1/ImportExport.php index 5c36bf28a6..95f2537f77 100644 --- a/lib/API/JSON/v1/ImportExport.php +++ b/lib/API/JSON/v1/ImportExport.php @@ -12,8 +12,7 @@ use MailPoet\Newsletter\Options\NewsletterOptionsRepository; use MailPoet\Segments\WP; use MailPoet\Subscribers\ImportExport\Import\Import; use MailPoet\Subscribers\ImportExport\Import\MailChimp; -use MailPoet\Subscribers\SubscriberCustomFieldRepository; -use MailPoet\Subscribers\SubscriberSegmentRepository; +use MailPoet\Subscribers\ImportExport\ImportExportRepository; use MailPoet\Subscribers\SubscribersRepository; use MailPoetVendor\Carbon\Carbon; @@ -25,18 +24,15 @@ class ImportExport extends APIEndpoint { /** @var CustomFieldsRepository */ private $customFieldsRepository; + /** @var ImportExportRepository */ + private $importExportRepository; + /** @var NewsletterOptionsRepository */ private $newsletterOptionsRepository; - /** @var SubscriberCustomFieldRepository */ - private $subscriberCustomFieldRepository; - /** @var SubscribersRepository */ private $subscriberRepository; - /** @var SubscriberSegmentRepository */ - private $subscriberSegmentRepository; - public $permissions = [ 'global' => AccessControl::PERMISSION_MANAGE_SUBSCRIBERS, ]; @@ -44,17 +40,15 @@ class ImportExport extends APIEndpoint { public function __construct( WP $wpSegment, CustomFieldsRepository $customFieldsRepository, + ImportExportRepository $importExportRepository, NewsletterOptionsRepository $newsletterOptionsRepository, - SubscriberCustomFieldRepository $subscriberCustomFieldRepository, - SubscribersRepository $subscribersRepository, - SubscriberSegmentRepository $subscriberSegmentRepository + SubscribersRepository $subscribersRepository ) { $this->wpSegment = $wpSegment; $this->customFieldsRepository = $customFieldsRepository; + $this->importExportRepository = $importExportRepository; $this->newsletterOptionsRepository = $newsletterOptionsRepository; - $this->subscriberCustomFieldRepository = $subscriberCustomFieldRepository; $this->subscriberRepository = $subscribersRepository; - $this->subscriberSegmentRepository = $subscriberSegmentRepository; } public function getMailChimpLists($data) { @@ -99,10 +93,9 @@ class ImportExport extends APIEndpoint { $import = new Import( $this->wpSegment, $this->customFieldsRepository, + $this->importExportRepository, $this->newsletterOptionsRepository, - $this->subscriberCustomFieldRepository, $this->subscriberRepository, - $this->subscriberSegmentRepository, json_decode($data, true) ); $process = $import->process(); diff --git a/lib/Subscribers/ImportExport/Import/Import.php b/lib/Subscribers/ImportExport/Import/Import.php index 8f26d1d94f..bacfa6a3ba 100644 --- a/lib/Subscribers/ImportExport/Import/Import.php +++ b/lib/Subscribers/ImportExport/Import/Import.php @@ -4,14 +4,15 @@ namespace MailPoet\Subscribers\ImportExport\Import; use MailPoet\CustomFields\CustomFieldsRepository; use MailPoet\Entities\CustomFieldEntity; +use MailPoet\Entities\SubscriberCustomFieldEntity; use MailPoet\Entities\SubscriberEntity; +use MailPoet\Entities\SubscriberSegmentEntity; use MailPoet\Models\ModelValidator; use MailPoet\Newsletter\Options\NewsletterOptionsRepository; use MailPoet\Segments\WP; use MailPoet\Subscribers\ImportExport\ImportExportFactory; +use MailPoet\Subscribers\ImportExport\ImportExportRepository; use MailPoet\Subscribers\Source; -use MailPoet\Subscribers\SubscriberCustomFieldRepository; -use MailPoet\Subscribers\SubscriberSegmentRepository; use MailPoet\Subscribers\SubscribersRepository; use MailPoet\Util\DateConverter; use MailPoet\Util\Helpers; @@ -34,39 +35,37 @@ class Import { const DB_QUERY_CHUNK_SIZE = 100; const STATUS_DONT_UPDATE = 'dont_update'; + public const ACTION_CREATE = 'create'; + public const ACTION_UPDATE = 'update'; + /** @var WP */ private $wpSegment; /** @var CustomFieldsRepository */ private $customFieldsRepository; + /** @var ImportExportRepository */ + private $importExportRepository; + /** @var NewsletterOptionsRepository */ private $newsletterOptionsRepository; - /** @var SubscriberCustomFieldRepository */ - private $subscriberCustomFieldRepository; - /** @var SubscribersRepository */ private $subscriberRepository; - /** @var SubscriberSegmentRepository */ - private $subscriberSegmentRepository; - public function __construct( WP $wpSegment, CustomFieldsRepository $customFieldsRepository, + ImportExportRepository $importExportRepository, NewsletterOptionsRepository $newsletterOptionsRepository, - SubscriberCustomFieldRepository $subscriberCustomFieldRepository, SubscribersRepository $subscriberRepository, - SubscriberSegmentRepository $subscriberSegmentRepository, array $data ) { $this->wpSegment = $wpSegment; $this->customFieldsRepository = $customFieldsRepository; + $this->importExportRepository = $importExportRepository; $this->newsletterOptionsRepository = $newsletterOptionsRepository; - $this->subscriberCustomFieldRepository = $subscriberCustomFieldRepository; $this->subscriberRepository = $subscriberRepository; - $this->subscriberSegmentRepository = $subscriberSegmentRepository; $this->validateImportData($data); $this->subscribersData = $this->transformSubscribersData( $data['subscribers'], @@ -141,6 +140,7 @@ class Import { $newSubscribers = $this->setLinkToken($newSubscribers); $createdSubscribers = $this->createOrUpdateSubscribers( + self::ACTION_CREATE, $newSubscribers, $this->subscribersCustomFields ); @@ -157,6 +157,7 @@ class Import { } $updatedSubscribers = $this->createOrUpdateSubscribers( + self::ACTION_UPDATE, $existingSubscribers, $this->subscribersCustomFields ); @@ -380,6 +381,7 @@ class Import { } public function createOrUpdateSubscribers( + string $action, array $subscribersData, array $subscribersCustomFields = [] ) { @@ -390,11 +392,20 @@ class Import { }, $subscribersData['fields']); }, range(0, $subscribersCount - 1)); foreach (array_chunk($subscribers, self::DB_QUERY_CHUNK_SIZE) as $data) { - $this->subscriberRepository->insertOrUpdateMultiple( - $subscribersData['fields'], - $data, - $this->updatedAt - ); + if ($action === self::ACTION_CREATE) { + $this->importExportRepository->insertMultiple( + SubscriberEntity::class, + $subscribersData['fields'], + $data + ); + } elseif ($action === self::ACTION_UPDATE) { + $this->importExportRepository->updateMultiple( + SubscriberEntity::class, + $subscribersData['fields'], + $data, + $this->updatedAt + ); + } } $createdOrUpdatedSubscribers = []; foreach (array_chunk($subscribersData['data']['email'], self::DB_QUERY_CHUNK_SIZE) as $emails) { @@ -408,6 +419,7 @@ class Import { $createdOrUpdatedSubscribersIds = array_column($createdOrUpdatedSubscribers, 'id'); if ($subscribersCustomFields) { $this->createOrUpdateCustomFields( + $action, $createdOrUpdatedSubscribers, $subscribersData, $subscribersCustomFields @@ -421,6 +433,7 @@ class Import { } public function createOrUpdateCustomFields( + string $acion, array $createdOrUpdatedSubscribers, array $subscribersData, array $subscribersCustomFieldsIds @@ -455,11 +468,19 @@ class Import { 'created_at', ]; foreach (array_chunk($subscribersCustomFieldsData, self::DB_QUERY_CHUNK_SIZE) as $subscribersCustomFieldsDataChunk) { - $this->subscriberCustomFieldRepository->insertOrUpdateMultiple( + $this->importExportRepository->insertMultiple( + SubscriberCustomFieldEntity::class, $columns, - $subscribersCustomFieldsDataChunk, - $this->updatedAt + $subscribersCustomFieldsDataChunk ); + if ($acion === self::ACTION_UPDATE) { + $this->importExportRepository->updateMultiple( + SubscriberCustomFieldEntity::class, + $columns, + $subscribersCustomFieldsDataChunk, + $this->updatedAt + ); + } } } @@ -484,7 +505,11 @@ class Import { ]; }, $subscriberIdsChunk)); } - $this->subscriberSegmentRepository->insertOrUpdateMultiple($columns, $data, $this->updatedAt); + $this->importExportRepository->insertMultiple( + SubscriberSegmentEntity::class, + $columns, + $data + ); } } } diff --git a/tests/integration/Subscribers/ImportExport/Import/ImportTest.php b/tests/integration/Subscribers/ImportExport/Import/ImportTest.php index 8365e44df9..87e01da85a 100644 --- a/tests/integration/Subscribers/ImportExport/Import/ImportTest.php +++ b/tests/integration/Subscribers/ImportExport/Import/ImportTest.php @@ -12,6 +12,7 @@ use MailPoet\Entities\SubscriberSegmentEntity; use MailPoet\Newsletter\Options\NewsletterOptionsRepository; use MailPoet\Segments\SegmentsRepository; use MailPoet\Segments\WP; +use MailPoet\Subscribers\ImportExport\ImportExportRepository; use MailPoet\Subscribers\SubscriberCustomFieldRepository; use MailPoet\Subscribers\SubscriberSegmentRepository; use MailPoet\Subscribers\SubscribersRepository; @@ -36,6 +37,9 @@ class ImportTest extends \MailPoetTest { /** @var CustomFieldsRepository */ private $customFieldsRepository; + /** @var ImportExportRepository */ + private $importExportRepository; + /** @var NewsletterOptionsRepository */ private $newsletterOptionsRepository; @@ -54,6 +58,7 @@ class ImportTest extends \MailPoetTest { public function _before() { $this->wpSegment = $this->diContainer->get(WP::class); $this->customFieldsRepository = $this->diContainer->get(CustomFieldsRepository::class); + $this->importExportRepository = $this->diContainer->get(ImportExportRepository::class); $this->newsletterOptionsRepository = $this->diContainer->get(NewsletterOptionsRepository::class); $this->segmentsRepository = $this->diContainer->get(SegmentsRepository::class); $this->subscriberCustomFieldRepository = $this->diContainer->get(SubscriberCustomFieldRepository::class); @@ -315,6 +320,7 @@ class ImportTest extends \MailPoetTest { 'fields' => $this->subscribersFields, ]; $this->import->createOrUpdateSubscribers( + Import::ACTION_CREATE, $subscribersData ); $subscribers = $this->subscriberRepository->findAll(); @@ -323,6 +329,7 @@ class ImportTest extends \MailPoetTest { ->equals($subscribersData['data']['email'][0]); $subscribersData['data']['first_name'][1] = 'MaryJane'; $this->import->createOrUpdateSubscribers( + Import::ACTION_UPDATE, $subscribersData ); $this->entityManager->clear(); @@ -342,6 +349,7 @@ class ImportTest extends \MailPoetTest { ]; $subscribersData['fields'][] = 'deleted_at'; $this->import->createOrUpdateSubscribers( + Import::ACTION_CREATE, $subscribersData ); $dbSubscribers = array_map(function (SubscriberEntity $subscriber): int { @@ -370,6 +378,7 @@ class ImportTest extends \MailPoetTest { ]; $customField = $this->subscribersCustomFields[0]; $this->import->createOrUpdateSubscribers( + Import::ACTION_CREATE, $subscribersData, $this->subscribersFields ); @@ -380,6 +389,7 @@ class ImportTest extends \MailPoetTest { ]; }, $this->subscriberRepository->findAll()); $this->import->createOrUpdateCustomFields( + Import::ACTION_CREATE, $dbSubscribers, $subscribersData, $this->subscribersCustomFields @@ -390,6 +400,7 @@ class ImportTest extends \MailPoetTest { ->equals($subscribersData['data'][$customField][0]); $subscribersData[$customField][1] = 'Rio'; $this->import->createOrUpdateCustomFields( + Import::ACTION_UPDATE, $dbSubscribers, $subscribersData, $this->subscribersCustomFields @@ -405,6 +416,7 @@ class ImportTest extends \MailPoetTest { 'fields' => $this->subscribersFields, ]; $this->import->createOrUpdateSubscribers( + Import::ACTION_CREATE, $subscribersData, $this->subscribersFields ); @@ -441,6 +453,7 @@ class ImportTest extends \MailPoetTest { date('Y-m-d H:i:s'), ]; $this->import->createOrUpdateSubscribers( + Import::ACTION_CREATE, $subscribersData ); } @@ -594,10 +607,9 @@ class ImportTest extends \MailPoetTest { return new Import( $this->wpSegment, $this->customFieldsRepository, + $this->importExportRepository, $this->newsletterOptionsRepository, - $this->subscriberCustomFieldRepository, $this->subscriberRepository, - $this->subscriberSegmentRepository, $data ); }