TrialSetup.php 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. <?php
  2. namespace Dotdigitalgroup\Email\Model\Trial;
  3. use Dotdigitalgroup\Email\Helper\Config;
  4. /**
  5. * Handle the trial account creation.
  6. */
  7. class TrialSetup
  8. {
  9. /**
  10. * @var \Dotdigitalgroup\Email\Helper\Data
  11. */
  12. public $helper;
  13. /**
  14. * @var \Dotdigitalgroup\Email\Model\Connector\Datafield
  15. */
  16. private $dataField;
  17. /**
  18. * @var \Magento\Framework\App\Config\ReinitableConfigInterface
  19. */
  20. public $config;
  21. /**
  22. * @var \Magento\Framework\Math\Random
  23. */
  24. private $randomMath;
  25. /**
  26. * @var \Magento\Framework\Stdlib\DateTime\Timezone
  27. */
  28. private $timezone;
  29. /**
  30. * @var \Dotdigitalgroup\Email\Model\DateIntervalFactory
  31. */
  32. private $dateIntervalFactory;
  33. /**
  34. * TrialSetup constructor.
  35. *
  36. * @param \Dotdigitalgroup\Email\Helper\Data $helper
  37. * @param \Magento\Framework\Math\Random $randomMath
  38. * @param \Dotdigitalgroup\Email\Model\Connector\Datafield $dataField
  39. * @param \Magento\Framework\App\Config\ReinitableConfigInterface $config
  40. * @param \Magento\Framework\Stdlib\DateTime\Timezone $timezone,
  41. * @param \Dotdigitalgroup\Email\Model\DateIntervalFactory $dateIntervalFactory
  42. */
  43. public function __construct(
  44. \Dotdigitalgroup\Email\Helper\Data $helper,
  45. \Magento\Framework\Math\Random $randomMath,
  46. \Dotdigitalgroup\Email\Model\Connector\Datafield $dataField,
  47. \Magento\Framework\App\Config\ReinitableConfigInterface $config,
  48. \Magento\Framework\Stdlib\DateTime\Timezone $timezone,
  49. \Dotdigitalgroup\Email\Model\DateIntervalFactory $dateIntervalFactory
  50. ) {
  51. $this->dateIntervalFactory = $dateIntervalFactory;
  52. $this->timezone = $timezone;
  53. $this->randomMath = $randomMath;
  54. $this->helper = $helper;
  55. $this->dataField = $dataField;
  56. $this->config = $config;
  57. }
  58. /**
  59. * Save api credentioals.
  60. *
  61. * @param string $apiUser
  62. * @param string $apiPass
  63. *
  64. * @return bool
  65. */
  66. public function saveApiCreds($apiUser, $apiPass)
  67. {
  68. $this->helper->saveConfigData(
  69. Config::XML_PATH_CONNECTOR_API_ENABLED,
  70. '1',
  71. 'default',
  72. 0
  73. );
  74. $this->helper->saveConfigData(
  75. Config::XML_PATH_CONNECTOR_API_USERNAME,
  76. $apiUser,
  77. 'default',
  78. 0
  79. );
  80. //Save encrypted password
  81. $this->helper->saveConfigData(
  82. Config::XML_PATH_CONNECTOR_API_PASSWORD,
  83. $this->helper->encryptor->encrypt($apiPass),
  84. 'default',
  85. 0
  86. );
  87. //Clear config cache
  88. $this->config->reinit();
  89. return true;
  90. }
  91. /**
  92. * Setup data fields.
  93. *
  94. * @param string $username
  95. * @param string $password
  96. *
  97. * @return bool
  98. */
  99. public function setupDataFields($username, $password)
  100. {
  101. $error = false;
  102. $apiModel = false;
  103. if ($this->helper->isEnabled()) {
  104. $apiModel = $this->helper->getWebsiteApiClient(0, $username, $password);
  105. }
  106. if (!$apiModel) {
  107. $error = true;
  108. $this->helper->log('setupDataFields client is not enabled');
  109. } else {
  110. //validate account
  111. $accountInfo = $apiModel->getAccountInfo();
  112. if (isset($accountInfo->message)) {
  113. $this->helper->log('setupDataFields ' . $accountInfo->message);
  114. $error = true;
  115. } else {
  116. $dataFields = $this->dataField->getContactDatafields();
  117. foreach ($dataFields as $key => $dataField) {
  118. $apiModel->postDataFields($dataField);
  119. //map the successfully created data field
  120. $this->helper->saveConfigData(
  121. 'connector_data_mapping/customer_data/' . $key,
  122. strtoupper($dataField['name']),
  123. 'default',
  124. 0
  125. );
  126. $this->helper->log('setupDataFields successfully connected : ' . $dataField['name']);
  127. }
  128. }
  129. }
  130. return $error == true ? false : true;
  131. }
  132. /**
  133. * Create certain address books.
  134. *
  135. * @param string $username
  136. * @param string $password
  137. *
  138. * @return bool
  139. */
  140. public function createAddressBooks($username, $password)
  141. {
  142. $addressBooks = [
  143. ['name' => 'Magento_Customers', 'visibility' => 'Private'],
  144. ['name' => 'Magento_Subscribers', 'visibility' => 'Private'],
  145. ['name' => 'Magento_Guests', 'visibility' => 'Private'],
  146. ];
  147. $client = false;
  148. if ($this->helper->isEnabled()) {
  149. $client = $this->helper->getWebsiteApiClient(0, $username, $password);
  150. }
  151. if (!$client) {
  152. $error = true;
  153. $this->helper->log('createAddressBooks client is not enabled');
  154. } else {
  155. $error = $this->validateAccountAndCreateAddressbooks($client, $addressBooks);
  156. }
  157. return $error == true ? false : true;
  158. }
  159. /**
  160. * Map the successfully created address book
  161. *
  162. * @param string $name
  163. * @param int $id
  164. *
  165. * @return null
  166. */
  167. public function mapAddressBook($name, $id)
  168. {
  169. $addressBookMap = [
  170. 'Magento_Customers' => Config::XML_PATH_CONNECTOR_CUSTOMERS_ADDRESS_BOOK_ID,
  171. 'Magento_Subscribers' => Config::XML_PATH_CONNECTOR_SUBSCRIBERS_ADDRESS_BOOK_ID,
  172. 'Magento_Guests' => Config::XML_PATH_CONNECTOR_GUEST_ADDRESS_BOOK_ID,
  173. ];
  174. $this->helper->saveConfigData($addressBookMap[$name], $id, 'default', 0);
  175. $this->helper->log('successfully connected address book : ' . $name);
  176. }
  177. /**
  178. * Enable certain syncs for newly created trial account.
  179. *
  180. * @return bool
  181. */
  182. public function enableSyncForTrial()
  183. {
  184. $this->helper->saveConfigData(
  185. Config::XML_PATH_CONNECTOR_SYNC_CUSTOMER_ENABLED,
  186. '1',
  187. 'default',
  188. 0
  189. );
  190. $this->helper->saveConfigData(
  191. Config::XML_PATH_CONNECTOR_SYNC_GUEST_ENABLED,
  192. '1',
  193. 'default',
  194. 0
  195. );
  196. $this->helper->saveConfigData(
  197. Config::XML_PATH_CONNECTOR_SYNC_SUBSCRIBER_ENABLED,
  198. '1',
  199. 'default',
  200. 0
  201. );
  202. $this->helper->saveConfigData(
  203. Config::XML_PATH_CONNECTOR_SYNC_ORDER_ENABLED,
  204. '1',
  205. 'default',
  206. 0
  207. );
  208. //Clear config cache
  209. $this->config->reinit();
  210. return true;
  211. }
  212. /**
  213. * Save api endpoint.
  214. *
  215. * @param string $value
  216. *
  217. * @return null
  218. */
  219. public function saveApiEndPoint($value)
  220. {
  221. $this->helper->saveConfigData(
  222. Config::PATH_FOR_API_ENDPOINT,
  223. $value,
  224. 'default',
  225. 0
  226. );
  227. }
  228. /**
  229. * @param \Dotdigitalgroup\Email\Model\Apiconnector\Client $client
  230. * @param array $addressBooks
  231. *
  232. * @return bool
  233. */
  234. private function validateAccountAndCreateAddressbooks($client, $addressBooks)
  235. {
  236. //validate account
  237. $accountInfo = $client->getAccountInfo();
  238. $error = false;
  239. if (isset($accountInfo->message)) {
  240. $this->helper->log('createAddressBooks ' . $accountInfo->message);
  241. $error = true;
  242. } else {
  243. foreach ($addressBooks as $addressBook) {
  244. $addressBookName = $addressBook['name'];
  245. $visibility = $addressBook['visibility'];
  246. if (!empty($addressBookName)) {
  247. $response = $client->postAddressBooks($addressBookName, $visibility);
  248. if (isset($response->id)) {
  249. $this->mapAddressBook($addressBookName, $response->id);
  250. } else { //Need to fetch addressbook id to map. Addressbook already exist.
  251. $response = $client->getAddressBooks();
  252. if (!isset($response->message)) {
  253. foreach ($response as $book) {
  254. if ($book->name == $addressBookName) {
  255. $this->mapAddressBook($addressBookName, $book->id);
  256. break;
  257. }
  258. }
  259. }
  260. }
  261. }
  262. }
  263. }
  264. return $error;
  265. }
  266. /**
  267. * @return string
  268. * @throws \Magento\Framework\Exception\LocalizedException
  269. */
  270. public function generateTemporaryPasscode()
  271. {
  272. $code = $this->randomMath->getRandomString(32);
  273. $this->helper->saveConfigData(
  274. \Dotdigitalgroup\Email\Helper\Config::XML_PATH_CONNECTOR_API_TRIAL_TEMPORARY_PASSCODE,
  275. $code,
  276. 'default',
  277. 0
  278. );
  279. $expiryDate = $this->timezone->date();
  280. $expiryDate->add($this->dateIntervalFactory->create(['interval_spec' => 'PT30M']));
  281. $this->helper->saveConfigData(
  282. \Dotdigitalgroup\Email\Helper\Config::XML_PATH_CONNECTOR_API_TRIAL_TEMPORARY_PASSCODE_EXPIRY,
  283. $expiryDate->format(\DateTime::ATOM),
  284. 'default',
  285. 0
  286. );
  287. //Clear config cache
  288. $this->config->reinit();
  289. return $code;
  290. }
  291. }