From 74a331353b6fe91a425daec6bd9fe24b8992f1e3 Mon Sep 17 00:00:00 2001 From: Omar <omar.lopesino@metadrop.net> Date: Thu, 26 Oct 2023 13:34:51 +0200 Subject: [PATCH] Issue #3396890: Allow logging push params and push success --- .../SalesforceLoggerSubscriber.php | 63 +++++++++++++++++++ .../src/Form/SettingsForm.php | 28 +++++++++ 2 files changed, 91 insertions(+) diff --git a/modules/salesforce_logger/src/EventSubscriber/SalesforceLoggerSubscriber.php b/modules/salesforce_logger/src/EventSubscriber/SalesforceLoggerSubscriber.php index f60cca3a..6d62857b 100644 --- a/modules/salesforce_logger/src/EventSubscriber/SalesforceLoggerSubscriber.php +++ b/modules/salesforce_logger/src/EventSubscriber/SalesforceLoggerSubscriber.php @@ -7,6 +7,7 @@ use Drupal\Core\Logger\RfcLogLevel; use Drupal\Core\Utility\Error; use Drupal\salesforce\Event\SalesforceEvents; use Drupal\salesforce\Event\SalesforceExceptionEventInterface; +use Drupal\salesforce_mapping\Event\SalesforcePushParamsEvent; use Psr\Log\LoggerInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; @@ -51,6 +52,8 @@ class SalesforceLoggerSubscriber implements EventSubscriberInterface { */ public static function getSubscribedEvents() { $events = [ + SalesforceEvents::PUSH_PARAMS => 'salesforcePushParams', + SalesforceEvents::PUSH_SUCCESS => 'salesforcePushSuccess', SalesforceEvents::ERROR => 'salesforceException', SalesforceEvents::WARNING => 'salesforceException', SalesforceEvents::NOTICE => 'salesforceException', @@ -58,6 +61,66 @@ class SalesforceLoggerSubscriber implements EventSubscriberInterface { return $events; } + /** + * Log params pushed to salesforce. + * + * This functionality can be setup by configuration so that: + * - The sensitive fields are not saved into database. + * - When the data sent is too large, it can be truncated. + * + * @param \Drupal\salesforce_mapping\Event\SalesforcePushParamsEvent $event + * Salesforce push params event. + */ + public function salesforcePushParams(SalesforcePushParamsEvent $event) { + $log_push_params = (bool) $this->config->get('log_push_params'); + if ($log_push_params) { + $fields_to_sanitize = $this->config->get('log_push_params_sanitized_fields') ?? []; + $params = $event->getParams()->getParams(); + foreach ($params as $key => $value) { + if (in_array($key, $fields_to_sanitize)) { + $params[$key] = '****'; + } + } + + $max_length = $this->config->get('log_push_params_maxlength'); + $params_json = json_encode($params); + if (!empty($max_length) && strlen($params_json) > $max_length) { + $params_json = substr($params_json, 0, $max_length) . '...'; + } + + $this->logger->debug( + sprintf('Entity of type "%s" is being pushed to salesforce "%s" entity. Drupal entity ID: %s. Data: %s', + $event->getEntity()->getEntityTypeId(), + $event->getMapping()->getSalesforceObjectType(), + $event->getEntity()->id(), + $params_json + ) + ); + + } + } + + /** + * Logs when a entity is mapped successfully to salesforce. + * + * @param \Drupal\salesforce_mapping\Event\SalesforcePushParamsEvent $event + * Push params event with salesforce ID. + */ + public function salesforcePushSuccess(SalesforcePushParamsEvent $event) { + $log_push_params = (bool) $this->config->get('log_push_success'); + if ($log_push_params) { + $this->logger->info( + sprintf( + 'Entity of type "%s" has been succesfully sent to salesforce as a "%s" entity. Drupal entity ID: %s. Salesforce entity ID: %s.', + $event->getEntity()->getEntityTypeId(), + $event->getMapping()->getSalesforceObjectType(), + $event->getEntity()->id(), + $event->getMappedObject()->sfid() + ) + ); + } + } + /** * SalesforceException event callback. * diff --git a/modules/salesforce_logger/src/Form/SettingsForm.php b/modules/salesforce_logger/src/Form/SettingsForm.php index 076ece83..c1feb199 100644 --- a/modules/salesforce_logger/src/Form/SettingsForm.php +++ b/modules/salesforce_logger/src/Form/SettingsForm.php @@ -44,6 +44,30 @@ class SettingsForm extends ConfigFormBase { '#default_value' => $config->get('log_level'), ]; + $form['log_push_params'] = [ + '#title' => $this->t('Log push params sent to salesforce'), + '#type' => 'checkbox', + '#default_value' => $config->get('log_push_params') ?? FALSE, + ]; + + $form['log_push_params_maxlength'] = [ + '#title' => $this->t('Log push params max length'), + '#type' => 'number', + '#default_value' => $config->get('log_push_params_maxlength') ?? NULL, + ]; + + $form['log_push_params_sanitized_fields'] = [ + '#title' => $this->t('Fields that must not be shown in logs'), + '#type' => 'textarea', + '#default_value' => implode("\r\n", $config->get('log_push_params_sanitized_fields') ?? []), + ]; + + $form['log_push_success'] = [ + '#title' => $this->t('Log push success when an entity is sent to salesforce'), + '#type' => 'checkbox', + '#default_value' => $config->get('log_push_success') ?? FALSE, + ]; + $form = parent::buildForm($form, $form_state); return $form; } @@ -54,6 +78,10 @@ class SettingsForm extends ConfigFormBase { public function submitForm(array &$form, FormStateInterface $form_state) { $config = $this->config('salesforce_logger.settings'); $config->set('log_level', $form_state->getValue('log_level')); + $config->set('log_push_params', $form_state->getValue('log_push_params')); + $config->set('log_push_params_maxlength', (int) $form_state->getValue('log_push_params_maxlength')); + $config->set('log_push_params_sanitized_fields', explode("\r\n", $form_state->getValue('log_push_params_sanitized_fields') ?? '')); + $config->set('log_push_success', $form_state->getValue('log_push_success')); $config->save(); parent::submitForm($form, $form_state); } -- GitLab