Add saving tags for imported subscribers
[MAILPOET-4558]
This commit is contained in:
@ -20,6 +20,7 @@ use MailPoet\Subscribers\ImportExport\Import\Import;
|
|||||||
use MailPoet\Subscribers\ImportExport\Import\MailChimp;
|
use MailPoet\Subscribers\ImportExport\Import\MailChimp;
|
||||||
use MailPoet\Subscribers\ImportExport\ImportExportRepository;
|
use MailPoet\Subscribers\ImportExport\ImportExportRepository;
|
||||||
use MailPoet\Subscribers\SubscribersRepository;
|
use MailPoet\Subscribers\SubscribersRepository;
|
||||||
|
use MailPoet\Tags\TagRepository;
|
||||||
|
|
||||||
class ImportExport extends APIEndpoint {
|
class ImportExport extends APIEndpoint {
|
||||||
|
|
||||||
@ -47,6 +48,9 @@ class ImportExport extends APIEndpoint {
|
|||||||
/** @var SegmentsResponseBuilder */
|
/** @var SegmentsResponseBuilder */
|
||||||
private $segmentsResponseBuilder;
|
private $segmentsResponseBuilder;
|
||||||
|
|
||||||
|
/** @var TagRepository */
|
||||||
|
private $tagRepository;
|
||||||
|
|
||||||
/** @var CronWorkerScheduler */
|
/** @var CronWorkerScheduler */
|
||||||
private $cronWorkerScheduler;
|
private $cronWorkerScheduler;
|
||||||
|
|
||||||
@ -63,7 +67,8 @@ class ImportExport extends APIEndpoint {
|
|||||||
SegmentSaveController $segmentSavecontroller,
|
SegmentSaveController $segmentSavecontroller,
|
||||||
SegmentsResponseBuilder $segmentsResponseBuilder,
|
SegmentsResponseBuilder $segmentsResponseBuilder,
|
||||||
CronWorkerScheduler $cronWorkerScheduler,
|
CronWorkerScheduler $cronWorkerScheduler,
|
||||||
SubscribersRepository $subscribersRepository
|
SubscribersRepository $subscribersRepository,
|
||||||
|
TagRepository $tagRepository
|
||||||
) {
|
) {
|
||||||
$this->wpSegment = $wpSegment;
|
$this->wpSegment = $wpSegment;
|
||||||
$this->customFieldsRepository = $customFieldsRepository;
|
$this->customFieldsRepository = $customFieldsRepository;
|
||||||
@ -74,6 +79,7 @@ class ImportExport extends APIEndpoint {
|
|||||||
$this->segmentSavecontroller = $segmentSavecontroller;
|
$this->segmentSavecontroller = $segmentSavecontroller;
|
||||||
$this->cronWorkerScheduler = $cronWorkerScheduler;
|
$this->cronWorkerScheduler = $cronWorkerScheduler;
|
||||||
$this->segmentsResponseBuilder = $segmentsResponseBuilder;
|
$this->segmentsResponseBuilder = $segmentsResponseBuilder;
|
||||||
|
$this->tagRepository = $tagRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getMailChimpLists($data) {
|
public function getMailChimpLists($data) {
|
||||||
@ -124,6 +130,7 @@ class ImportExport extends APIEndpoint {
|
|||||||
$this->importExportRepository,
|
$this->importExportRepository,
|
||||||
$this->newsletterOptionsRepository,
|
$this->newsletterOptionsRepository,
|
||||||
$this->subscriberRepository,
|
$this->subscriberRepository,
|
||||||
|
$this->tagRepository,
|
||||||
json_decode($data, true)
|
json_decode($data, true)
|
||||||
);
|
);
|
||||||
$process = $import->process();
|
$process = $import->process();
|
||||||
|
@ -7,6 +7,7 @@ use MailPoet\Entities\CustomFieldEntity;
|
|||||||
use MailPoet\Entities\SubscriberCustomFieldEntity;
|
use MailPoet\Entities\SubscriberCustomFieldEntity;
|
||||||
use MailPoet\Entities\SubscriberEntity;
|
use MailPoet\Entities\SubscriberEntity;
|
||||||
use MailPoet\Entities\SubscriberSegmentEntity;
|
use MailPoet\Entities\SubscriberSegmentEntity;
|
||||||
|
use MailPoet\Entities\SubscriberTagEntity;
|
||||||
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;
|
||||||
@ -14,6 +15,7 @@ use MailPoet\Subscribers\ImportExport\ImportExportFactory;
|
|||||||
use MailPoet\Subscribers\ImportExport\ImportExportRepository;
|
use MailPoet\Subscribers\ImportExport\ImportExportRepository;
|
||||||
use MailPoet\Subscribers\Source;
|
use MailPoet\Subscribers\Source;
|
||||||
use MailPoet\Subscribers\SubscribersRepository;
|
use MailPoet\Subscribers\SubscribersRepository;
|
||||||
|
use MailPoet\Tags\TagRepository;
|
||||||
use MailPoet\Util\DateConverter;
|
use MailPoet\Util\DateConverter;
|
||||||
use MailPoet\Util\Helpers;
|
use MailPoet\Util\Helpers;
|
||||||
use MailPoet\Util\Security;
|
use MailPoet\Util\Security;
|
||||||
@ -25,6 +27,8 @@ class Import {
|
|||||||
public $subscribersData;
|
public $subscribersData;
|
||||||
/** @var array */
|
/** @var array */
|
||||||
public $segmentsIds;
|
public $segmentsIds;
|
||||||
|
/** @var string[] */
|
||||||
|
public $tags;
|
||||||
/** @var string */
|
/** @var string */
|
||||||
public $newSubscribersStatus;
|
public $newSubscribersStatus;
|
||||||
/** @var string */
|
/** @var string */
|
||||||
@ -64,12 +68,16 @@ class Import {
|
|||||||
/** @var SubscribersRepository */
|
/** @var SubscribersRepository */
|
||||||
private $subscriberRepository;
|
private $subscriberRepository;
|
||||||
|
|
||||||
|
/** @var TagRepository */
|
||||||
|
private $tagRepository;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
WP $wpSegment,
|
WP $wpSegment,
|
||||||
CustomFieldsRepository $customFieldsRepository,
|
CustomFieldsRepository $customFieldsRepository,
|
||||||
ImportExportRepository $importExportRepository,
|
ImportExportRepository $importExportRepository,
|
||||||
NewsletterOptionsRepository $newsletterOptionsRepository,
|
NewsletterOptionsRepository $newsletterOptionsRepository,
|
||||||
SubscribersRepository $subscriberRepository,
|
SubscribersRepository $subscriberRepository,
|
||||||
|
TagRepository $tagRepository,
|
||||||
array $data
|
array $data
|
||||||
) {
|
) {
|
||||||
$this->wpSegment = $wpSegment;
|
$this->wpSegment = $wpSegment;
|
||||||
@ -77,12 +85,14 @@ class Import {
|
|||||||
$this->importExportRepository = $importExportRepository;
|
$this->importExportRepository = $importExportRepository;
|
||||||
$this->newsletterOptionsRepository = $newsletterOptionsRepository;
|
$this->newsletterOptionsRepository = $newsletterOptionsRepository;
|
||||||
$this->subscriberRepository = $subscriberRepository;
|
$this->subscriberRepository = $subscriberRepository;
|
||||||
|
$this->tagRepository = $tagRepository;
|
||||||
$this->validateImportData($data);
|
$this->validateImportData($data);
|
||||||
$this->subscribersData = $this->transformSubscribersData(
|
$this->subscribersData = $this->transformSubscribersData(
|
||||||
$data['subscribers'],
|
$data['subscribers'],
|
||||||
$data['columns']
|
$data['columns']
|
||||||
);
|
);
|
||||||
$this->segmentsIds = $data['segments'];
|
$this->segmentsIds = $data['segments'];
|
||||||
|
$this->tags = $data['tags'];
|
||||||
$this->newSubscribersStatus = $data['newSubscribersStatus'];
|
$this->newSubscribersStatus = $data['newSubscribersStatus'];
|
||||||
$this->existingSubscribersStatus = $data['existingSubscribersStatus'];
|
$this->existingSubscribersStatus = $data['existingSubscribersStatus'];
|
||||||
$this->updateSubscribers = $data['updateSubscribers'];
|
$this->updateSubscribers = $data['updateSubscribers'];
|
||||||
@ -112,6 +122,7 @@ class Import {
|
|||||||
'newSubscribersStatus',
|
'newSubscribersStatus',
|
||||||
'existingSubscribersStatus',
|
'existingSubscribersStatus',
|
||||||
'updateSubscribers',
|
'updateSubscribers',
|
||||||
|
'tags',
|
||||||
];
|
];
|
||||||
// 1. data should contain all required fields
|
// 1. data should contain all required fields
|
||||||
// 2. column names should only contain alphanumeric & underscore characters
|
// 2. column names should only contain alphanumeric & underscore characters
|
||||||
@ -527,6 +538,10 @@ class Import {
|
|||||||
$createdOrUpdatedSubscribersIds,
|
$createdOrUpdatedSubscribersIds,
|
||||||
$this->segmentsIds
|
$this->segmentsIds
|
||||||
);
|
);
|
||||||
|
$this->addTagsToSubscribers(
|
||||||
|
$createdOrUpdatedSubscribersIds,
|
||||||
|
$this->tags
|
||||||
|
);
|
||||||
return $createdOrUpdatedSubscribers;
|
return $createdOrUpdatedSubscribers;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -619,4 +634,42 @@ class Import {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int[] $subscribersIds
|
||||||
|
* @param string[] $tagNames
|
||||||
|
*/
|
||||||
|
public function addTagsToSubscribers(array $subscribersIds, array $tagNames): void {
|
||||||
|
$tagIds = [];
|
||||||
|
foreach ($tagNames as $tagName) {
|
||||||
|
$tag = $this->tagRepository->findOneBy(['name' => $tagName]);
|
||||||
|
if (!$tag) {
|
||||||
|
$tag = $this->tagRepository->createOrUpdate(['name' => $tagName]);
|
||||||
|
}
|
||||||
|
$tagIds[] = $tag->getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
$columns = [
|
||||||
|
'subscriber_id',
|
||||||
|
'tag_id',
|
||||||
|
'created_at',
|
||||||
|
];
|
||||||
|
foreach (array_chunk($subscribersIds, self::DB_QUERY_CHUNK_SIZE) as $subscriberIdsChunk) {
|
||||||
|
$data = [];
|
||||||
|
foreach ($tagIds as $tagId) {
|
||||||
|
$data = array_merge($data, array_map(function ($subscriberId) use ($tagId): array {
|
||||||
|
return [
|
||||||
|
$subscriberId,
|
||||||
|
$tagId,
|
||||||
|
$this->createdAt,
|
||||||
|
];
|
||||||
|
}, $subscriberIdsChunk));
|
||||||
|
}
|
||||||
|
$this->importExportRepository->insertMultiple(
|
||||||
|
SubscriberTagEntity::class,
|
||||||
|
$columns,
|
||||||
|
$data
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -56,7 +56,7 @@ parameters:
|
|||||||
path: ../../lib/API/JSON/v1/ImportExport.php
|
path: ../../lib/API/JSON/v1/ImportExport.php
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Parameter \\#6 \\$data of class MailPoet\\\\Subscribers\\\\ImportExport\\\\Import\\\\Import constructor expects array, mixed given\\.$#"
|
message: "#^Parameter \\#7 \\$data of class MailPoet\\\\Subscribers\\\\ImportExport\\\\Import\\\\Import constructor expects array, mixed given\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
path: ../../lib/API/JSON/v1/ImportExport.php
|
path: ../../lib/API/JSON/v1/ImportExport.php
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@ parameters:
|
|||||||
path: ../../lib/API/JSON/v1/ImportExport.php
|
path: ../../lib/API/JSON/v1/ImportExport.php
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Parameter \\#6 \\$data of class MailPoet\\\\Subscribers\\\\ImportExport\\\\Import\\\\Import constructor expects array, mixed given\\.$#"
|
message: "#^Parameter \\#7 \\$data of class MailPoet\\\\Subscribers\\\\ImportExport\\\\Import\\\\Import constructor expects array, mixed given\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
path: ../../lib/API/JSON/v1/ImportExport.php
|
path: ../../lib/API/JSON/v1/ImportExport.php
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ parameters:
|
|||||||
path: ../../lib/API/JSON/v1/ImportExport.php
|
path: ../../lib/API/JSON/v1/ImportExport.php
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Parameter \\#6 \\$data of class MailPoet\\\\Subscribers\\\\ImportExport\\\\Import\\\\Import constructor expects array, mixed given\\.$#"
|
message: "#^Parameter \\#7 \\$data of class MailPoet\\\\Subscribers\\\\ImportExport\\\\Import\\\\Import constructor expects array, mixed given\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
path: ../../lib/API/JSON/v1/ImportExport.php
|
path: ../../lib/API/JSON/v1/ImportExport.php
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@ 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;
|
||||||
|
use MailPoet\Tags\TagRepository;
|
||||||
use MailPoet\WP\Functions as WPFunctions;
|
use MailPoet\WP\Functions as WPFunctions;
|
||||||
use MailPoetVendor\Carbon\Carbon;
|
use MailPoetVendor\Carbon\Carbon;
|
||||||
|
|
||||||
@ -59,6 +60,9 @@ class ImportTest extends \MailPoetTest {
|
|||||||
/** @var SubscriberSegmentRepository */
|
/** @var SubscriberSegmentRepository */
|
||||||
private $subscriberSegmentRepository;
|
private $subscriberSegmentRepository;
|
||||||
|
|
||||||
|
/** @var TagRepository */
|
||||||
|
private $tagRepository;
|
||||||
|
|
||||||
public function _before(): void {
|
public function _before(): void {
|
||||||
$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);
|
||||||
@ -68,6 +72,7 @@ class ImportTest extends \MailPoetTest {
|
|||||||
$this->subscriberCustomFieldRepository = $this->diContainer->get(SubscriberCustomFieldRepository::class);
|
$this->subscriberCustomFieldRepository = $this->diContainer->get(SubscriberCustomFieldRepository::class);
|
||||||
$this->subscriberRepository = $this->diContainer->get(SubscribersRepository::class);
|
$this->subscriberRepository = $this->diContainer->get(SubscribersRepository::class);
|
||||||
$this->subscriberSegmentRepository = $this->diContainer->get(SubscriberSegmentRepository::class);
|
$this->subscriberSegmentRepository = $this->diContainer->get(SubscriberSegmentRepository::class);
|
||||||
|
$this->tagRepository = $this->diContainer->get(TagRepository::class);
|
||||||
$customField = $this->customFieldsRepository->createOrUpdate([
|
$customField = $this->customFieldsRepository->createOrUpdate([
|
||||||
'name' => 'country',
|
'name' => 'country',
|
||||||
'type' => CustomFieldEntity::TYPE_TEXT,
|
'type' => CustomFieldEntity::TYPE_TEXT,
|
||||||
@ -780,6 +785,7 @@ class ImportTest extends \MailPoetTest {
|
|||||||
$this->importExportRepository,
|
$this->importExportRepository,
|
||||||
$this->newsletterOptionsRepository,
|
$this->newsletterOptionsRepository,
|
||||||
$this->subscriberRepository,
|
$this->subscriberRepository,
|
||||||
|
$this->tagRepository,
|
||||||
$data
|
$data
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user