diff --git a/lib/Config/PersonalDataExporters.php b/lib/Config/PersonalDataExporters.php index c6dde6fbd3..7942107c9f 100644 --- a/lib/Config/PersonalDataExporters.php +++ b/lib/Config/PersonalDataExporters.php @@ -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; + } + } \ No newline at end of file diff --git a/lib/Subscribers/ImportExport/PersonalDataExporters/SubscriberExporter.php b/lib/Subscribers/ImportExport/PersonalDataExporters/SubscriberExporter.php new file mode 100644 index 0000000000..cc1d05842e --- /dev/null +++ b/lib/Subscribers/ImportExport/PersonalDataExporters/SubscriberExporter.php @@ -0,0 +1,85 @@ + $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; + } + +} \ No newline at end of file diff --git a/tests/unit/Subscribers/ImportExport/PersonalDataExporters/SubscriberExporterTest.php b/tests/unit/Subscribers/ImportExport/PersonalDataExporters/SubscriberExporterTest.php new file mode 100644 index 0000000000..164a77b27f --- /dev/null +++ b/tests/unit/Subscribers/ImportExport/PersonalDataExporters/SubscriberExporterTest.php @@ -0,0 +1,88 @@ +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')); + } + +}