説明なし

NewsletterTemplatesRepository.php 3.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. <?php
  2. namespace MailPoet\NewsletterTemplates;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\Doctrine\Repository;
  5. use MailPoet\Entities\NewsletterEntity;
  6. use MailPoet\Entities\NewsletterTemplateEntity;
  7. /**
  8. * @extends Repository<NewsletterTemplateEntity>
  9. */
  10. class NewsletterTemplatesRepository extends Repository {
  11. const RECENTLY_SENT_CATEGORIES = '["recent"]';
  12. const RECENTLY_SENT_COUNT = 12;
  13. protected function getEntityClassName() {
  14. return NewsletterTemplateEntity::class;
  15. }
  16. /**
  17. * @return NewsletterTemplateEntity[]
  18. */
  19. public function findAllForListing(): array {
  20. return $this->doctrineRepository->createQueryBuilder('nt')
  21. ->select('PARTIAL nt.{id,categories,thumbnail,name,readonly}')
  22. ->addOrderBy('nt.readonly', 'ASC')
  23. ->addOrderBy('nt.createdAt', 'DESC')
  24. ->addOrderBy('nt.id', 'DESC')
  25. ->getQuery()
  26. ->getResult();
  27. }
  28. public function createOrUpdate(array $data): NewsletterTemplateEntity {
  29. $template = !empty($data['newsletter_id'])
  30. ? $this->findOneBy(['newsletter' => (int)$data['newsletter_id']])
  31. : null;
  32. if (!$template) {
  33. $template = new NewsletterTemplateEntity($data['name'] ?? '');
  34. $this->entityManager->persist($template);
  35. }
  36. if (isset($data['newsletter_id'])) {
  37. $template->setNewsletter($this->entityManager->getReference(NewsletterEntity::class, (int)$data['newsletter_id']));
  38. }
  39. if (isset($data['name'])) {
  40. $template->setName($data['name']);
  41. }
  42. if (isset($data['thumbnail'])) {
  43. $template->setThumbnail($data['thumbnail']);
  44. }
  45. if (isset($data['body'])) {
  46. $template->setBody(json_decode($data['body'], true));
  47. }
  48. if (isset($data['categories'])) {
  49. $template->setCategories($data['categories']);
  50. }
  51. $this->entityManager->flush();
  52. return $template;
  53. }
  54. public function cleanRecentlySent() {
  55. // fetch 'RECENTLY_SENT_COUNT' of most recent template IDs in 'RECENTLY_SENT_CATEGORIES'
  56. $recentIds = $this->doctrineRepository->createQueryBuilder('nt')
  57. ->select('nt.id')
  58. ->where('nt.categories = :categories')
  59. ->setParameter('categories', self::RECENTLY_SENT_CATEGORIES)
  60. ->orderBy('nt.id', 'DESC')
  61. ->setMaxResults(self::RECENTLY_SENT_COUNT)
  62. ->getQuery()
  63. ->getResult();
  64. // delete all 'RECENTLY_SENT_CATEGORIES' templates except the latest ones selected above
  65. $this->entityManager->createQueryBuilder()
  66. ->delete(NewsletterTemplateEntity::class, 'nt')
  67. ->where('nt.categories = :categories')
  68. ->andWhere('nt.id NOT IN (:recentIds)')
  69. ->setParameter('categories', self::RECENTLY_SENT_CATEGORIES)
  70. ->setParameter('recentIds', array_column($recentIds, 'id'))
  71. ->getQuery()
  72. ->execute();
  73. }
  74. public function getRecentlySentCount(): int {
  75. return (int)$this->doctrineRepository->createQueryBuilder('nt')
  76. ->select('COUNT(nt.id)')
  77. ->where('nt.categories = :categories')
  78. ->setParameter('categories', self::RECENTLY_SENT_CATEGORIES)
  79. ->getQuery()
  80. ->getSingleScalarResult();
  81. }
  82. }