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\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();

View File

@ -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
);
}
}
}

View File

@ -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
);
}