diff --git a/modules/salesforce_address/salesforce_address.info.yml b/modules/salesforce_address/salesforce_address.info.yml index 2567ac9a5e30b8de743004c1cde2dc002e3671d5..6721c7ed3fc68578802cf83f09b2e0702762cb9b 100644 --- a/modules/salesforce_address/salesforce_address.info.yml +++ b/modules/salesforce_address/salesforce_address.info.yml @@ -1,7 +1,7 @@ name: Salesforce Address type: module description: A custom Address Field Widget for Salesforce compatibility. -core_version_requirement: ^9 || ^10 +core_version_requirement: ^10.1 package: Salesforce dependencies: - address:address diff --git a/modules/salesforce_example/salesforce_example.info.yml b/modules/salesforce_example/salesforce_example.info.yml index 3a0e260e917941760350e019bfb94c275f69a5f9..4d627d16c0f3373e95328c197510b74188458f0f 100644 --- a/modules/salesforce_example/salesforce_example.info.yml +++ b/modules/salesforce_example/salesforce_example.info.yml @@ -1,7 +1,7 @@ name: Salesforce Example type: module description: Salesforce Examples -core_version_requirement: ^9 || ^10 +core_version_requirement: ^10.1 package: Salesforce dependencies: - salesforce:salesforce_push diff --git a/modules/salesforce_jwt/salesforce_jwt.info.yml b/modules/salesforce_jwt/salesforce_jwt.info.yml index 56bf92876f47dc596f45f7886ac52f3a4ccc59bc..c8d1058ebce445b62fa5e4820b229ff2196c28a0 100644 --- a/modules/salesforce_jwt/salesforce_jwt.info.yml +++ b/modules/salesforce_jwt/salesforce_jwt.info.yml @@ -1,7 +1,7 @@ name: Salesforce JWT Auth Provider type: module description: Provides key-based Salesforce authentication. -core_version_requirement: ^9 || ^10 +core_version_requirement: ^10.1 package: Salesforce configure: salesforce.auth_config dependencies: diff --git a/modules/salesforce_logger/salesforce_logger.info.yml b/modules/salesforce_logger/salesforce_logger.info.yml index ef85f72de8d985335578b504025f70d06b15b66c..fe44e091ec81a0055631da64318d8c912ceaea36 100644 --- a/modules/salesforce_logger/salesforce_logger.info.yml +++ b/modules/salesforce_logger/salesforce_logger.info.yml @@ -1,7 +1,7 @@ name: Salesforce Logger type: module description: Consolidated logging for Salesforce Log events. -core_version_requirement: ^9 || ^10 +core_version_requirement: ^10.1 package: Salesforce configure: salesforce_logger.settings dependencies: diff --git a/modules/salesforce_mapping/salesforce_mapping.info.yml b/modules/salesforce_mapping/salesforce_mapping.info.yml index 13fc08b55020743e8bb1bf14a0ea0f8b158ce8f6..e76df63e1319819932365917e084c19de785ffd0 100644 --- a/modules/salesforce_mapping/salesforce_mapping.info.yml +++ b/modules/salesforce_mapping/salesforce_mapping.info.yml @@ -2,7 +2,7 @@ name: Salesforce Mapping type: module description: Map Drupal entities to Salesforce objects. package: Salesforce -core_version_requirement: ^9 || ^10 +core_version_requirement: ^10.1 dependencies: - salesforce:salesforce - dynamic_entity_reference:dynamic_entity_reference diff --git a/modules/salesforce_mapping/src/Entity/MappedObject.php b/modules/salesforce_mapping/src/Entity/MappedObject.php index 9e8606099c33cf526283b994f2d6f3b74ce6acc5..b3d6e5b0377413504ac017b946c3fc0625bfd90c 100644 --- a/modules/salesforce_mapping/src/Entity/MappedObject.php +++ b/modules/salesforce_mapping/src/Entity/MappedObject.php @@ -23,6 +23,7 @@ use Drupal\salesforce_mapping\Event\SalesforcePushParamsEvent; use Drupal\salesforce_mapping\MappingConstants; use Drupal\salesforce_mapping\Plugin\Field\FieldType\SalesforceLinkItemList; use Drupal\salesforce_mapping\PushParams; +use Drupal\user\Entity\User; /** * Defines a Salesforce Mapped Object entity class. @@ -40,6 +41,9 @@ use Drupal\salesforce_mapping\PushParams; * "view_builder" = "Drupal\Core\Entity\EntityViewBuilder", * "views_data" = "Drupal\views\EntityViewsData", * "access" = "Drupal\salesforce_mapping\MappedObjectAccessControlHandler", + * "route_provider" = { + * "revision" = "Drupal\Core\Entity\Routing\RevisionHtmlRouteProvider" + * }, * }, * base_table = "salesforce_mapped_object", * revision_table = "salesforce_mapped_object_revision", @@ -105,24 +109,6 @@ class MappedObject extends RevisionableContentEntityBase implements MappedObject parent::__construct($values, 'salesforce_mapped_object'); } - /** - * {@inheritdoc} - */ - public function preSaveRevision(EntityStorageInterface $storage, \stdClass $record) { - // Revision uid, timestamp, and message are required for D9. - if ($this->isNewRevision()) { - if (empty($this->getRevisionUserId())) { - $this->setRevisionUserId(1); - } - if (empty($this->getRevisionCreationTime())) { - $this->setRevisionCreationTime(time()); - } - if (empty($this->getRevisionLogMessage())) { - $this->setRevisionLogMessage('New revision'); - } - } - } - /** * {@inheritdoc} */ @@ -131,6 +117,11 @@ class MappedObject extends RevisionableContentEntityBase implements MappedObject if ($this->isNew()) { $this->created = $this->getRequestTime(); } + if ($this->isNewRevision()) { + $this + ->setRevisionCreationTime($this->getRequestTime()) + ->setRevisionUserId($this->getCurrentUserId()); + } return parent::save(); } @@ -474,6 +465,7 @@ class MappedObject extends RevisionableContentEntityBase implements MappedObject $this ->set('last_sync_action', 'push_delete') ->set('last_sync_status', TRUE) + ->set('revision_log_message', '') ->save(); return $this; } @@ -600,19 +592,60 @@ class MappedObject extends RevisionableContentEntityBase implements MappedObject $drupal_entity->setSyncing(TRUE); $drupal_entity->save(); + $this->setNewRevision(TRUE); + // Update mapping object. $this->setNewRevision(TRUE); $this ->set('drupal_entity', $drupal_entity) ->set('entity_updated', $this->getRequestTime()) - ->set('last_sync_action', 'pull') + ->set('last_sync_action', $this->isNew() ? 'pull_create' : 'pull_update') ->set('last_sync_status', TRUE) ->set('force_pull', 0) + ->set('revision_log_message', '') ->save(); return $this; } + /** + * {@inheritDoc} + */ + public function getRevisionLogMessage() { + return parent::getRevisionLogMessage() ?: $this->last_sync_action->value; + } + + /** + * {@inheritDoc} + */ + public function getRevisionUserId() { + return parent::getRevisionUserId() ?: 1; + } + + /** + * {@inheritDoc} + */ + public function getRevisionUser() { + return parent::getRevisionuser() ?: User::load(1); + } + + /** + * {@inheritDoc} + */ + public function getRevisionCreationTime() { + return parent::getRevisionCreationTime() ?: $this->entity_updated->value; + } + + /** + * Testable func to return current user id. + * + * @return int + * The current user id. + */ + protected function getCurrentUserId() { + return \Drupal::currentUser()->id(); + } + /** * Testable func to return the request time server variable. * diff --git a/modules/salesforce_mapping_ui/salesforce_mapping_ui.info.yml b/modules/salesforce_mapping_ui/salesforce_mapping_ui.info.yml index 57e038f7cac1f211540f8e6fb3b92d0795c735bd..5553921fbe7f755f32c613cc0d1dcbd2ea359b14 100644 --- a/modules/salesforce_mapping_ui/salesforce_mapping_ui.info.yml +++ b/modules/salesforce_mapping_ui/salesforce_mapping_ui.info.yml @@ -2,7 +2,7 @@ name: Salesforce Mapping UI type: module description: User interface for managing Salesforce mappings. package: Salesforce -core_version_requirement: ^9 || ^10 +core_version_requirement: ^10.1 configure: entity.salesforce_mapping.list dependencies: - salesforce:salesforce_mapping diff --git a/modules/salesforce_mapping_ui/salesforce_mapping_ui.module b/modules/salesforce_mapping_ui/salesforce_mapping_ui.module index 5935eca46b004312ec2e1413440ab026e175500c..deb5e1dc077d07d28cb953c38c72b9ba8cbf645b 100644 --- a/modules/salesforce_mapping_ui/salesforce_mapping_ui.module +++ b/modules/salesforce_mapping_ui/salesforce_mapping_ui.module @@ -58,6 +58,7 @@ function salesforce_mapping_ui_entity_type_alter(array &$entity_types) { $entity_types['salesforce_mapped_object']->setLinkTemplate('edit-form', '/admin/content/salesforce/{salesforce_mapped_object}/edit'); $entity_types['salesforce_mapped_object']->setLinkTemplate('delete-form', '/admin/content/salesforce/{salesforce_mapped_object}/delete'); $entity_types['salesforce_mapped_object']->setLinkTemplate('canonical', '/admin/content/salesforce/{salesforce_mapped_object}'); + $entity_types['salesforce_mapped_object']->setLinkTemplate('version-history', '/admin/content/salesforce/{salesforce_mapped_object}/revisions'); } /** diff --git a/modules/salesforce_oauth/salesforce_oauth.info.yml b/modules/salesforce_oauth/salesforce_oauth.info.yml index aa589a0f628774d666ac17a76768d61cb05af3ab..d0989070df2509ef1bc8933731d3998f1983298c 100644 --- a/modules/salesforce_oauth/salesforce_oauth.info.yml +++ b/modules/salesforce_oauth/salesforce_oauth.info.yml @@ -1,7 +1,7 @@ name: Salesforce OAuth user-agent Provider type: module description: Provides user-agent-based Salesforce OAuth authentication. -core_version_requirement: ^9 || ^10 +core_version_requirement: ^10.1 package: Salesforce configure: salesforce.auth_config dependencies: diff --git a/modules/salesforce_pull/salesforce_pull.info.yml b/modules/salesforce_pull/salesforce_pull.info.yml index c93ae4ea9c48c0090ad1cd5f2d3bab04d051daf6..d5465efe8807102235c61ac6806670a80cfe98d5 100644 --- a/modules/salesforce_pull/salesforce_pull.info.yml +++ b/modules/salesforce_pull/salesforce_pull.info.yml @@ -2,6 +2,6 @@ name: Salesforce Pull type: module description: Imports objects from Salesforce based on mappings defined in Salesforce Mapping. package: Salesforce -core_version_requirement: ^9 || ^10 +core_version_requirement: ^10.1 dependencies: - salesforce:salesforce_mapping diff --git a/modules/salesforce_pull/src/Plugin/QueueWorker/PullBase.php b/modules/salesforce_pull/src/Plugin/QueueWorker/PullBase.php index 6950cbaa26a73fc448c94a84571ceb554c7158cf..8cfdeff4b98bbc84d9b93f89766301b2f1bddfb3 100644 --- a/modules/salesforce_pull/src/Plugin/QueueWorker/PullBase.php +++ b/modules/salesforce_pull/src/Plugin/QueueWorker/PullBase.php @@ -224,9 +224,18 @@ abstract class PullBase extends QueueWorkerBase implements ContainerFactoryPlugi } catch (\Exception $e) { $this->eventDispatcher->dispatch(new SalesforceErrorEvent($e, 'Failed to update entity %label from Salesforce object %sfobjectid.', [ - '%label' => $entity->label(), + '%label' => (isset($entity)) ? $entity->label() : "Unknown", '%sfobjectid' => (string) $sf_object->id(), ]), SalesforceEvents::WARNING); + + $mapped_object->setNewRevision(TRUE); + // Update mapped object. + $mapped_object + ->set('last_sync_action', 'pull_update') + ->set('last_sync_status', FALSE) + ->set('revision_log_message', $e->getMessage()) + ->save(); + // Throwing a new exception keeps current item in cron queue. throw $e; } diff --git a/modules/salesforce_push/salesforce_push.info.yml b/modules/salesforce_push/salesforce_push.info.yml index c453d48de80216604dda21b635a6c47339867656..8167436f856477db7ced9e39e2d12daab2c98ee2 100644 --- a/modules/salesforce_push/salesforce_push.info.yml +++ b/modules/salesforce_push/salesforce_push.info.yml @@ -2,6 +2,6 @@ name: Salesforce Push type: module description: Push data to Salesforce when updates are made to Drupal entities. package: Salesforce -core_version_requirement: ^9 || ^10 +core_version_requirement: ^10.1 dependencies: - salesforce:salesforce_mapping diff --git a/modules/salesforce_push/salesforce_push.module b/modules/salesforce_push/salesforce_push.module index 251abdf6397f1d26a87a40fded88482019c37f3b..ffb8d1f8a8974f24db93da57dbe626df394c3fb3 100644 --- a/modules/salesforce_push/salesforce_push.module +++ b/modules/salesforce_push/salesforce_push.module @@ -188,6 +188,7 @@ function salesforce_push_entity_crud_mapping(EntityInterface $entity, $op, Sales if (!$mapped_object->isNew()) { // Only update existing mapped objects. + $mapped_object->setNewRevision(TRUE); $mapped_object ->set('last_sync_action', $op) ->set('last_sync_status', FALSE) diff --git a/modules/salesforce_soap/salesforce_soap.info.yml b/modules/salesforce_soap/salesforce_soap.info.yml index 3c6e52637e5a82853aea56cd03fe3208e2d7738e..fa5ed25707529c0aa692ebe9bdee4a32ac785b49 100644 --- a/modules/salesforce_soap/salesforce_soap.info.yml +++ b/modules/salesforce_soap/salesforce_soap.info.yml @@ -2,6 +2,6 @@ name: Salesforce Soap type: module description: Exposes a SoapClient service for communicating with the Salesforce SOAP API. package: Salesforce -core_version_requirement: ^9 || ^10 +core_version_requirement: ^10.1 dependencies: - salesforce:salesforce diff --git a/modules/salesforce_webform/salesforce_webform.info.yml b/modules/salesforce_webform/salesforce_webform.info.yml index c7e28be8bfaf82d158f1fd6bce1adf38737ee744..d9ef1a510c6b9bb65a00f38dced1b5d5419adcb1 100644 --- a/modules/salesforce_webform/salesforce_webform.info.yml +++ b/modules/salesforce_webform/salesforce_webform.info.yml @@ -2,7 +2,7 @@ name: Salesforce Webform type: module description: Adds support for webforms fields in Salesforce Mapping. package: Salesforce -core_version_requirement: ^9 || ^10 +core_version_requirement: ^10.1 dependencies: - salesforce:salesforce_mapping diff --git a/salesforce.info.yml b/salesforce.info.yml index d48a7cd122d5912a6f910a81cebe2778316b6b9c..1f2f7c78365f5452defe791bc4ced26ec103edc7 100644 --- a/salesforce.info.yml +++ b/salesforce.info.yml @@ -2,5 +2,5 @@ name: Salesforce Integration type: module description: Modules to integrate Drupal and Salesforce package: Salesforce -core_version_requirement: ^9 || ^10 +core_version_requirement: ^10.1 configure: salesforce.admin_config_salesforce diff --git a/tests/modules/salesforce_test_rest_client/salesforce_test_rest_client.info.yml b/tests/modules/salesforce_test_rest_client/salesforce_test_rest_client.info.yml index 5427d74ca2e108ab56ca36885eb2bd76edbb723e..9c2805c1c2f2afde53785d65fb2e602c57e7feca 100644 --- a/tests/modules/salesforce_test_rest_client/salesforce_test_rest_client.info.yml +++ b/tests/modules/salesforce_test_rest_client/salesforce_test_rest_client.info.yml @@ -2,6 +2,6 @@ name: 'Salesforce Test Rest Client' type: module description: 'Provides a dummy Rest Client for functional tests.' package: Testing -core_version_requirement: ^9 || ^10 +core_version_requirement: ^10.1 dependencies: - salesforce:salesforce