diff --git a/lib/API/JSON/ResponseBuilders/NewslettersResponseBuilder.php b/lib/API/JSON/ResponseBuilders/NewslettersResponseBuilder.php index bef14e7b8b..3752365c22 100644 --- a/lib/API/JSON/ResponseBuilders/NewslettersResponseBuilder.php +++ b/lib/API/JSON/ResponseBuilders/NewslettersResponseBuilder.php @@ -5,12 +5,29 @@ namespace MailPoet\API\JSON\ResponseBuilders; use MailPoet\Entities\NewsletterEntity; use MailPoet\Entities\SegmentEntity; use MailPoet\Entities\SendingQueueEntity; +use MailPoet\Models\SendingQueue; +use MailPoet\Newsletter\Statistics\NewsletterStatisticsRepository; class NewslettersResponseBuilder { const DATE_FORMAT = 'Y-m-d H:i:s'; - public function build(NewsletterEntity $newsletter) { - return [ + const RELATION_QUEUE = 'queue'; + const RELATION_SEGMENTS = 'segments'; + const RELATION_OPTIONS = 'options'; + const RELATION_TOTAL_SENT = 'total_sent'; + const RELATION_CHILDREN_COUNT = 'children_count'; + const RELATION_SCHEDULED = 'scheduled'; + const RELATION_STATISTICS = 'statistics'; + + /** @var NewslettersStatsRepository */ + private $newslettersStatsRepository; + + public function __construct(NewsletterStatisticsRepository $newslettersStatsRepository) { + $this->newslettersStatsRepository = $newslettersStatsRepository; + } + + public function build(NewsletterEntity $newsletter, $relations = []) { + $data = [ 'id' => (string)$newsletter->getId(), // (string) for BC 'hash' => $newsletter->getHash(), 'subject' => $newsletter->getSubject(), @@ -27,12 +44,36 @@ class NewslettersResponseBuilder { 'updated_at' => $newsletter->getUpdatedAt()->format(self::DATE_FORMAT), 'deleted_at' => ($deletedAt = $newsletter->getDeletedAt()) ? $deletedAt->format(self::DATE_FORMAT) : null, 'parent_id' => ($parent = $newsletter->getParent()) ? $parent->getId() : null, - 'segments' => $this->buildSegments($newsletter), - 'options' => $this->buildOptions($newsletter), - 'queue' => ($queue = $newsletter->getLatestQueue()) ? $this->buildQueue($queue) : false, // false for BC 'unsubscribe_token' => $newsletter->getUnsubscribeToken(), 'ga_campaign' => $newsletter->getGaCampaign(), ]; + + foreach ($relations as $relation) { + if ($relation === self::RELATION_QUEUE) { + $data['queue'] = ($queue = $newsletter->getLatestQueue()) ? $this->buildQueue($queue) : false; // false for BC + } + if ($relation === self::RELATION_SEGMENTS) { + $data['segments'] = $this->buildSegments($newsletter); + } + if ($relation === self::RELATION_OPTIONS) { + $data['options'] = $this->buildOptions($newsletter); + } + if ($relation === self::RELATION_TOTAL_SENT) { + $data['totalSent'] = $this->newslettersStatsRepository->getTotalSentCount($newsletter); + } + if ($relation === self::RELATION_CHILDREN_COUNT) { + $data['childrenCount'] = count($newsletter->getChildren()); + } + if ($relation === self::RELATION_SCHEDULED) { + $data['totalScheduled'] = (int)SendingQueue::findTaskByNewsletterId($this->id) + ->where('tasks.status', SendingQueue::STATUS_SCHEDULED) + ->count(); + } + if ($relation === self::RELATION_STATISTICS) { + $data['statistics'] = $this->newslettersStatsRepository->getStatistics($newsletter); + } + } + return $data; } private function buildSegments(NewsletterEntity $newsletter) { diff --git a/lib/API/JSON/v1/Newsletters.php b/lib/API/JSON/v1/Newsletters.php index 9d85a1b460..9cebbaa96f 100644 --- a/lib/API/JSON/v1/Newsletters.php +++ b/lib/API/JSON/v1/Newsletters.php @@ -118,7 +118,11 @@ class Newsletters extends APIEndpoint { : null; if ($newsletter) { - $response = $this->newslettersResponseBuilder->build($newsletter); + $response = $this->newslettersResponseBuilder->build($newsletter, [ + NewslettersResponseBuilder::RELATION_SEGMENTS, + NewslettersResponseBuilder::RELATION_OPTIONS, + NewslettersResponseBuilder::RELATION_QUEUE, + ]); $previewUrl = NewsletterUrl::getViewInBrowserUrl( NewsletterUrl::TYPE_LISTING_EDITOR, (object)[ @@ -138,25 +142,27 @@ class Newsletters extends APIEndpoint { } public function getWithStats($data = []) { - $id = (isset($data['id']) ? (int)$data['id'] : false); - $newsletter = Newsletter::findOne($id); - if ($newsletter instanceof Newsletter) { - $newsletter = $newsletter - ->withSegments() - ->withOptions() - ->withSendingQueue() - ->withTotalSent() - ->withStatistics($this->woocommerceHelper); - - $previewUrl = NewsletterUrl::getViewInBrowserUrl( + $newsletter = isset($data['id']) + ? $this->newslettersRepository->findOneById((int)$data['id']) + : null; + if ($newsletter) { + $response = $this->newslettersResponseBuilder->build($newsletter, [ + NewslettersResponseBuilder::RELATION_SEGMENTS, + NewslettersResponseBuilder::RELATION_OPTIONS, + NewslettersResponseBuilder::RELATION_QUEUE, + NewslettersResponseBuilder::RELATION_TOTAL_SENT, + NewslettersResponseBuilder::RELATION_STATISTICS, + ]); + $response = $this->wp->applyFilters('mailpoet_api_newsletters_get_after', $response); + $response['preview_url'] = NewsletterUrl::getViewInBrowserUrl( NewsletterUrl::TYPE_LISTING_EDITOR, - $newsletter, + (object)[ + 'id' => $newsletter->getId(), + 'hash' => $newsletter->getHash(), + ], Subscriber::getCurrentWPUser() ); - - $newsletter = $this->wp->applyFilters('mailpoet_api_newsletters_get_after', $newsletter->asArray()); - $newsletter['preview_url'] = $previewUrl; - return $this->successResponse($newsletter); + return $this->successResponse($response); } else { return $this->errorResponse([ APIError::NOT_FOUND => __('This email does not exist.', 'mailpoet'), diff --git a/lib/Entities/NewsletterEntity.php b/lib/Entities/NewsletterEntity.php index f2b4d786de..19bed3c4d0 100644 --- a/lib/Entities/NewsletterEntity.php +++ b/lib/Entities/NewsletterEntity.php @@ -125,6 +125,12 @@ class NewsletterEntity { */ private $parent; + /** + * @ORM\OneToMany(targetEntity="MailPoet\Entities\NewsletterEntity", mappedBy="parent") + * @var NewsletterEntity[]|ArrayCollection + */ + private $children; + /** * @ORM\OneToMany(targetEntity="MailPoet\Entities\NewsletterSegmentEntity", mappedBy="newsletter") * @var NewsletterSegmentEntity[]|ArrayCollection @@ -144,6 +150,7 @@ class NewsletterEntity { private $queues; public function __construct() { + $this->children = new ArrayCollection(); $this->newsletterSegments = new ArrayCollection(); $this->options = new ArrayCollection(); $this->queues = new ArrayCollection(); @@ -353,6 +360,13 @@ class NewsletterEntity { $this->parent = $parent; } + /** + * @return NewsletterEntity[]|ArrayCollection + */ + public function getChildren() { + return $this->children; + } + /** * @return NewsletterSegmentEntity[]|ArrayCollection */