Bulk.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. <?php
  2. namespace Dotdigitalgroup\Email\Model\Sync\Contact;
  3. /**
  4. * Handle bulk data for importer.
  5. */
  6. class Bulk
  7. {
  8. /**
  9. * @var \Dotdigitalgroup\Email\Model\ResourceModel\Importer
  10. */
  11. protected $importerResource;
  12. /**
  13. * @var \Dotdigitalgroup\Email\Helper\Data
  14. */
  15. protected $helper;
  16. /**
  17. * @var \Dotdigitalgroup\Email\Model\Apiconnector\Client
  18. */
  19. protected $client;
  20. /**
  21. * @var \Dotdigitalgroup\Email\Model\ContactFactory
  22. */
  23. private $contactFactory;
  24. /**
  25. * @var \Dotdigitalgroup\Email\Model\Config\Json
  26. */
  27. public $serializer;
  28. /**
  29. * Bulk constructor.
  30. * @param \Dotdigitalgroup\Email\Helper\Data $helper
  31. * @param \Dotdigitalgroup\Email\Model\ResourceModel\Importer $importerResource
  32. * @param \Dotdigitalgroup\Email\Model\Config\Json $serializer
  33. * @param \Dotdigitalgroup\Email\Model\ContactFactory $contactFactory
  34. */
  35. public function __construct(
  36. \Dotdigitalgroup\Email\Helper\Data $helper,
  37. \Dotdigitalgroup\Email\Model\ResourceModel\Importer $importerResource,
  38. \Dotdigitalgroup\Email\Model\Config\Json $serializer,
  39. \Dotdigitalgroup\Email\Model\ContactFactory $contactFactory
  40. ) {
  41. $this->helper = $helper;
  42. $this->serializer = $serializer;
  43. $this->importerResource = $importerResource;
  44. $this->contactFactory = $contactFactory;
  45. }
  46. /**
  47. * Sync.
  48. *
  49. * @param mixed $collection
  50. *
  51. * @return null
  52. */
  53. public function sync($collection)
  54. {
  55. foreach ($collection as $item) {
  56. $websiteId = $item->getWebsiteId();
  57. $file = $item->getImportFile();
  58. if ($this->helper->isEnabled($websiteId)) {
  59. $this->client = $this->helper->getWebsiteApiClient($websiteId);
  60. $addressBook = $this->_getAddressBook(
  61. $item->getImportType(),
  62. $websiteId
  63. );
  64. if (! empty($file) && ! empty($addressBook) && $this->client) {
  65. if ($this->helper->fileHelper->isFilePathExistWithFallback($file)) {
  66. //import contacts from csv file
  67. $result = $this->client->postAddressBookContactsImport($file, $addressBook);
  68. $this->_handleItemAfterSync($item, $result);
  69. } else {
  70. $item->setImportStatus(\Dotdigitalgroup\Email\Model\Importer::FAILED)
  71. ->setMessage(__('CSV file does not exist in email or archive folder.'));
  72. $this->importerResource->save($item);
  73. }
  74. }
  75. }
  76. }
  77. }
  78. /**
  79. * Get addressbook by import type.
  80. *
  81. * @param string $importType
  82. * @param int $websiteId
  83. *
  84. * @return string
  85. */
  86. private function _getAddressBook($importType, $websiteId)
  87. {
  88. switch ($importType) {
  89. case \Dotdigitalgroup\Email\Model\Importer::IMPORT_TYPE_CONTACT:
  90. $addressBook = $this->helper->getCustomerAddressBook(
  91. $websiteId
  92. );
  93. break;
  94. case \Dotdigitalgroup\Email\Model\Importer::IMPORT_TYPE_SUBSCRIBERS:
  95. $addressBook = $this->helper->getSubscriberAddressBook(
  96. $websiteId
  97. );
  98. break;
  99. case \Dotdigitalgroup\Email\Model\Importer::IMPORT_TYPE_GUEST:
  100. $addressBook = $this->helper->getGuestAddressBook($websiteId);
  101. break;
  102. default:
  103. $addressBook = '';
  104. }
  105. return $addressBook;
  106. }
  107. /**
  108. * @param mixed $item
  109. * @param mixed $result
  110. *
  111. * @return null
  112. */
  113. public function _handleItemAfterSync($item, $result)
  114. {
  115. $curlError = $this->_checkCurlError($item);
  116. if (!$curlError) {
  117. if (isset($result->message) && !isset($result->id)) {
  118. $item->setImportStatus(\Dotdigitalgroup\Email\Model\Importer::FAILED)
  119. ->setMessage($result->message);
  120. $this->importerResource->save($item);
  121. } elseif (isset($result->id) && !isset($result->message)) {
  122. $item->setImportStatus(\Dotdigitalgroup\Email\Model\Importer::IMPORTING)
  123. ->setImportId($result->id)
  124. ->setImportStarted(time())
  125. ->setMessage('');
  126. $this->importerResource->save($item);
  127. } else {
  128. $message = (isset($result->message)) ? $result->message : 'Error unknown';
  129. $item->setImportStatus(\Dotdigitalgroup\Email\Model\Importer::FAILED)
  130. ->setMessage($message);
  131. //If result id
  132. if (isset($result->id)) {
  133. $item->setImportId($result->id);
  134. }
  135. $this->importerResource->save($item);
  136. }
  137. }
  138. }
  139. /**
  140. * @param mixed $item
  141. *
  142. * @return bool
  143. */
  144. public function _checkCurlError($item)
  145. {
  146. //if curl error 28
  147. $curlError = $this->client->getCurlError();
  148. if ($curlError) {
  149. $item->setMessage($curlError)
  150. ->setImportStatus(\Dotdigitalgroup\Email\Model\Importer::FAILED);
  151. $this->importerResource->save($item);
  152. return true;
  153. }
  154. return false;
  155. }
  156. }