ConfigBasedIntegrationManager.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Integration\Model;
  7. use Magento\Integration\Model\Config\Converter;
  8. use Magento\Authorization\Model\Acl\AclRetriever;
  9. use Magento\Authorization\Model\UserContextInterface;
  10. /**
  11. * Class to manage integrations installed from config file
  12. *
  13. */
  14. class ConfigBasedIntegrationManager
  15. {
  16. /**
  17. * Integration service
  18. *
  19. * @var \Magento\Integration\Api\IntegrationServiceInterface
  20. */
  21. protected $integrationService;
  22. /**
  23. * @var AclRetriever
  24. */
  25. protected $aclRetriever;
  26. /**
  27. * Integration config
  28. *
  29. * @var Config
  30. */
  31. protected $integrationConfig;
  32. /**
  33. * @param \Magento\Integration\Api\IntegrationServiceInterface $integrationService
  34. * @param AclRetriever $aclRetriever
  35. * @param Config $integrationConfig
  36. */
  37. public function __construct(
  38. \Magento\Integration\Api\IntegrationServiceInterface $integrationService,
  39. AclRetriever $aclRetriever,
  40. Config $integrationConfig
  41. ) {
  42. $this->integrationService = $integrationService;
  43. $this->aclRetriever = $aclRetriever;
  44. $this->integrationConfig = $integrationConfig;
  45. }
  46. /**
  47. * Process integrations from config files for the given array of integration names
  48. *
  49. * @param array $integrationNames
  50. * @return array
  51. * @deprecated 100.1.0
  52. */
  53. public function processIntegrationConfig(array $integrationNames)
  54. {
  55. if (empty($integrationNames)) {
  56. return [];
  57. }
  58. /** @var array $integrations */
  59. $integrations = $this->integrationConfig->getIntegrations();
  60. foreach ($integrationNames as $name) {
  61. $integrationDetails = $integrations[$name];
  62. $integrationData = [Integration::NAME => $name];
  63. if (isset($integrationDetails[Converter::KEY_EMAIL])) {
  64. $integrationData[Integration::EMAIL] = $integrationDetails[Converter::KEY_EMAIL];
  65. }
  66. if (isset($integrationDetails[Converter::KEY_AUTHENTICATION_ENDPOINT_URL])) {
  67. $integrationData[Integration::ENDPOINT] =
  68. $integrationDetails[Converter::KEY_AUTHENTICATION_ENDPOINT_URL];
  69. }
  70. if (isset($integrationDetails[Converter::KEY_IDENTITY_LINKING_URL])) {
  71. $integrationData[Integration::IDENTITY_LINK_URL] =
  72. $integrationDetails[Converter::KEY_IDENTITY_LINKING_URL];
  73. }
  74. $integrationData[Integration::SETUP_TYPE] = Integration::TYPE_CONFIG;
  75. // If it already exists, update it
  76. $integration = $this->integrationService->findByName($name);
  77. if ($integration->getId()) {
  78. //If Integration already exists, update it.
  79. //For now we will just overwrite the integration with same name but we will need a long term solution
  80. $integrationData[Integration::ID] = $integration->getId();
  81. $this->integrationService->update($integrationData);
  82. } else {
  83. $this->integrationService->create($integrationData);
  84. }
  85. }
  86. return $integrationNames;
  87. }
  88. /**
  89. * Process integrations from config files for the given array of integration names
  90. * to be used with consolidated integration config
  91. *
  92. * @param array $integrations
  93. * @return array
  94. */
  95. public function processConfigBasedIntegrations(array $integrations)
  96. {
  97. if (empty($integrations)) {
  98. return [];
  99. }
  100. foreach (array_keys($integrations) as $name) {
  101. $integrationDetails = $integrations[$name];
  102. $integrationData = [Integration::NAME => $name];
  103. if (isset($integrationDetails[Converter::KEY_EMAIL])) {
  104. $integrationData[Integration::EMAIL] = $integrationDetails[Converter::KEY_EMAIL];
  105. }
  106. if (isset($integrationDetails[Converter::KEY_AUTHENTICATION_ENDPOINT_URL])) {
  107. $integrationData[Integration::ENDPOINT] =
  108. $integrationDetails[Converter::KEY_AUTHENTICATION_ENDPOINT_URL];
  109. }
  110. if (isset($integrationDetails[Converter::KEY_IDENTITY_LINKING_URL])) {
  111. $integrationData[Integration::IDENTITY_LINK_URL] =
  112. $integrationDetails[Converter::KEY_IDENTITY_LINKING_URL];
  113. }
  114. if (isset($integrationDetails[$name]['resource'])) {
  115. $integrationData['resource'] = $integrationDetails[$name]['resource'];
  116. }
  117. $integrationData[Integration::SETUP_TYPE] = Integration::TYPE_CONFIG;
  118. $integration = $this->integrationService->findByName($name);
  119. if ($integration->getId()) {
  120. $originalResources = $this->aclRetriever->getAllowedResourcesByUser(
  121. UserContextInterface::USER_TYPE_INTEGRATION,
  122. $integration->getId()
  123. );
  124. $updateData = $integrationData;
  125. $updateData[Integration::ID] = $integration->getId();
  126. $integration = $this->integrationService->update($updateData);
  127. // If there were any changes, delete then recreate integration
  128. if ($this->hasDataChanged($integration, $originalResources)) {
  129. $this->integrationService->delete($integration->getId());
  130. $integrationData[Integration::STATUS] = Integration::STATUS_RECREATED;
  131. } else {
  132. continue;
  133. }
  134. }
  135. $this->integrationService->create($integrationData);
  136. }
  137. return $integrations;
  138. }
  139. /**
  140. * Check whether integration data or assigned resources were changed
  141. *
  142. * @param Integration $integration
  143. * @param array $originalResources
  144. * @return bool
  145. */
  146. private function hasDataChanged(Integration $integration, $originalResources)
  147. {
  148. if (!$integration->getOrigData()) {
  149. return true;
  150. }
  151. // Check if resources have changed
  152. $newResources = $integration->getData('resource');
  153. $commonResources = array_intersect(
  154. $originalResources,
  155. $newResources
  156. );
  157. if (count($commonResources) != count($originalResources) || count($commonResources) != count($newResources)) {
  158. return true;
  159. }
  160. // Check if other data has changed
  161. $fields = [
  162. Integration::ID,
  163. Integration::NAME,
  164. Integration::EMAIL,
  165. Integration::ENDPOINT,
  166. Integration::IDENTITY_LINK_URL,
  167. Integration::SETUP_TYPE,
  168. Integration::CONSUMER_ID
  169. ];
  170. foreach ($fields as $field) {
  171. if ($integration->getOrigData($field) != $integration->getData($field)) {
  172. return true;
  173. }
  174. }
  175. return false;
  176. }
  177. }