Use doctrine for latest post fetching

[MAILPOET-2899]
This commit is contained in:
Pavel Dohnal
2020-05-27 09:49:19 +02:00
committed by Veljko V
parent 7b0c5e61fe
commit c63c49af89
6 changed files with 78 additions and 35 deletions

View File

@ -265,6 +265,7 @@ class ContainerConfigurator implements IContainerConfigurator {
// Newsletter
$container->autowire(\MailPoet\Newsletter\AutomatedLatestContent::class)->setPublic(true);
$container->autowire(\MailPoet\Newsletter\NewsletterSaveController::class)->setPublic(true);
$container->autowire(\MailPoet\Newsletter\NewsletterPostsRepository::class)->setPublic(true);
$container->autowire(\MailPoet\Newsletter\NewslettersRepository::class)->setPublic(true);
$container->autowire(\MailPoet\Newsletter\Listing\NewsletterListingRepository::class)->setPublic(true);
$container->autowire(\MailPoet\Newsletter\Options\NewsletterOptionsRepository::class)->setPublic(true);

View File

@ -0,0 +1,52 @@
<?php
namespace MailPoet\Entities;
use MailPoet\Doctrine\EntityTraits\AutoincrementedIdTrait;
use MailPoet\Doctrine\EntityTraits\CreatedAtTrait;
use MailPoet\Doctrine\EntityTraits\SafeToOneAssociationLoadTrait;
use MailPoet\Doctrine\EntityTraits\UpdatedAtTrait;
use MailPoetVendor\Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity()
* @ORM\Table(name="newsletter_posts")
*/
class NewsletterPostEntity {
use AutoincrementedIdTrait;
use CreatedAtTrait;
use UpdatedAtTrait;
use SafeToOneAssociationLoadTrait;
/**
* @ORM\ManyToOne(targetEntity="MailPoet\Entities\NewsletterEntity", inversedBy="newsletterSegments")
* @var NewsletterEntity
*/
private $newsletter;
/**
* @ORM\Column(type="int")
* @var int
*/
private $postId;
public function __construct(NewsletterEntity $newsletter, int $postId) {
$this->newsletter = $newsletter;
$this->postId = $postId;
}
/**
* @return NewsletterEntity|null
*/
public function getNewsletter() {
$this->safelyLoadToOneAssociation('newsletter');
return $this->newsletter;
}
/**
* @return int
*/
public function getPostId(): int {
return $this->postId;
}
}

View File

@ -10,9 +10,4 @@ namespace MailPoet\Models;
class NewsletterPost extends Model {
public static $_table = MP_NEWSLETTER_POSTS_TABLE; // phpcs:ignore PSR2.Classes.PropertyDeclaration
public static function getNewestNewsletterPost($newsletterId) {
return self::where('newsletter_id', $newsletterId)
->orderByDesc('created_at')
->findOne();
}
}

View File

@ -0,0 +1,15 @@
<?php
namespace MailPoet\Newsletter;
use MailPoet\Doctrine\Repository;
use MailPoet\Entities\NewsletterPostEntity;
/**
* @extends Repository<NewsletterPostEntity>
*/
class NewsletterPostsRepository extends Repository {
protected function getEntityClassName() {
return NewsletterPostEntity::class;
}
}

View File

@ -3,9 +3,10 @@
namespace MailPoet\Newsletter\Renderer\Blocks;
use MailPoet\Entities\NewsletterEntity;
use MailPoet\Entities\NewsletterPostEntity;
use MailPoet\Models\Newsletter;
use MailPoet\Models\NewsletterPost;
use MailPoet\Newsletter\AutomatedLatestContent;
use MailPoet\Newsletter\NewsletterPostsRepository;
use MailPoet\Newsletter\Renderer\Columns\ColumnsHelper;
use MailPoet\Newsletter\Renderer\StylesHelper;
@ -37,7 +38,11 @@ class Renderer {
/** @var Text */
private $text;
/** @var NewsletterPostsRepository */
private $newsletterPostsRepository;
public function __construct(
NewsletterPostsRepository $newsletterPostsRepository,
AutomatedLatestContent $ALC,
Button $button,
Divider $divider,
@ -58,6 +63,7 @@ class Renderer {
$this->social = $social;
$this->spacer = $spacer;
$this->text = $text;
$this->newsletterPostsRepository = $newsletterPostsRepository;
}
public function render(NewsletterEntity $newsletter, $data) {
@ -126,9 +132,9 @@ class Renderer {
if ($parent instanceof NewsletterEntity) {
$newsletterId = $parent->getId();
$lastPost = NewsletterPost::getNewestNewsletterPost($newsletterId);
if ($lastPost) {
$newerThanTimestamp = $lastPost->createdAt;
$lastPost = $this->newsletterPostsRepository->findOneBy(['newsletter' => $newsletter], ['createdAt' => 'desc']);
if ($lastPost instanceof NewsletterPostEntity) {
$newerThanTimestamp = $lastPost->getCreatedAt();
}
}

View File

@ -1,26 +0,0 @@
<?php
namespace MailPoet\Test\Models;
use MailPoet\Models\NewsletterPost;
use MailPoetVendor\Carbon\Carbon;
class NewsletterPostTest extends \MailPoetTest {
public function testItCanGetLatestNewsletterPost() {
foreach (range(1, 5) as $index) {
$newsletterPost = NewsletterPost::create();
$newsletterPost->newsletterId = 1;
$newsletterPost->postId = $index;
$newsletterPost->save();
$newsletterPost->createdAt = Carbon::now()
->addMinutes($index);
$newsletterPost->save();
}
$latestNewsletterPost = NewsletterPost::getNewestNewsletterPost(1);
expect($latestNewsletterPost->postId)->equals(5);
}
public function _after() {
NewsletterPost::deleteMany();
}
}