diff --git a/modules/salesforce_logger/config/install/salesforce_logger.settings.yml b/modules/salesforce_logger/config/install/salesforce_logger.settings.yml index 58148004fbbc4fbaf4ee973658ea4c8368d456aa..ea0dd1d338257157b31e0d7f3945f4db7b3950ed 100644 --- a/modules/salesforce_logger/config/install/salesforce_logger.settings.yml +++ b/modules/salesforce_logger/config/install/salesforce_logger.settings.yml @@ -1 +1,5 @@ log_level: "salesforce.error" +log_push_params: false +log_push_params_maxlength: null +log_push_params_sanitized_fields: "" +log_push_success: false diff --git a/modules/salesforce_logger/config/schema/salesforce_logger.schema.yml b/modules/salesforce_logger/config/schema/salesforce_logger.schema.yml index 2796674a000c357b37c4d0779c0b46e80685b995..0cefdc6395744165df0f86a5805ce613a460fa2a 100644 --- a/modules/salesforce_logger/config/schema/salesforce_logger.schema.yml +++ b/modules/salesforce_logger/config/schema/salesforce_logger.schema.yml @@ -5,3 +5,17 @@ salesforce_logger.settings: log_level: type: string label: 'Salesforce Logger minimum log level' + log_push_params: + type: boolean + label: 'Enable it to log push params' + log_push_params_maxlength: + type: integer + label: 'Push params log max length' + log_push_params_sanitized_fields: + type: sequence + label: 'Push params field list that must be sanitized' + sequence: + type: string + log_push_success: + type: boolean + label: 'Enable it to log push success' diff --git a/modules/salesforce_logger/src/EventSubscriber/SalesforceLoggerSubscriber.php b/modules/salesforce_logger/src/EventSubscriber/SalesforceLoggerSubscriber.php index 5457a26e027759d43cf8e24dbdd1d0d36570e029..5ed107d4ef091fdc5ba3b80ad581327a9b1465a9 100644 --- a/modules/salesforce_logger/src/EventSubscriber/SalesforceLoggerSubscriber.php +++ b/modules/salesforce_logger/src/EventSubscriber/SalesforceLoggerSubscriber.php @@ -7,8 +7,10 @@ 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; +use Drupal\Core\Config\ImmutableConfig; /** * Salesforce Logger Subscriber. @@ -26,12 +28,12 @@ class SalesforceLoggerSubscriber implements EventSubscriberInterface { */ protected $logger; - /** + /** * The config factory. * * @var \Drupal\Core\Config\ConfigFactoryInterface */ - protected $config; + protected ConfigFactoryInterface $config; /** * Create a new Salesforce Logger Subscriber. @@ -51,6 +53,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 +62,67 @@ 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) { + $settings = $this->config->get('salesforce_logger.settings'); + $log_push_params = (bool) $settings->get('log_push_params'); + if ($log_push_params) { + $fields_to_sanitize = $settings->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 = $settings->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 076ece83c54d01a79d329df3bcdcc99a9fc8c1d6..c1feb19993c8174604c10c7415edaf6ad11c3719 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); }