Implement NewsletterTempates::cleanRecentlySent() API using Doctrine
[MAILPOET-2647]
This commit is contained in:
@ -6,7 +6,6 @@ use MailPoet\API\JSON\Endpoint as APIEndpoint;
|
|||||||
use MailPoet\API\JSON\Error as APIError;
|
use MailPoet\API\JSON\Error as APIError;
|
||||||
use MailPoet\API\JSON\ResponseBuilders\NewsletterTemplatesResponseBuilder;
|
use MailPoet\API\JSON\ResponseBuilders\NewsletterTemplatesResponseBuilder;
|
||||||
use MailPoet\Config\AccessControl;
|
use MailPoet\Config\AccessControl;
|
||||||
use MailPoet\Models\NewsletterTemplate;
|
|
||||||
use MailPoet\NewsletterTemplates\NewsletterTemplatesRepository;
|
use MailPoet\NewsletterTemplates\NewsletterTemplatesRepository;
|
||||||
use MailPoet\WP\Functions as WPFunctions;
|
use MailPoet\WP\Functions as WPFunctions;
|
||||||
|
|
||||||
@ -58,7 +57,9 @@ class NewsletterTemplates extends APIEndpoint {
|
|||||||
ignore_user_abort(true);
|
ignore_user_abort(true);
|
||||||
try {
|
try {
|
||||||
$template = $this->newsletterTemplatesRepository->createOrUpdate($data);
|
$template = $this->newsletterTemplatesRepository->createOrUpdate($data);
|
||||||
NewsletterTemplate::cleanRecentlySent($data);
|
if (!empty($data['categories']) && $data['categories'] === NewsletterTemplatesRepository::RECENTLY_SENT_CATEGORIES) {
|
||||||
|
$this->newsletterTemplatesRepository->cleanRecentlySent();
|
||||||
|
}
|
||||||
$data = $this->newsletterTemplatesResponseBuilder->build($template);
|
$data = $this->newsletterTemplatesResponseBuilder->build($template);
|
||||||
return $this->successResponse($data);
|
return $this->successResponse($data);
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
|
@ -29,20 +29,4 @@ class NewsletterTemplate extends Model {
|
|||||||
'required' => WPFunctions::get()->__('The template body cannot be empty.', 'mailpoet'),
|
'required' => WPFunctions::get()->__('The template body cannot be empty.', 'mailpoet'),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function cleanRecentlySent($data) {
|
|
||||||
if (!empty($data['categories']) && $data['categories'] === self::RECENTLY_SENT_CATEGORIES) {
|
|
||||||
$ids = parent::where('categories', self::RECENTLY_SENT_CATEGORIES)
|
|
||||||
->select('id')
|
|
||||||
->orderByDesc('id')
|
|
||||||
->limit(self::RECENTLY_SENT_COUNT)
|
|
||||||
->findMany();
|
|
||||||
$ids = array_map(function ($template) {
|
|
||||||
return $template->id;
|
|
||||||
}, $ids);
|
|
||||||
parent::where('categories', self::RECENTLY_SENT_CATEGORIES)
|
|
||||||
->whereNotIn('id', $ids)
|
|
||||||
->deleteMany();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,8 @@ use MailPoet\Doctrine\Repository;
|
|||||||
use MailPoet\Entities\NewsletterEntity;
|
use MailPoet\Entities\NewsletterEntity;
|
||||||
use MailPoet\Entities\NewsletterTemplateEntity;
|
use MailPoet\Entities\NewsletterTemplateEntity;
|
||||||
|
|
||||||
|
use function MailPoetVendor\array_column;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @method NewsletterTemplateEntity[] findBy(array $criteria, array $orderBy = null, int $limit = null, int $offset = null)
|
* @method NewsletterTemplateEntity[] findBy(array $criteria, array $orderBy = null, int $limit = null, int $offset = null)
|
||||||
* @method NewsletterTemplateEntity|null findOneBy(array $criteria, array $orderBy = null)
|
* @method NewsletterTemplateEntity|null findOneBy(array $criteria, array $orderBy = null)
|
||||||
@ -15,6 +17,7 @@ use MailPoet\Entities\NewsletterTemplateEntity;
|
|||||||
*/
|
*/
|
||||||
class NewsletterTemplatesRepository extends Repository {
|
class NewsletterTemplatesRepository extends Repository {
|
||||||
const RECENTLY_SENT_CATEGORIES = '["recent"]';
|
const RECENTLY_SENT_CATEGORIES = '["recent"]';
|
||||||
|
const RECENTLY_SENT_COUNT = 12;
|
||||||
|
|
||||||
protected function getEntityClassName() {
|
protected function getEntityClassName() {
|
||||||
return NewsletterTemplateEntity::class;
|
return NewsletterTemplateEntity::class;
|
||||||
@ -66,4 +69,26 @@ class NewsletterTemplatesRepository extends Repository {
|
|||||||
$this->entityManager->flush();
|
$this->entityManager->flush();
|
||||||
return $template;
|
return $template;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function cleanRecentlySent() {
|
||||||
|
// fetch 'RECENTLY_SENT_COUNT' of most recent template IDs in 'RECENTLY_SENT_CATEGORIES'
|
||||||
|
$recentIds = $this->doctrineRepository->createQueryBuilder('nt')
|
||||||
|
->select('nt.id')
|
||||||
|
->where('nt.categories = :categories')
|
||||||
|
->setParameter('categories', self::RECENTLY_SENT_CATEGORIES)
|
||||||
|
->orderBy('nt.id', 'DESC')
|
||||||
|
->setMaxResults(self::RECENTLY_SENT_COUNT)
|
||||||
|
->getQuery()
|
||||||
|
->getResult();
|
||||||
|
|
||||||
|
// delete all 'RECENTLY_SENT_CATEGORIES' templates except the latest ones selected above
|
||||||
|
$this->entityManager->createQueryBuilder()
|
||||||
|
->delete(NewsletterTemplateEntity::class, 'nt')
|
||||||
|
->where('nt.categories = :categories')
|
||||||
|
->andWhere('nt.id NOT IN (:recentIds)')
|
||||||
|
->setParameter('categories', self::RECENTLY_SENT_CATEGORIES)
|
||||||
|
->setParameter('recentIds', array_column($recentIds, 'id'))
|
||||||
|
->getQuery()
|
||||||
|
->execute();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user