Add saving tags for imported subscribers

[MAILPOET-4558]
This commit is contained in:
Jan Lysý
2022-09-05 16:41:29 +02:00
committed by Aschepikov
parent a523bb493f
commit 5c57dd2006
6 changed files with 70 additions and 4 deletions

View File

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

View File

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

View File

@ -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

View File

@ -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

View File

@ -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

View File

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