Skip to content
Snippets Groups Projects
Commit 96b350ec authored by Aaron Bauman's avatar Aaron Bauman Committed by Aaron Bauman
Browse files

Issue #3349963 - improve versioning support and add UI for revisions on mapped objects.

parent 172f0ad9
No related branches found
No related tags found
1 merge request!44Issue #3349963: Push/Pull Revisions
...@@ -23,6 +23,7 @@ use Drupal\salesforce_mapping\Event\SalesforcePushParamsEvent; ...@@ -23,6 +23,7 @@ use Drupal\salesforce_mapping\Event\SalesforcePushParamsEvent;
use Drupal\salesforce_mapping\MappingConstants; use Drupal\salesforce_mapping\MappingConstants;
use Drupal\salesforce_mapping\Plugin\Field\FieldType\SalesforceLinkItemList; use Drupal\salesforce_mapping\Plugin\Field\FieldType\SalesforceLinkItemList;
use Drupal\salesforce_mapping\PushParams; use Drupal\salesforce_mapping\PushParams;
use Drupal\user\Entity\User;
/** /**
* Defines a Salesforce Mapped Object entity class. * Defines a Salesforce Mapped Object entity class.
...@@ -40,6 +41,9 @@ use Drupal\salesforce_mapping\PushParams; ...@@ -40,6 +41,9 @@ use Drupal\salesforce_mapping\PushParams;
* "view_builder" = "Drupal\Core\Entity\EntityViewBuilder", * "view_builder" = "Drupal\Core\Entity\EntityViewBuilder",
* "views_data" = "Drupal\views\EntityViewsData", * "views_data" = "Drupal\views\EntityViewsData",
* "access" = "Drupal\salesforce_mapping\MappedObjectAccessControlHandler", * "access" = "Drupal\salesforce_mapping\MappedObjectAccessControlHandler",
* "route_provider" = {
* "revision" = \Drupal\Core\Entity\Routing\RevisionHtmlRouteProvider::class,
* },
* }, * },
* base_table = "salesforce_mapped_object", * base_table = "salesforce_mapped_object",
* revision_table = "salesforce_mapped_object_revision", * revision_table = "salesforce_mapped_object_revision",
...@@ -98,24 +102,6 @@ class MappedObject extends RevisionableContentEntityBase implements MappedObject ...@@ -98,24 +102,6 @@ class MappedObject extends RevisionableContentEntityBase implements MappedObject
parent::__construct($values, 'salesforce_mapped_object'); 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} * {@inheritdoc}
*/ */
...@@ -124,6 +110,11 @@ class MappedObject extends RevisionableContentEntityBase implements MappedObject ...@@ -124,6 +110,11 @@ class MappedObject extends RevisionableContentEntityBase implements MappedObject
if ($this->isNew()) { if ($this->isNew()) {
$this->created = $this->getRequestTime(); $this->created = $this->getRequestTime();
} }
if ($this->isNewRevision()) {
$this
->setRevisionCreationTime($this->getRequestTime())
->setRevisionUserId($this->getCurrentUserId());
}
return parent::save(); return parent::save();
} }
...@@ -467,6 +458,7 @@ class MappedObject extends RevisionableContentEntityBase implements MappedObject ...@@ -467,6 +458,7 @@ class MappedObject extends RevisionableContentEntityBase implements MappedObject
$this $this
->set('last_sync_action', 'push_delete') ->set('last_sync_action', 'push_delete')
->set('last_sync_status', TRUE) ->set('last_sync_status', TRUE)
->setRevisionLogMessage('')
->save(); ->save();
return $this; return $this;
} }
...@@ -593,18 +585,59 @@ class MappedObject extends RevisionableContentEntityBase implements MappedObject ...@@ -593,18 +585,59 @@ class MappedObject extends RevisionableContentEntityBase implements MappedObject
$drupal_entity->salesforce_pull = TRUE; $drupal_entity->salesforce_pull = TRUE;
$drupal_entity->save(); $drupal_entity->save();
$this->setNewRevision(TRUE);
// Update mapping object. // Update mapping object.
$this $this
->set('drupal_entity', $drupal_entity) ->set('drupal_entity', $drupal_entity)
->set('entity_updated', $this->getRequestTime()) ->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('last_sync_status', TRUE)
->set('force_pull', 0) ->set('force_pull', 0)
->setRevisionLogMessage('')
->save(); ->save();
return $this; 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. * Testable func to return the request time server variable.
* *
......
...@@ -58,6 +58,7 @@ function salesforce_mapping_ui_entity_type_alter(array &$entity_types) { ...@@ -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('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('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('canonical', '/admin/content/salesforce/{salesforce_mapped_object}');
$entity_types['salesforce_mapped_object']->setLinkTemplate('version-history', '/admin/content/salesforce/{salesforce_mapped_object}/revisions');
} }
/** /**
......
...@@ -106,9 +106,13 @@ class MappedObjectController extends ControllerBase { ...@@ -106,9 +106,13 @@ class MappedObjectController extends ControllerBase {
]; ];
} }
// Show the entity view for the mapped object. // Show one table of revisions per mapped object.
$builder = $this->entityTypeManager()->getListBuilder('salesforce_mapped_object'); foreach ($salesforce_mapped_objects as $mapped_object) {
return $builder->setEntityIds(array_keys($salesforce_mapped_objects))->render(); $builder = $this->entityTypeManager()
->getListBuilder('salesforce_mapped_object');
return $builder->setEntityIds(array_keys($salesforce_mapped_objects))
->render();
}
} }
} }
...@@ -224,6 +224,15 @@ abstract class PullBase extends QueueWorkerBase implements ContainerFactoryPlugi ...@@ -224,6 +224,15 @@ abstract class PullBase extends QueueWorkerBase implements ContainerFactoryPlugi
} }
catch (\Exception $e) { catch (\Exception $e) {
$this->eventDispatcher->dispatch(new SalesforceErrorEvent($e, 'Failed to update entity %label from Salesforce object %sfobjectid.', ['%label' => (isset($entity)) ? $entity->label() : "Unknown", '%sfobjectid' => (string) $sf_object->id()]), SalesforceEvents::WARNING); $this->eventDispatcher->dispatch(new SalesforceErrorEvent($e, 'Failed to update entity %label from Salesforce object %sfobjectid.', ['%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)
->setRevisionLogMessage($e->getMessage())
->save();
// Throwing a new exception keeps current item in cron queue. // Throwing a new exception keeps current item in cron queue.
throw $e; throw $e;
} }
......
...@@ -194,6 +194,7 @@ function salesforce_push_entity_crud_mapping(EntityInterface $entity, $op, Sales ...@@ -194,6 +194,7 @@ function salesforce_push_entity_crud_mapping(EntityInterface $entity, $op, Sales
if (!$mapped_object->isNew()) { if (!$mapped_object->isNew()) {
// Only update existing mapped objects. // Only update existing mapped objects.
$mapped_object->setNewRevision(TRUE);
$mapped_object $mapped_object
->set('last_sync_action', $op) ->set('last_sync_action', $op)
->set('last_sync_status', FALSE) ->set('last_sync_status', FALSE)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment