diff --git a/mailpoet/lib/Automation/Integrations/MailPoet/Analytics/Analytics.php b/mailpoet/lib/Automation/Integrations/MailPoet/Analytics/Analytics.php index 5c56bd65c5..030d7693a1 100644 --- a/mailpoet/lib/Automation/Integrations/MailPoet/Analytics/Analytics.php +++ b/mailpoet/lib/Automation/Integrations/MailPoet/Analytics/Analytics.php @@ -8,6 +8,7 @@ use MailPoet\Automation\Engine\WordPress; use MailPoet\Automation\Integrations\MailPoet\Analytics\Endpoints\AutomationFlowEndpoint; use MailPoet\Automation\Integrations\MailPoet\Analytics\Endpoints\OrderEndpoint; use MailPoet\Automation\Integrations\MailPoet\Analytics\Endpoints\OverviewEndpoint; +use MailPoet\Automation\Integrations\MailPoet\Analytics\Endpoints\SubscriberEndpoint; class Analytics { @@ -25,6 +26,7 @@ class Analytics { $api->registerGetRoute('automation/analytics/automation_flow', AutomationFlowEndpoint::class); $api->registerGetRoute('automation/analytics/overview', OverviewEndpoint::class); $api->registerGetRoute('automation/analytics/orders', OrderEndpoint::class); + $api->registerGetRoute('automation/analytics/subscribers', SubscriberEndpoint::class); }); } } diff --git a/mailpoet/lib/Automation/Integrations/MailPoet/Analytics/Controller/FreeSubscriberController.php b/mailpoet/lib/Automation/Integrations/MailPoet/Analytics/Controller/FreeSubscriberController.php new file mode 100644 index 0000000000..54a7e46ef2 --- /dev/null +++ b/mailpoet/lib/Automation/Integrations/MailPoet/Analytics/Controller/FreeSubscriberController.php @@ -0,0 +1,124 @@ +subscribersRepository = $subscribersRepository; + $this->wp = $wp; + $this->registry = $registry; + } + + public function getSubscribersForAutomation(Automation $automation, Query $query): array { + $items = [ + $this->addItem($automation, $query), + $this->addItem($automation, $query), + $this->addItem($automation, $query), + $this->addItem($automation, $query), + ]; + return [ + 'results' => count($items), + 'items' => $items, + ]; + } + + private function addItem(Automation $automation, Query $query): array { + + $subscriber = $this->getRandomSubscriber(); + + $step = $this->getRandomStep($automation); + return [ + 'date' => $this->findRandomDateBetween($query->getAfter(), $query->getBefore())->format(\DateTimeImmutable::W3C), + 'subscriber' => [ + 'id' => $subscriber->getId(), + 'email' => $subscriber->getEmail(), + 'first_name' => $subscriber->getFirstName(), + 'last_name' => $subscriber->getLastName(), + 'avatar' => $this->wp->getAvatarUrl($subscriber->getEmail(), ['size' => 20]), + ], + 'run' => [ + 'automation_id' => $automation->getId(), + 'status' => $this->getRandomStatus(), + 'step' => $this->getRandomStep($automation), + ], + ]; + } + + private function getRandomStep(Automation $automation): array { + /** @var Step[] $steps */ + $steps = array_values( + array_filter( + $automation->getSteps(), + function (Step $step) { + return $step->getType() === Step::TYPE_ACTION; + } + ) + ); + if (!$steps) { + return ['id' => '', 'name' => '']; + } + $step = $steps[array_rand($steps)]; + + $stepType = $this->registry->getStep($step->getKey()); + return [ + 'id' => $step->getId(), + 'name' => $stepType ? $stepType->getName() : __('Unknown', 'mailpoet'), + ]; + } + + private function getRandomStatus(): string { + $statuses = [AutomationRun::STATUS_RUNNING, AutomationRun::STATUS_COMPLETE]; + return $statuses[array_rand($statuses)]; + } + + private function getRandomSubscriber(): SubscriberEntity { + $subscribers = $this->subscribersRepository->findBy([], null, 100); + if (!$subscribers) { + /** @var string $email */ + $email = $this->wp->getOption('admin_email'); + $subscriber = new SubscriberEntity(); + $subscriber->setFirstName('John'); + $subscriber->setLastName('Doe'); + $subscriber->setEmail($email); + return $subscriber; + } + + return $subscribers[array_rand($subscribers)]; + } + + private function findRandomDateBetween(\DateTimeImmutable $start, \DateTimeImmutable $end): \DateTime { + $start = new \DateTime($start->format(\DateTime::W3C)); + $start->setTimezone($this->wp->wpTimezone()); + $end = new \DateTime($end->format(\DateTime::W3C)); + $end->setTimezone($this->wp->wpTimezone()); + $randomTimestamp = mt_rand($start->getTimestamp(), $end->getTimestamp()); + $randomDate = new \DateTime(); + $randomDate->setTimestamp($randomTimestamp); + $randomDate->setTimezone($this->wp->wpTimezone()); + return $randomDate; + } +} diff --git a/mailpoet/lib/Automation/Integrations/MailPoet/Analytics/Controller/SubscriberController.php b/mailpoet/lib/Automation/Integrations/MailPoet/Analytics/Controller/SubscriberController.php new file mode 100644 index 0000000000..efcbe84426 --- /dev/null +++ b/mailpoet/lib/Automation/Integrations/MailPoet/Analytics/Controller/SubscriberController.php @@ -0,0 +1,10 @@ +automationStorage = $automationStorage; + $this->subscriberControllerFactory = $subscriberControllerFactory; + } + + public static function getRequestSchema(): array { + return [ + 'id' => Builder::integer()->required(), + 'query' => Query::getRequestSchema(), + ]; + } + + public function checkPermissions(): bool { + return true; + } + + public function handle(Request $request): Response { + $automation = $this->automationStorage->getAutomation(absint($request->getParam('id'))); + if (!$automation) { + throw new NotFoundException(__('Automation not found', 'mailpoet')); + } + + $query = Query::fromRequest($request); + $controller = $this->subscriberControllerFactory->getSubscriberController(); + $result = $controller->getSubscribersForAutomation($automation, $query); + return new Response($result); + } +} diff --git a/mailpoet/lib/Automation/Integrations/MailPoet/Analytics/Factories/SubscriberControllerFactory.php b/mailpoet/lib/Automation/Integrations/MailPoet/Analytics/Factories/SubscriberControllerFactory.php new file mode 100644 index 0000000000..2b1ed98a3b --- /dev/null +++ b/mailpoet/lib/Automation/Integrations/MailPoet/Analytics/Factories/SubscriberControllerFactory.php @@ -0,0 +1,35 @@ +subscribersFeature = $subscribersFeature; + } + + public function getSubscriberController(): SubscriberController { + $container = \MailPoet\DI\ContainerWrapper::getInstance(); + return $this->isPremium() ? + $container->get(PremiumSubscriberController::class) : /* @phpstan-ignore-line */ + $container->get(FreeSubscriberController::class); + } + + private function isPremium(): bool { + return + class_exists(PremiumSubscriberController::class) + && $this->subscribersFeature->hasValidApiKey() + && !$this->subscribersFeature->check(); + } +} diff --git a/mailpoet/lib/DI/ContainerConfigurator.php b/mailpoet/lib/DI/ContainerConfigurator.php index 41c466844e..947c4ee30c 100644 --- a/mailpoet/lib/DI/ContainerConfigurator.php +++ b/mailpoet/lib/DI/ContainerConfigurator.php @@ -205,6 +205,10 @@ class ContainerConfigurator implements IContainerConfigurator { $container->autowire(\MailPoet\Automation\Integrations\MailPoet\Analytics\Controller\FreeOrderController::class)->setPublic(true); $container->autowire(\MailPoet\Automation\Integrations\MailPoet\Analytics\Factories\OrderControllerFactory::class)->setPublic(true); $container->autowire(\MailPoet\Automation\Integrations\MailPoet\Analytics\Endpoints\OrderEndpoint::class)->setPublic(true); + $container->autowire(\MailPoet\Automation\Integrations\MailPoet\Analytics\Controller\FreeSubscriberController::class)->setPublic(true); + $container->autowire(\MailPoet\Automation\Integrations\MailPoet\Analytics\Factories\SubscriberControllerFactory::class)->setPublic(true); + $container->autowire(\MailPoet\Automation\Integrations\MailPoet\Analytics\Endpoints\SubscriberEndpoint::class)->setPublic(true); + // Config $container->autowire(\MailPoet\Config\AccessControl::class)->setPublic(true); $container->autowire(\MailPoet\Config\Activator::class)->setPublic(true);