Use importExportRepository in import

[MAILPOET-3378]
This commit is contained in:
Jan Lysý
2021-02-15 13:15:25 +01:00
committed by Veljko V
parent 7b893dfb51
commit 0347e44893
3 changed files with 68 additions and 38 deletions

View File

@ -12,8 +12,7 @@ use MailPoet\Newsletter\Options\NewsletterOptionsRepository;
use MailPoet\Segments\WP; use MailPoet\Segments\WP;
use MailPoet\Subscribers\ImportExport\Import\Import; use MailPoet\Subscribers\ImportExport\Import\Import;
use MailPoet\Subscribers\ImportExport\Import\MailChimp; use MailPoet\Subscribers\ImportExport\Import\MailChimp;
use MailPoet\Subscribers\SubscriberCustomFieldRepository; use MailPoet\Subscribers\ImportExport\ImportExportRepository;
use MailPoet\Subscribers\SubscriberSegmentRepository;
use MailPoet\Subscribers\SubscribersRepository; use MailPoet\Subscribers\SubscribersRepository;
use MailPoetVendor\Carbon\Carbon; use MailPoetVendor\Carbon\Carbon;
@ -25,18 +24,15 @@ class ImportExport extends APIEndpoint {
/** @var CustomFieldsRepository */ /** @var CustomFieldsRepository */
private $customFieldsRepository; private $customFieldsRepository;
/** @var ImportExportRepository */
private $importExportRepository;
/** @var NewsletterOptionsRepository */ /** @var NewsletterOptionsRepository */
private $newsletterOptionsRepository; private $newsletterOptionsRepository;
/** @var SubscriberCustomFieldRepository */
private $subscriberCustomFieldRepository;
/** @var SubscribersRepository */ /** @var SubscribersRepository */
private $subscriberRepository; private $subscriberRepository;
/** @var SubscriberSegmentRepository */
private $subscriberSegmentRepository;
public $permissions = [ public $permissions = [
'global' => AccessControl::PERMISSION_MANAGE_SUBSCRIBERS, 'global' => AccessControl::PERMISSION_MANAGE_SUBSCRIBERS,
]; ];
@ -44,17 +40,15 @@ class ImportExport extends APIEndpoint {
public function __construct( public function __construct(
WP $wpSegment, WP $wpSegment,
CustomFieldsRepository $customFieldsRepository, CustomFieldsRepository $customFieldsRepository,
ImportExportRepository $importExportRepository,
NewsletterOptionsRepository $newsletterOptionsRepository, NewsletterOptionsRepository $newsletterOptionsRepository,
SubscriberCustomFieldRepository $subscriberCustomFieldRepository, SubscribersRepository $subscribersRepository
SubscribersRepository $subscribersRepository,
SubscriberSegmentRepository $subscriberSegmentRepository
) { ) {
$this->wpSegment = $wpSegment; $this->wpSegment = $wpSegment;
$this->customFieldsRepository = $customFieldsRepository; $this->customFieldsRepository = $customFieldsRepository;
$this->importExportRepository = $importExportRepository;
$this->newsletterOptionsRepository = $newsletterOptionsRepository; $this->newsletterOptionsRepository = $newsletterOptionsRepository;
$this->subscriberCustomFieldRepository = $subscriberCustomFieldRepository;
$this->subscriberRepository = $subscribersRepository; $this->subscriberRepository = $subscribersRepository;
$this->subscriberSegmentRepository = $subscriberSegmentRepository;
} }
public function getMailChimpLists($data) { public function getMailChimpLists($data) {
@ -99,10 +93,9 @@ class ImportExport extends APIEndpoint {
$import = new Import( $import = new Import(
$this->wpSegment, $this->wpSegment,
$this->customFieldsRepository, $this->customFieldsRepository,
$this->importExportRepository,
$this->newsletterOptionsRepository, $this->newsletterOptionsRepository,
$this->subscriberCustomFieldRepository,
$this->subscriberRepository, $this->subscriberRepository,
$this->subscriberSegmentRepository,
json_decode($data, true) json_decode($data, true)
); );
$process = $import->process(); $process = $import->process();

View File

@ -4,14 +4,15 @@ namespace MailPoet\Subscribers\ImportExport\Import;
use MailPoet\CustomFields\CustomFieldsRepository; use MailPoet\CustomFields\CustomFieldsRepository;
use MailPoet\Entities\CustomFieldEntity; use MailPoet\Entities\CustomFieldEntity;
use MailPoet\Entities\SubscriberCustomFieldEntity;
use MailPoet\Entities\SubscriberEntity; use MailPoet\Entities\SubscriberEntity;
use MailPoet\Entities\SubscriberSegmentEntity;
use MailPoet\Models\ModelValidator; use MailPoet\Models\ModelValidator;
use MailPoet\Newsletter\Options\NewsletterOptionsRepository; use MailPoet\Newsletter\Options\NewsletterOptionsRepository;
use MailPoet\Segments\WP; use MailPoet\Segments\WP;
use MailPoet\Subscribers\ImportExport\ImportExportFactory; use MailPoet\Subscribers\ImportExport\ImportExportFactory;
use MailPoet\Subscribers\ImportExport\ImportExportRepository;
use MailPoet\Subscribers\Source; use MailPoet\Subscribers\Source;
use MailPoet\Subscribers\SubscriberCustomFieldRepository;
use MailPoet\Subscribers\SubscriberSegmentRepository;
use MailPoet\Subscribers\SubscribersRepository; use MailPoet\Subscribers\SubscribersRepository;
use MailPoet\Util\DateConverter; use MailPoet\Util\DateConverter;
use MailPoet\Util\Helpers; use MailPoet\Util\Helpers;
@ -34,39 +35,37 @@ class Import {
const DB_QUERY_CHUNK_SIZE = 100; const DB_QUERY_CHUNK_SIZE = 100;
const STATUS_DONT_UPDATE = 'dont_update'; const STATUS_DONT_UPDATE = 'dont_update';
public const ACTION_CREATE = 'create';
public const ACTION_UPDATE = 'update';
/** @var WP */ /** @var WP */
private $wpSegment; private $wpSegment;
/** @var CustomFieldsRepository */ /** @var CustomFieldsRepository */
private $customFieldsRepository; private $customFieldsRepository;
/** @var ImportExportRepository */
private $importExportRepository;
/** @var NewsletterOptionsRepository */ /** @var NewsletterOptionsRepository */
private $newsletterOptionsRepository; private $newsletterOptionsRepository;
/** @var SubscriberCustomFieldRepository */
private $subscriberCustomFieldRepository;
/** @var SubscribersRepository */ /** @var SubscribersRepository */
private $subscriberRepository; private $subscriberRepository;
/** @var SubscriberSegmentRepository */
private $subscriberSegmentRepository;
public function __construct( public function __construct(
WP $wpSegment, WP $wpSegment,
CustomFieldsRepository $customFieldsRepository, CustomFieldsRepository $customFieldsRepository,
ImportExportRepository $importExportRepository,
NewsletterOptionsRepository $newsletterOptionsRepository, NewsletterOptionsRepository $newsletterOptionsRepository,
SubscriberCustomFieldRepository $subscriberCustomFieldRepository,
SubscribersRepository $subscriberRepository, SubscribersRepository $subscriberRepository,
SubscriberSegmentRepository $subscriberSegmentRepository,
array $data array $data
) { ) {
$this->wpSegment = $wpSegment; $this->wpSegment = $wpSegment;
$this->customFieldsRepository = $customFieldsRepository; $this->customFieldsRepository = $customFieldsRepository;
$this->importExportRepository = $importExportRepository;
$this->newsletterOptionsRepository = $newsletterOptionsRepository; $this->newsletterOptionsRepository = $newsletterOptionsRepository;
$this->subscriberCustomFieldRepository = $subscriberCustomFieldRepository;
$this->subscriberRepository = $subscriberRepository; $this->subscriberRepository = $subscriberRepository;
$this->subscriberSegmentRepository = $subscriberSegmentRepository;
$this->validateImportData($data); $this->validateImportData($data);
$this->subscribersData = $this->transformSubscribersData( $this->subscribersData = $this->transformSubscribersData(
$data['subscribers'], $data['subscribers'],
@ -141,6 +140,7 @@ class Import {
$newSubscribers = $this->setLinkToken($newSubscribers); $newSubscribers = $this->setLinkToken($newSubscribers);
$createdSubscribers = $createdSubscribers =
$this->createOrUpdateSubscribers( $this->createOrUpdateSubscribers(
self::ACTION_CREATE,
$newSubscribers, $newSubscribers,
$this->subscribersCustomFields $this->subscribersCustomFields
); );
@ -157,6 +157,7 @@ class Import {
} }
$updatedSubscribers = $updatedSubscribers =
$this->createOrUpdateSubscribers( $this->createOrUpdateSubscribers(
self::ACTION_UPDATE,
$existingSubscribers, $existingSubscribers,
$this->subscribersCustomFields $this->subscribersCustomFields
); );
@ -380,6 +381,7 @@ class Import {
} }
public function createOrUpdateSubscribers( public function createOrUpdateSubscribers(
string $action,
array $subscribersData, array $subscribersData,
array $subscribersCustomFields = [] array $subscribersCustomFields = []
) { ) {
@ -390,11 +392,20 @@ class Import {
}, $subscribersData['fields']); }, $subscribersData['fields']);
}, range(0, $subscribersCount - 1)); }, range(0, $subscribersCount - 1));
foreach (array_chunk($subscribers, self::DB_QUERY_CHUNK_SIZE) as $data) { foreach (array_chunk($subscribers, self::DB_QUERY_CHUNK_SIZE) as $data) {
$this->subscriberRepository->insertOrUpdateMultiple( if ($action === self::ACTION_CREATE) {
$subscribersData['fields'], $this->importExportRepository->insertMultiple(
$data, SubscriberEntity::class,
$this->updatedAt $subscribersData['fields'],
); $data
);
} elseif ($action === self::ACTION_UPDATE) {
$this->importExportRepository->updateMultiple(
SubscriberEntity::class,
$subscribersData['fields'],
$data,
$this->updatedAt
);
}
} }
$createdOrUpdatedSubscribers = []; $createdOrUpdatedSubscribers = [];
foreach (array_chunk($subscribersData['data']['email'], self::DB_QUERY_CHUNK_SIZE) as $emails) { foreach (array_chunk($subscribersData['data']['email'], self::DB_QUERY_CHUNK_SIZE) as $emails) {
@ -408,6 +419,7 @@ class Import {
$createdOrUpdatedSubscribersIds = array_column($createdOrUpdatedSubscribers, 'id'); $createdOrUpdatedSubscribersIds = array_column($createdOrUpdatedSubscribers, 'id');
if ($subscribersCustomFields) { if ($subscribersCustomFields) {
$this->createOrUpdateCustomFields( $this->createOrUpdateCustomFields(
$action,
$createdOrUpdatedSubscribers, $createdOrUpdatedSubscribers,
$subscribersData, $subscribersData,
$subscribersCustomFields $subscribersCustomFields
@ -421,6 +433,7 @@ class Import {
} }
public function createOrUpdateCustomFields( public function createOrUpdateCustomFields(
string $acion,
array $createdOrUpdatedSubscribers, array $createdOrUpdatedSubscribers,
array $subscribersData, array $subscribersData,
array $subscribersCustomFieldsIds array $subscribersCustomFieldsIds
@ -455,11 +468,19 @@ class Import {
'created_at', 'created_at',
]; ];
foreach (array_chunk($subscribersCustomFieldsData, self::DB_QUERY_CHUNK_SIZE) as $subscribersCustomFieldsDataChunk) { foreach (array_chunk($subscribersCustomFieldsData, self::DB_QUERY_CHUNK_SIZE) as $subscribersCustomFieldsDataChunk) {
$this->subscriberCustomFieldRepository->insertOrUpdateMultiple( $this->importExportRepository->insertMultiple(
SubscriberCustomFieldEntity::class,
$columns, $columns,
$subscribersCustomFieldsDataChunk, $subscribersCustomFieldsDataChunk
$this->updatedAt
); );
if ($acion === self::ACTION_UPDATE) {
$this->importExportRepository->updateMultiple(
SubscriberCustomFieldEntity::class,
$columns,
$subscribersCustomFieldsDataChunk,
$this->updatedAt
);
}
} }
} }
@ -484,7 +505,11 @@ class Import {
]; ];
}, $subscriberIdsChunk)); }, $subscriberIdsChunk));
} }
$this->subscriberSegmentRepository->insertOrUpdateMultiple($columns, $data, $this->updatedAt); $this->importExportRepository->insertMultiple(
SubscriberSegmentEntity::class,
$columns,
$data
);
} }
} }
} }

View File

@ -12,6 +12,7 @@ use MailPoet\Entities\SubscriberSegmentEntity;
use MailPoet\Newsletter\Options\NewsletterOptionsRepository; use MailPoet\Newsletter\Options\NewsletterOptionsRepository;
use MailPoet\Segments\SegmentsRepository; use MailPoet\Segments\SegmentsRepository;
use MailPoet\Segments\WP; use MailPoet\Segments\WP;
use MailPoet\Subscribers\ImportExport\ImportExportRepository;
use MailPoet\Subscribers\SubscriberCustomFieldRepository; use MailPoet\Subscribers\SubscriberCustomFieldRepository;
use MailPoet\Subscribers\SubscriberSegmentRepository; use MailPoet\Subscribers\SubscriberSegmentRepository;
use MailPoet\Subscribers\SubscribersRepository; use MailPoet\Subscribers\SubscribersRepository;
@ -36,6 +37,9 @@ class ImportTest extends \MailPoetTest {
/** @var CustomFieldsRepository */ /** @var CustomFieldsRepository */
private $customFieldsRepository; private $customFieldsRepository;
/** @var ImportExportRepository */
private $importExportRepository;
/** @var NewsletterOptionsRepository */ /** @var NewsletterOptionsRepository */
private $newsletterOptionsRepository; private $newsletterOptionsRepository;
@ -54,6 +58,7 @@ class ImportTest extends \MailPoetTest {
public function _before() { public function _before() {
$this->wpSegment = $this->diContainer->get(WP::class); $this->wpSegment = $this->diContainer->get(WP::class);
$this->customFieldsRepository = $this->diContainer->get(CustomFieldsRepository::class); $this->customFieldsRepository = $this->diContainer->get(CustomFieldsRepository::class);
$this->importExportRepository = $this->diContainer->get(ImportExportRepository::class);
$this->newsletterOptionsRepository = $this->diContainer->get(NewsletterOptionsRepository::class); $this->newsletterOptionsRepository = $this->diContainer->get(NewsletterOptionsRepository::class);
$this->segmentsRepository = $this->diContainer->get(SegmentsRepository::class); $this->segmentsRepository = $this->diContainer->get(SegmentsRepository::class);
$this->subscriberCustomFieldRepository = $this->diContainer->get(SubscriberCustomFieldRepository::class); $this->subscriberCustomFieldRepository = $this->diContainer->get(SubscriberCustomFieldRepository::class);
@ -315,6 +320,7 @@ class ImportTest extends \MailPoetTest {
'fields' => $this->subscribersFields, 'fields' => $this->subscribersFields,
]; ];
$this->import->createOrUpdateSubscribers( $this->import->createOrUpdateSubscribers(
Import::ACTION_CREATE,
$subscribersData $subscribersData
); );
$subscribers = $this->subscriberRepository->findAll(); $subscribers = $this->subscriberRepository->findAll();
@ -323,6 +329,7 @@ class ImportTest extends \MailPoetTest {
->equals($subscribersData['data']['email'][0]); ->equals($subscribersData['data']['email'][0]);
$subscribersData['data']['first_name'][1] = 'MaryJane'; $subscribersData['data']['first_name'][1] = 'MaryJane';
$this->import->createOrUpdateSubscribers( $this->import->createOrUpdateSubscribers(
Import::ACTION_UPDATE,
$subscribersData $subscribersData
); );
$this->entityManager->clear(); $this->entityManager->clear();
@ -342,6 +349,7 @@ class ImportTest extends \MailPoetTest {
]; ];
$subscribersData['fields'][] = 'deleted_at'; $subscribersData['fields'][] = 'deleted_at';
$this->import->createOrUpdateSubscribers( $this->import->createOrUpdateSubscribers(
Import::ACTION_CREATE,
$subscribersData $subscribersData
); );
$dbSubscribers = array_map(function (SubscriberEntity $subscriber): int { $dbSubscribers = array_map(function (SubscriberEntity $subscriber): int {
@ -370,6 +378,7 @@ class ImportTest extends \MailPoetTest {
]; ];
$customField = $this->subscribersCustomFields[0]; $customField = $this->subscribersCustomFields[0];
$this->import->createOrUpdateSubscribers( $this->import->createOrUpdateSubscribers(
Import::ACTION_CREATE,
$subscribersData, $subscribersData,
$this->subscribersFields $this->subscribersFields
); );
@ -380,6 +389,7 @@ class ImportTest extends \MailPoetTest {
]; ];
}, $this->subscriberRepository->findAll()); }, $this->subscriberRepository->findAll());
$this->import->createOrUpdateCustomFields( $this->import->createOrUpdateCustomFields(
Import::ACTION_CREATE,
$dbSubscribers, $dbSubscribers,
$subscribersData, $subscribersData,
$this->subscribersCustomFields $this->subscribersCustomFields
@ -390,6 +400,7 @@ class ImportTest extends \MailPoetTest {
->equals($subscribersData['data'][$customField][0]); ->equals($subscribersData['data'][$customField][0]);
$subscribersData[$customField][1] = 'Rio'; $subscribersData[$customField][1] = 'Rio';
$this->import->createOrUpdateCustomFields( $this->import->createOrUpdateCustomFields(
Import::ACTION_UPDATE,
$dbSubscribers, $dbSubscribers,
$subscribersData, $subscribersData,
$this->subscribersCustomFields $this->subscribersCustomFields
@ -405,6 +416,7 @@ class ImportTest extends \MailPoetTest {
'fields' => $this->subscribersFields, 'fields' => $this->subscribersFields,
]; ];
$this->import->createOrUpdateSubscribers( $this->import->createOrUpdateSubscribers(
Import::ACTION_CREATE,
$subscribersData, $subscribersData,
$this->subscribersFields $this->subscribersFields
); );
@ -441,6 +453,7 @@ class ImportTest extends \MailPoetTest {
date('Y-m-d H:i:s'), date('Y-m-d H:i:s'),
]; ];
$this->import->createOrUpdateSubscribers( $this->import->createOrUpdateSubscribers(
Import::ACTION_CREATE,
$subscribersData $subscribersData
); );
} }
@ -594,10 +607,9 @@ class ImportTest extends \MailPoetTest {
return new Import( return new Import(
$this->wpSegment, $this->wpSegment,
$this->customFieldsRepository, $this->customFieldsRepository,
$this->importExportRepository,
$this->newsletterOptionsRepository, $this->newsletterOptionsRepository,
$this->subscriberCustomFieldRepository,
$this->subscriberRepository, $this->subscriberRepository,
$this->subscriberSegmentRepository,
$data $data
); );
} }