LogEntryRotator.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. <?php
  2. /**
  3. * @copyright Vertex. All rights reserved. https://www.vertexinc.com/
  4. * @author Mediotype https://www.mediotype.com/
  5. */
  6. namespace Vertex\Tax\Model;
  7. use Magento\Framework\Api\SearchCriteriaBuilder;
  8. use Magento\Framework\Api\SearchCriteriaBuilderFactory;
  9. use Magento\Framework\Stdlib\DateTime;
  10. use Vertex\Tax\Api\Data\LogEntryInterface;
  11. use Vertex\Tax\Api\Data\LogEntrySearchResultsInterface;
  12. use Vertex\Tax\Api\LogEntryRepositoryInterface;
  13. use Vertex\Tax\Model\Config\Source\RotationAction;
  14. use Vertex\Tax\Model\LogEntryExportFactory;
  15. /**
  16. * Move DB-based log entries to flat-file format.
  17. */
  18. class LogEntryRotator
  19. {
  20. /** @var Config */
  21. private $config;
  22. /** @var SearchCriteriaBuilderFactory */
  23. private $criteriaBuilderFactory;
  24. /** @var DateTime */
  25. private $dateTime;
  26. /** @var LogEntryExportFactory */
  27. private $exportFactory;
  28. /** @var LogEntryRepositoryInterface */
  29. private $logEntryRepository;
  30. /**
  31. * @param DateTime $dateTime
  32. * @param LogEntryRepositoryInterface $logEntryRepository
  33. * @param SearchCriteriaBuilderFactory $criteriaBuilderFactory
  34. * @param \Vertex\Tax\Model\LogEntryExportFactory $exportFactory
  35. * @param Config $config
  36. */
  37. public function __construct(
  38. DateTime $dateTime,
  39. LogEntryRepositoryInterface $logEntryRepository,
  40. SearchCriteriaBuilderFactory $criteriaBuilderFactory,
  41. LogEntryExportFactory $exportFactory,
  42. Config $config
  43. ) {
  44. $this->dateTime = $dateTime;
  45. $this->logEntryRepository = $logEntryRepository;
  46. $this->criteriaBuilderFactory = $criteriaBuilderFactory;
  47. $this->exportFactory = $exportFactory;
  48. $this->config = $config;
  49. }
  50. /**
  51. * Rotate log entries older than the given lifetime value.
  52. *
  53. * @param int $lifetime The lifetime in seconds
  54. * @return void
  55. * @throws \Magento\Framework\Exception\CouldNotDeleteException
  56. * @throws \Magento\Framework\Exception\FileSystemException
  57. * @throws \Magento\Framework\Exception\NotFoundException
  58. * @throws \Magento\Framework\Exception\LocalizedException
  59. */
  60. public function rotate($lifetime)
  61. {
  62. $clearAfter = $this->dateTime->formatDate(time() - $lifetime);
  63. /** @var SearchCriteriaBuilder $findCriteriaBuilder */
  64. $findCriteriaBuilder = $this->criteriaBuilderFactory->create();
  65. $findCriteriaBuilder->addFilter(LogEntryInterface::FIELD_REQUEST_DATE, $clearAfter, 'lteq');
  66. $findCriteriaBuilder->setPageSize(100);
  67. $findCriteria = $findCriteriaBuilder->create();
  68. while(($entries = $this->logEntryRepository->getList($findCriteria)) && $entries->getTotalCount()) {
  69. /** @var LogEntrySearchResultsInterface $entries */
  70. if ($this->config->getRotationAction() === RotationAction::TYPE_EXPORT) {
  71. $this->export($entries);
  72. }
  73. $entityIds = array_map(
  74. function (LogEntryInterface $logEntry) {
  75. return $logEntry->getId();
  76. },
  77. $entries->getItems()
  78. );
  79. /** @var SearchCriteriaBuilder $deleteCriteriaBuilder */
  80. $deleteCriteriaBuilder = $this->criteriaBuilderFactory->create();
  81. $deleteCriteriaBuilder->addFilter(LogEntryInterface::FIELD_ID, $entityIds, 'in');
  82. $deleteCriteria = $deleteCriteriaBuilder->create();
  83. $this->logEntryRepository->deleteByCriteria($deleteCriteria);
  84. unset($entries, $entityIds, $deleteCriteria);
  85. }
  86. }
  87. /**
  88. * Export the given log entry set.
  89. *
  90. * @param LogEntrySearchResultsInterface $entries
  91. * @return void
  92. * @throws \Magento\Framework\Exception\FileSystemException
  93. * @throws \Magento\Framework\Exception\NotFoundException
  94. */
  95. private function export(LogEntrySearchResultsInterface $entries)
  96. {
  97. /** @var LogEntryExport $export */
  98. $export = $this->exportFactory->create();
  99. $export->open();
  100. $export->writeHeader();
  101. /** @var \Vertex\Tax\Api\Data\LogEntryInterface $entry */
  102. foreach ($entries->getItems() as $entry) {
  103. $export->write($entry);
  104. }
  105. $export->close();
  106. }
  107. }