Add possibility set status for new or existing users in import

Fixes:#2968
[MAILPOET-2957]
This commit is contained in:
Lysy Jan
2020-08-05 14:43:32 +02:00
committed by Veljko V
parent f7ad5e8a30
commit e7002f74ae
4 changed files with 54 additions and 19 deletions

View File

@ -46,6 +46,8 @@ function StepDataManipulation({
doImport( doImport(
stepMethodSelectionData.subscribers, stepMethodSelectionData.subscribers,
selectedSegments, selectedSegments,
newSubscribersStatus,
existingSubscribersStatus,
updateExistingSubscribers, updateExistingSubscribers,
(importResults) => { (importResults) => {
setStepDataManipulationData(importResults); setStepDataManipulationData(importResults);

View File

@ -3,7 +3,14 @@ import _ from 'underscore';
import MailPoet from 'mailpoet'; import MailPoet from 'mailpoet';
import 'asyncqueue'; import 'asyncqueue';
export default (subscribersToImport, segments, updateExistingSubscribers, onImportComplete) => { export default (
subscribersToImport,
segments,
newSubscribersStatus,
existingSubscribersStatus,
updateExistingSubscribers,
onImportComplete
) => {
const columns = {}; const columns = {};
const queue = new jQuery.AsyncQueue(); const queue = new jQuery.AsyncQueue();
let batchNumber = 0; let batchNumber = 0;
@ -52,6 +59,8 @@ export default (subscribersToImport, segments, updateExistingSubscribers, onImpo
subscribers: clickSubscribers[batchNumber], subscribers: clickSubscribers[batchNumber],
timestamp, timestamp,
segments, segments,
newSubscribersStatus,
existingSubscribersStatus,
updateSubscribers: updateExistingSubscribers, updateSubscribers: updateExistingSubscribers,
}), }),
}).done((response) => { }).done((response) => {

View File

@ -682,7 +682,6 @@ class Subscriber extends Model {
'is_woocommerce_user', 'is_woocommerce_user',
'email', 'email',
'created_at', 'created_at',
'status',
'last_subscribed_at', 'last_subscribed_at',
]; ];
// check if there is anything to update after excluding ignored columns // check if there is anything to update after excluding ignored columns

View File

@ -19,6 +19,8 @@ use function MailPoetVendor\array_column;
class Import { class Import {
public $subscribersData; public $subscribersData;
public $segmentsIds; public $segmentsIds;
public $newSubscribersStatus;
public $existingSubscribersStatus;
public $updateSubscribers; public $updateSubscribers;
public $subscribersFields; public $subscribersFields;
public $subscribersCustomFields; public $subscribersCustomFields;
@ -27,6 +29,7 @@ class Import {
public $updatedAt; public $updatedAt;
public $requiredSubscribersFields; public $requiredSubscribersFields;
const DB_QUERY_CHUNK_SIZE = 100; const DB_QUERY_CHUNK_SIZE = 100;
const STATUS_DONT_UPDATE = 'dont_update';
public function __construct($data) { public function __construct($data) {
$this->validateImportData($data); $this->validateImportData($data);
@ -35,6 +38,8 @@ class Import {
$data['columns'] $data['columns']
); );
$this->segmentsIds = $data['segments']; $this->segmentsIds = $data['segments'];
$this->newSubscribersStatus = $data['newSubscribersStatus'];
$this->existingSubscribersStatus = $data['existingSubscribersStatus'];
$this->updateSubscribers = $data['updateSubscribers']; $this->updateSubscribers = $data['updateSubscribers'];
$this->subscribersFields = $this->getSubscribersFields( $this->subscribersFields = $this->getSubscribersFields(
array_keys($data['columns']) array_keys($data['columns'])
@ -59,6 +64,8 @@ class Import {
'columns', 'columns',
'segments', 'segments',
'timestamp', 'timestamp',
'newSubscribersStatus',
'existingSubscribersStatus',
'updateSubscribers', 'updateSubscribers',
]; ];
// 1. data should contain all required fields // 1. data should contain all required fields
@ -94,7 +101,7 @@ class Import {
if ($newSubscribers['data']) { if ($newSubscribers['data']) {
// add, if required, missing required fields to new subscribers // add, if required, missing required fields to new subscribers
$newSubscribers = $this->addMissingRequiredFields($newSubscribers); $newSubscribers = $this->addMissingRequiredFields($newSubscribers);
$newSubscribers = $this->setSubscriptionStatusToSubscribed($newSubscribers); $newSubscribers = $this->setSubscriptionStatusToDefault($newSubscribers, $this->newSubscribersStatus);
$newSubscribers = $this->setSource($newSubscribers); $newSubscribers = $this->setSource($newSubscribers);
$newSubscribers = $this->setLinkToken($newSubscribers); $newSubscribers = $this->setLinkToken($newSubscribers);
$createdSubscribers = $createdSubscribers =
@ -105,6 +112,14 @@ class Import {
); );
} }
if ($existingSubscribers['data'] && $this->updateSubscribers) { if ($existingSubscribers['data'] && $this->updateSubscribers) {
$allowedStatuses = [
Subscriber::STATUS_SUBSCRIBED,
Subscriber::STATUS_UNSUBSCRIBED,
Subscriber::STATUS_INACTIVE,
];
if (in_array($this->existingSubscribersStatus, $allowedStatuses, true)) {
$existingSubscribers = $this->addField($existingSubscribers, 'status', $this->existingSubscribersStatus);
}
$updatedSubscribers = $updatedSubscribers =
$this->createOrUpdateSubscribers( $this->createOrUpdateSubscribers(
'update', 'update',
@ -258,31 +273,41 @@ class Import {
} }
public function addMissingRequiredFields($subscribers) { public function addMissingRequiredFields($subscribers) {
$subscribersCount = count($subscribers['data'][key($subscribers['data'])]);
foreach (array_keys($this->requiredSubscribersFields) as $requiredField) { foreach (array_keys($this->requiredSubscribersFields) as $requiredField) {
if (in_array($requiredField, $subscribers['fields'])) continue; $subscribers = $this->addField($subscribers, $requiredField, $this->requiredSubscribersFields[$requiredField]);
$subscribers['data'][$requiredField] = array_fill(
0,
$subscribersCount,
$this->requiredSubscribersFields[$requiredField]
);
$subscribers['fields'][] = $requiredField;
} }
return $subscribers; return $subscribers;
} }
private function setSubscriptionStatusToSubscribed($subscribersData) { private function addField($subscribers, $fieldName, $fieldValue) {
if (in_array($fieldName, $subscribers['fields'])) return $subscribers;
$subscribersCount = count($subscribers['data'][key($subscribers['data'])]);
$subscribers['data'][$fieldName] = array_fill(
0,
$subscribersCount,
$fieldValue
);
$subscribers['fields'][] = $fieldName;
return $subscribers;
}
private function setSubscriptionStatusToDefault($subscribersData, $defaultStatus) {
if (!in_array('status', $subscribersData['fields'])) return $subscribersData; if (!in_array('status', $subscribersData['fields'])) return $subscribersData;
$subscribersData['data']['status'] = array_map(function() { $subscribersData['data']['status'] = array_map(function() use ($defaultStatus) {
return Subscriber::STATUS_SUBSCRIBED; return $defaultStatus;
}, $subscribersData['data']['status']); }, $subscribersData['data']['status']);
if ($defaultStatus === Subscriber::STATUS_SUBSCRIBED) {
if (!in_array('last_subscribed_at', $subscribersData['fields'])) { if (!in_array('last_subscribed_at', $subscribersData['fields'])) {
$subscribersData['fields'][] = 'last_subscribed_at'; $subscribersData['fields'][] = 'last_subscribed_at';
} }
$subscribersData['data']['last_subscribed_at'] = array_map(function() { $subscribersData['data']['last_subscribed_at'] = array_map(function() {
return $this->createdAt; return $this->createdAt;
}, $subscribersData['data']['status']); }, $subscribersData['data']['status']);
}
return $subscribersData; return $subscribersData;
} }