Add Subscriber exporter

[MAILPOET-1358]
This commit is contained in:
Pavel Dohnal
2018-05-03 13:37:45 +01:00
parent 8e13eb50bf
commit 11067327a1
3 changed files with 183 additions and 0 deletions

View File

@@ -3,10 +3,12 @@
namespace MailPoet\Config;
use MailPoet\Subscribers\ImportExport\PersonalDataExporters\SegmentsExporter;
use MailPoet\Subscribers\ImportExport\PersonalDataExporters\SubscriberExporter;
class PersonalDataExporters {
function init() {
add_filter('wp_privacy_personal_data_exporters', array($this, 'registerSubscriberExporter'));
add_filter('wp_privacy_personal_data_exporters', array($this, 'registerSegmentsExporter'));
}
@@ -18,4 +20,12 @@ class PersonalDataExporters {
return $exporters;
}
function registerSubscriberExporter($exporters) {
$exporters[] = array(
'exporter_friendly_name' => __('MailPoet Subscriber Data'),
'callback' => array(new SubscriberExporter(), 'export'),
);
return $exporters;
}
}

View File

@@ -0,0 +1,85 @@
<?php
namespace MailPoet\Subscribers\ImportExport\PersonalDataExporters;
use MailPoet\Models\CustomField;
use MailPoet\Models\Subscriber;
class SubscriberExporter {
function export($email) {
return array(
'data' => $this->exportSubscriber(Subscriber::findOne(trim($email))),
'done' => true,
);
}
private function exportSubscriber($subscriber) {
if(!$subscriber) return array();
return array(array(
'group_id' => 'mailpoet-subscriber',
'group_label' => __('MailPoet Subscriber Data'),
'item_id' => 'subscriber-' . $subscriber->id,
'data' => $this->getSubscriberExportData($subscriber->withCustomFields()),
));
}
private function getSubscriberExportData($subscriber) {
$custom_fields = $this->getCustomFields();
$result = array(
array(
'name' => __('First Name'),
'value' => $subscriber->first_name,
),
array(
'name' => __('Last Name'),
'value' => $subscriber->last_name,
),
array(
'name' => __('Email'),
'value' => $subscriber->email,
),
array(
'name' => __('Status'),
'value' => $subscriber->status,
),
);
if($subscriber->subscribed_ip) {
$result[] = array(
'name' => __('Subscribed IP'),
'value' => $subscriber->subscribed_ip,
);
}
if($subscriber->confirmed_ip) {
$result[] = array(
'name' => __('Confirmed IP'),
'value' => $subscriber->confirmed_ip,
);
}
$result[] = array(
'name' => __('Created at timestamp'),
'value' => $subscriber->created_at,
);
foreach($custom_fields as $custom_field_id => $custom_field_name) {
$custom_field_value = $subscriber->{$custom_field_id};
if($custom_field_value) {
$result[] = array(
'name' => $custom_field_name,
'value' => $custom_field_value,
);
}
}
return $result;
}
private function getCustomFields() {
$fields = CustomField::findMany();
$result = array();
foreach($fields as $field) {
$result['cf_' . $field->id] = $field->name;
}
return $result;
}
}

View File

@@ -0,0 +1,88 @@
<?php
namespace MailPoet\Subscribers\ImportExport\PersonalDataExporters;
use MailPoet\Models\CustomField;
use MailPoet\Models\Subscriber;
class SubscriberExporterTest extends \MailPoetTest {
/** @var SubscriberExporter */
private $exporter;
function _before() {
$this->exporter = new SubscriberExporter();
}
function testExportWorksWhenSubscriberNotFound() {
$result = $this->exporter->export('email.that@doesnt.exists');
expect($result)->internalType('array');
expect($result)->hasKey('data');
expect($result['data'])->equals(array());
expect($result)->hasKey('done');
expect($result['done'])->equals(true);
}
function testExportSubscriberWithoutCustomFields() {
Subscriber::createOrUpdate(array(
'email' => 'email.that@has.no.custom.fields',
'first_name' => 'John',
'last_name' => 'Doe',
'status' => 'unconfirmed',
'created_at' => '2018-05-03 10:30:08',
));
$result = $this->exporter->export('email.that@has.no.custom.fields');
expect($result)->internalType('array');
expect($result)->hasKey('data');
expect($result)->hasKey('done');
expect($result['data'])->internalType('array');
expect($result['data'])->count(1);
expect($result['done'])->equals(true);
expect($result['data'][0])->hasKey('group_id');
expect($result['data'][0])->hasKey('group_label');
expect($result['data'][0])->hasKey('item_id');
expect($result['data'][0])->hasKey('data');
$expected = array(
array('name' => 'First Name', 'value' => 'John'),
array('name' => 'Last Name', 'value' => 'Doe'),
array('name' => 'Email', 'value' => 'email.that@has.no.custom.fields'),
array('name' => 'Status', 'value' => 'unconfirmed'),
array('name' => 'Created at timestamp', 'value' => '2018-05-03 10:30:08'),
);
expect($result['data'][0]['data'])->equals($expected);
}
function testExportSubscriberWithIPs() {
Subscriber::createOrUpdate(array(
'email' => 'email.that@has.ip.addresses',
'first_name' => 'John',
'last_name' => 'Doe',
'status' => 'unconfirmed',
'created_at' => '2018-05-03 10:30:08',
'subscribed_ip' => 'IP1',
'confirmed_ip' => 'IP2',
));
$result = $this->exporter->export('email.that@has.ip.addresses');
expect($result['data'][0]['data'])->contains(array('name' => 'Subscribed IP', 'value' => 'IP1'));
expect($result['data'][0]['data'])->contains(array('name' => 'Confirmed IP', 'value' => 'IP2'));
}
function testExportSubscriberWithCustomField() {
$subscriber = Subscriber::createOrUpdate(array(
'email' => 'email.that@has.custom.fields',
));
$custom_field1 = CustomField::createOrUpdate(array(
'name' => 'Custom field1',
'type' => 'input'
));
CustomField::createOrUpdate(array(
'name' => 'Custom field2',
'type' => 'input'
));
$subscriber->setCustomField($custom_field1->id(), 'Value');
$subscriber->setCustomField('123545657', 'Value');
$result = $this->exporter->export('email.that@has.custom.fields');
expect($result['data'][0]['data'])->contains(array('name' => 'Custom field1', 'value' => 'Value'));
}
}