<?php namespace MailPoet\Subscribers\ImportExport\PersonalDataExporters; if (!defined('ABSPATH')) exit; use MailPoet\CustomFields\CustomFieldsRepository; use MailPoet\Entities\SubscriberEntity; use MailPoet\Subscribers\Source; use MailPoet\Subscribers\SubscribersRepository; use MailPoet\WP\DateTime; class SubscriberExporter { /*** @var SubscribersRepository */ private $subscribersRepository; /*** @var CustomFieldsRepository */ private $customFieldsRepository; /*** @var array<int, string> */ private $customFields = []; public function __construct( SubscribersRepository $subscribersRepository, CustomFieldsRepository $customFieldsRepository ) { $this->subscribersRepository = $subscribersRepository; $this->customFieldsRepository = $customFieldsRepository; } /** * @param string $email * @return array(data: mixed[], done: boolean) */ public function export(string $email): array { return [ 'data' => $this->exportSubscriber($this->subscribersRepository->findOneBy(['email' => trim($email)])), 'done' => true, ]; } /** * @param SubscriberEntity|null $subscriber * @return array|mixed[][] */ private function exportSubscriber(?SubscriberEntity $subscriber): array { if (!$subscriber) return []; return [[ 'group_id' => 'mailpoet-subscriber', 'group_label' => __('MailPoet Subscriber Data', 'mailpoet'), 'item_id' => 'subscriber-' . $subscriber->getId(), 'data' => $this->getSubscriberExportData($subscriber), ]]; } /** * @param SubscriberEntity $subscriber * @return mixed[][] */ private function getSubscriberExportData(SubscriberEntity $subscriber): array { $customFields = $this->getCustomFields(); $result = [ [ 'name' => __('First Name', 'mailpoet'), 'value' => $subscriber->getFirstName(), ], [ 'name' => __('Last Name', 'mailpoet'), 'value' => $subscriber->getLastName(), ], [ 'name' => __('Email', 'mailpoet'), 'value' => $subscriber->getEmail(), ], [ 'name' => __('Status', 'mailpoet'), 'value' => $subscriber->getStatus(), ], ]; if ($subscriber->getSubscribedIp()) { $result[] = [ 'name' => __('Subscribed IP', 'mailpoet'), 'value' => $subscriber->getSubscribedIp(), ]; } if ($subscriber->getConfirmedIp()) { $result[] = [ 'name' => __('Confirmed IP', 'mailpoet'), 'value' => $subscriber->getConfirmedIp(), ]; } $result[] = [ 'name' => __('Created at', 'mailpoet'), 'value' => $subscriber->getCreatedAt() ? $subscriber->getCreatedAt()->format(DateTime::DEFAULT_DATE_TIME_FORMAT) : '', ]; foreach ($subscriber->getSubscriberCustomFields() as $field) { if (isset($this->getCustomFields()[$field->getId()])) { $result[] = [ 'name' => $customFields[$field->getId()], 'value' => $field->getValue(), ]; } } $result[] = [ 'name' => __("Subscriber's subscription source", 'mailpoet'), 'value' => $this->formatSource($subscriber->getSource()), ]; return $result; } /** * @return array<int, string> */ private function getCustomFields(): array { if (!empty($this->customFields)) { return $this->customFields; } $fields = $this->customFieldsRepository->findAll(); foreach ($fields as $field) { $this->customFields[$field->getId()] = $field->getName(); } return $this->customFields; } private function formatSource(string $source): string { switch ($source) { case Source::WORDPRESS_USER: return __('Subscriber information synchronized via WP user sync', 'mailpoet'); case Source::FORM: return __('Subscription via a MailPoet subscription form', 'mailpoet'); case Source::API: return __('Added by a 3rd party via MailPoet API', 'mailpoet'); case Source::ADMINISTRATOR: return __('Created by the administrator', 'mailpoet'); case Source::IMPORTED: return __('Imported by the administrator', 'mailpoet'); default: return __('Unknown', 'mailpoet'); } } }