Skip to content

Commit

Permalink
Merged PR 56874: Do not sync Email, EmailType or OptInType as data fi…
Browse files Browse the repository at this point in the history
…elds

## What's being changed

This PR fixes handling of some data points previously treated as data fields in the context of CSV sync.

All contact exports now do not export Email or EmailType. Subscriber exports now set OptInType per subscriber depending on Customers > Newsletter > Subscription Options > Need to Confirm at _store level_ (this is a change - we used to check this at website level but the config is store-scoped).

## Why it's being changed

Email, EmailType and OptInType are not data fields - in V3, EmailType and OptInType are channel properties, and in fact even in V2, these data points are sent separately from data fields in API requests. It's only because of how we used to send these via CSV that they were handled the way they were.

## How to review / test this change

- Run customer sync, guest sync and subscriber sync
- All exported JSON should have `,"channelProperties":{"email":{"emailType":"html"}}` for each contact
- Subscriber exports should _not_ contain `optInType` yet
- Turn on Customers > Newsletter > Subscription Options > Need to Confirm in a store scope
- Re-sync subscribers
- Subscribers in the affected store scope should be synced with `"channelProperties":{"email":{"emailType":"html","optInType":"double"}}`
- Email, EmailType and OptInType should not be seen in data fields at all

Related work items: #264085, #265397, #265398
  • Loading branch information
sta1r committed Aug 15, 2024
1 parent a3ad150 commit 48262aa
Show file tree
Hide file tree
Showing 18 changed files with 230 additions and 104 deletions.
3 changes: 3 additions & 0 deletions Model/Apiconnector/Client.php
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,9 @@ public function postAddressBookContacts($addressBookId, $apiContact)
*
* @return object
* @throws LocalizedException
*
* @deprecated Use API V3.
* @see \Dotdigital\V3\Resources\Contacts::patchByIdentifier
*/
public function addContactToAddressBook(
string $email,
Expand Down
4 changes: 0 additions & 4 deletions Model/Connector/ContactData.php
Original file line number Diff line number Diff line change
Expand Up @@ -194,10 +194,6 @@ public function setContactData()
: null;
break;

case 'email_type':
$value = 'Html';
break;

default:
$method = 'get' . str_replace(' ', '', ucwords(str_replace('_', ' ', $key)));
$value = method_exists($this, $method)
Expand Down
6 changes: 6 additions & 0 deletions Model/Connector/ContactData/Customer.php
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,9 @@ public function init(AbstractModel $model, array $columns)
* @param string $email
*
* @return void
*
* @deprecated email is an identifier, not a data field.
* @see \Dotdigitalgroup\Email\Model\Sync\Export\SdkContactBuilder::createSdkContact
*/
public function setEmail($email)
{
Expand All @@ -184,6 +187,9 @@ public function setEmail($email)
* @param string $emailType
*
* @return void
*
* @deprecated email_type is a channel property, not a data field.
* @see \Dotdigitalgroup\Email\Model\Sync\Export\SdkContactBuilder::createSdkContact
*/
public function setEmailType($emailType)
{
Expand Down
7 changes: 7 additions & 0 deletions Model/Connector/ContactData/Subscriber.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,20 @@

use Dotdigitalgroup\Email\Model\Connector\ContactData;

/**
* @deprecated This class will be removed.
* @see \Dotdigitalgroup\Email\Model\Connector\ContactData;
*/
class Subscriber extends ContactData
{
/**
* Get opt in type.
*
* If we are requesting a value for this column, it means 'Need to confirm'
* is switched on in Magento.
*
* @deprecated OptInType is not a data field.
* @see \Dotdigitalgroup\Email\Model\Newsletter\OptInTypeFinder
*/
public function getOptInType()
{
Expand Down
44 changes: 44 additions & 0 deletions Model/Newsletter/OptInTypeFinder.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?php

declare(strict_types=1);

namespace Dotdigitalgroup\Email\Model\Newsletter;

use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Newsletter\Model\Subscriber;
use Magento\Store\Model\ScopeInterface;

class OptInTypeFinder
{
/**
* @var ScopeConfigInterface
*/
private $scopeConfig;

/**
* @param ScopeConfigInterface $scopeConfig
*/
public function __construct(
ScopeConfigInterface $scopeConfig
) {
$this->scopeConfig = $scopeConfig;
}

/**
* Get opt in type by store.
*
* @param int $storeId
*
* @return string|null
*/
public function getOptInType($storeId)
{
$needToConfirm = $this->scopeConfig->getValue(
Subscriber::XML_PATH_CONFIRMATION_FLAG,
ScopeInterface::SCOPE_STORE,
$storeId
);

return $needToConfirm ? 'double' : null;
}
}
8 changes: 1 addition & 7 deletions Model/Sync/Automation/DataField/DataFieldCollector.php
Original file line number Diff line number Diff line change
Expand Up @@ -186,13 +186,7 @@ public function collectForSubscriber(Contact $contact, $websiteId, int $listId):
public function mergeFields(array $originalDataFields, array $newDataFields): array
{
$combinedDataFields = $originalDataFields;
$originalKeys = array_merge(
array_column($originalDataFields, 'Key'),
[
'Email',
'EmailType'
]
);
$originalKeys = array_column($originalDataFields, 'Key');

foreach ($newDataFields as $newDataField) {
if (in_array($newDataField->getKey(), $originalKeys)) {
Expand Down
3 changes: 1 addition & 2 deletions Model/Sync/Customer/Exporter.php
Original file line number Diff line number Diff line change
Expand Up @@ -228,8 +228,7 @@ public function setFieldMapping(WebsiteInterface $website): void
array_column($customAttributes, 'datafield')
);

$columns = AbstractExporter::EMAIL_FIELDS + $customerDataFields;
$this->fieldMap = $attributeColumns ? $columns + $attributeColumns : $columns;
$this->fieldMap = $attributeColumns ? $customerDataFields + $attributeColumns : $customerDataFields;
}

/**
Expand Down
15 changes: 14 additions & 1 deletion Model/Sync/Export/SdkContactBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
namespace Dotdigitalgroup\Email\Model\Sync\Export;

use Dotdigital\V3\Models\Contact as SdkContact;
use Dotdigital\V3\Models\Contact\ChannelProperties\EmailChannelProperty;
use Dotdigitalgroup\Email\Model\Contact;
use Dotdigitalgroup\Email\Model\Connector\ContactData;
use Dotdigitalgroup\Email\Model\Sync\Subscriber;
Expand All @@ -31,14 +32,16 @@ public function __construct(
* @param ContactData $connectorModel
* @param array $columns
* @param int $listId
* @param string|null $optInType
*
* @return SdkContact
* @throws \Exception
*/
public function createSdkContact(
ContactData $connectorModel,
array $columns,
int $listId
int $listId,
?string $optInType = null
): SdkContact {
$sdkContact = new SdkContact([
'matchIdentifier' => 'email'
Expand All @@ -48,6 +51,16 @@ public function createSdkContact(
]);
$sdkContact->setLists([$listId]);

$emailChannelProperty = new EmailChannelProperty([
'emailType' => 'html'
]);
if ($optInType) {
$emailChannelProperty->setOptInType($optInType);
}
$sdkContact->setChannelProperties([
'email' => $emailChannelProperty
]);

$sdkContact->setDataFields(
$this->dataFieldMapper->mapFields(
$connectorModel->getContactData(),
Expand Down
2 changes: 1 addition & 1 deletion Model/Sync/Guest/GuestExporter.php
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ public function setFieldMapping(WebsiteInterface $website): void
'website_name' => $website->getConfig(Config::XML_PATH_CONNECTOR_CUSTOMER_WEBSITE_NAME)
];

$this->fieldMap = AbstractExporter::EMAIL_FIELDS + array_filter($guestColumns);
$this->fieldMap = array_filter($guestColumns);
}

/**
Expand Down
14 changes: 11 additions & 3 deletions Model/Sync/Subscriber/SingleSubscriberSyncer.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

use Dotdigitalgroup\Email\Helper\Data;
use Dotdigitalgroup\Email\Model\Contact;
use Dotdigitalgroup\Email\Model\Newsletter\OptInTypeFinder;
use Dotdigitalgroup\Email\Model\Sync\Automation\DataField\DataFieldCollector;
use Magento\Framework\Exception\LocalizedException;

Expand All @@ -21,16 +22,24 @@ class SingleSubscriberSyncer
*/
private $dataFieldCollector;

/**
* @var OptInTypeFinder
*/
private $optInTypeFinder;

/**
* @param Data $helper
* @param DataFieldCollector $dataFieldCollector
* @param OptInTypeFinder $optInTypeFinder
*/
public function __construct(
Data $helper,
DataFieldCollector $dataFieldCollector
DataFieldCollector $dataFieldCollector,
OptInTypeFinder $optInTypeFinder
) {
$this->helper = $helper;
$this->dataFieldCollector = $dataFieldCollector;
$this->optInTypeFinder = $optInTypeFinder;
}

/**
Expand Down Expand Up @@ -60,11 +69,10 @@ public function pushContactToSubscriberAddressBook(Contact $contact)
)
);

// optInType will be set in $subscriberDataFields if it is 'Double'
return $client->addContactToAddressBook(
$contact->getEmail(),
$subscriberAddressBookId,
null,
$this->optInTypeFinder->getOptInType($contact->getStoreId()),
$subscriberDataFields
);
}
Expand Down
21 changes: 15 additions & 6 deletions Model/Sync/Subscriber/SubscriberExporter.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use Dotdigitalgroup\Email\Helper\Config;
use Dotdigitalgroup\Email\Logger\Logger;
use Dotdigitalgroup\Email\Model\Connector\ContactData\SubscriberFactory as ConnectorSubscriberFactory;
use Dotdigitalgroup\Email\Model\Newsletter\OptInTypeFinder;
use Dotdigitalgroup\Email\Model\ResourceModel\Contact\CollectionFactory as ContactCollectionFactory;
use Dotdigitalgroup\Email\Model\Sync\AbstractExporter;
use Dotdigitalgroup\Email\Model\Sync\Export\CsvHandler;
Expand All @@ -27,6 +28,11 @@ class SubscriberExporter extends AbstractExporter implements ExporterInterface
*/
private $connectorSubscriberFactory;

/**
* @var OptInTypeFinder
*/
private $optInTypeFinder;

/**
* @var ContactCollectionFactory
*/
Expand All @@ -45,19 +51,22 @@ class SubscriberExporter extends AbstractExporter implements ExporterInterface
/**
* @param Logger $logger
* @param ConnectorSubscriberFactory $connectorSubscriberFactory
* @param OptInTypeFinder $optInTypeFinder
* @param ContactCollectionFactory $contactCollectionFactory
* @param CsvHandler $csvHandler
* @param SdkContactBuilder $sdkContactBuilder
*/
public function __construct(
Logger $logger,
ConnectorSubscriberFactory $connectorSubscriberFactory,
OptInTypeFinder $optInTypeFinder,
ContactCollectionFactory $contactCollectionFactory,
CsvHandler $csvHandler,
SdkContactBuilder $sdkContactBuilder
) {
$this->logger = $logger;
$this->connectorSubscriberFactory = $connectorSubscriberFactory;
$this->optInTypeFinder = $optInTypeFinder;
$this->contactCollectionFactory = $contactCollectionFactory;
$this->sdkContactBuilder = $sdkContactBuilder;
parent::__construct($csvHandler);
Expand Down Expand Up @@ -93,7 +102,8 @@ public function export(array $subscribers, WebsiteInterface $website, int $listI
$exportedData[$subscriber->getId()] = $this->sdkContactBuilder->createSdkContact(
$connectorSubscriber,
$this->fieldMap,
$listId
$listId,
$this->optInTypeFinder->getOptInType($subscriber->getStoreId())
);

$subscriber->clearInstance();
Expand Down Expand Up @@ -163,11 +173,7 @@ public function setFieldMapping(WebsiteInterface $website)
'subscriber_status' => $website->getConfig(Config::XML_PATH_CONNECTOR_CUSTOMER_SUBSCRIBER_STATUS)
];

$this->fieldMap = AbstractExporter::EMAIL_FIELDS + array_filter($subscriberDataFields);

if ($this->isOptInTypeDouble($website)) {
$this->fieldMap += ['opt_in_type' => 'OptInType'];
}
$this->fieldMap = array_filter($subscriberDataFields);
}

/**
Expand All @@ -186,6 +192,9 @@ public function getFieldMapping(): array
* @param WebsiteInterface $website
*
* @return boolean
*
* @deprecated OptInType is not a data field.
* @see \Dotdigitalgroup\Email\Model\Sync\Subscriber::loopByWebsite()
*/
private function isOptInTypeDouble($website)
{
Expand Down
13 changes: 12 additions & 1 deletion Model/Sync/Subscriber/SubscriberWithSalesExporter.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use Dotdigitalgroup\Email\Logger\Logger;
use Dotdigitalgroup\Email\Model\Connector\ContactData\SubscriberFactory as ConnectorSubscriberFactory;
use Dotdigitalgroup\Email\Model\Connector\Datafield;
use Dotdigitalgroup\Email\Model\Newsletter\OptInTypeFinder;
use Dotdigitalgroup\Email\Model\ResourceModel\Contact\CollectionFactory as ContactCollectionFactory;
use Dotdigitalgroup\Email\Model\Sync\AbstractExporter;
use Dotdigitalgroup\Email\Model\Sync\Export\CsvHandler;
Expand All @@ -16,6 +17,7 @@
use Dotdigitalgroup\Email\Model\Sync\Export\SdkContactBuilder;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\Exception\LocalizedException;
use Magento\Newsletter\Model\Subscriber;
use Magento\Store\Api\Data\WebsiteInterface;
use Magento\Store\Model\ScopeInterface;

Expand All @@ -36,6 +38,11 @@ class SubscriberWithSalesExporter extends AbstractExporter implements ExporterIn
*/
private $connectorSubscriberFactory;

/**
* @var OptInTypeFinder
*/
private $optInTypeFinder;

/**
* @var ContactCollectionFactory
*/
Expand Down Expand Up @@ -70,6 +77,7 @@ class SubscriberWithSalesExporter extends AbstractExporter implements ExporterIn
* @param Logger $logger
* @param Datafield $datafield
* @param ConnectorSubscriberFactory $connectorSubscriberFactory
* @param OptInTypeFinder $optInTypeFinder
* @param ContactCollectionFactory $contactCollectionFactory
* @param SalesDataManager $salesDataManager
* @param SdkContactBuilder $sdkContactBuilder
Expand All @@ -81,6 +89,7 @@ public function __construct(
Logger $logger,
Datafield $datafield,
ConnectorSubscriberFactory $connectorSubscriberFactory,
OptInTypeFinder $optInTypeFinder,
ContactCollectionFactory $contactCollectionFactory,
SalesDataManager $salesDataManager,
SdkContactBuilder $sdkContactBuilder,
Expand All @@ -91,6 +100,7 @@ public function __construct(
$this->logger = $logger;
$this->datafield = $datafield;
$this->connectorSubscriberFactory = $connectorSubscriberFactory;
$this->optInTypeFinder = $optInTypeFinder;
$this->contactCollectionFactory = $contactCollectionFactory;
$this->salesDataManager = $salesDataManager;
$this->sdkContactBuilder = $sdkContactBuilder;
Expand Down Expand Up @@ -139,7 +149,8 @@ public function export(array $subscribers, WebsiteInterface $website, int $listI
$exportedData[$subscriber->getId()] = $this->sdkContactBuilder->createSdkContact(
$connectorSubscriber,
$this->fieldMap,
$listId
$listId,
$this->optInTypeFinder->getOptInType($subscriber->getStoreId())
);

$subscriber->clearInstance();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -304,8 +304,6 @@ private function getDefaultDataFields()
private function getExportedCustomerDataFields()
{
return [
new DataField('Email', 'chaz@emailsim.io'),
new DataField('EmailType', 'Html'),
new DataField('FIRST_NAME', 'Chaz'),
new DataField('LAST_NAME', 'Kangaroo'),
new DataField('SUBSCRIBER_STATUS', 'Subscribed'),
Expand Down
Loading

0 comments on commit 48262aa

Please sign in to comment.