From 727b2908dd67815bc4833cfff59c4ca0a4f586fc Mon Sep 17 00:00:00 2001 From: Vinoth Kannan Date: Mon, 3 Jun 2024 17:45:20 +0530 Subject: [PATCH] FIX: move Salesforce API calls to background job. (#79) Otherwise, it will show an error in the signup form even after the user is created when the API call fails. This commit adds a new job `SyncSalesforceUser` that is responsible for syncing Salesforce user information. The job checks if Salesforce integration is enabled and then retrieves the user's Salesforce contact or lead ID based on their email. If a match is found, the user's custom fields are saved. --- app/jobs/regular/sync_salesforce_user.rb | 16 ++++++++++++++++ plugin.rb | 9 ++------- spec/models/user_spec.rb | 18 ++++++++++++++++++ 3 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 app/jobs/regular/sync_salesforce_user.rb create mode 100644 spec/models/user_spec.rb diff --git a/app/jobs/regular/sync_salesforce_user.rb b/app/jobs/regular/sync_salesforce_user.rb new file mode 100644 index 0000000..7741553 --- /dev/null +++ b/app/jobs/regular/sync_salesforce_user.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +module ::Jobs + class SyncSalesforceUser < ::Jobs::Base + def execute(args) + return unless SiteSetting.salesforce_enabled + + user = User.find(args[:user_id]) + if user.salesforce_contact_id = ::Salesforce::Contact.find_id_by_email(user.email) + user.save_custom_fields + elsif user.salesforce_lead_id = ::Salesforce::Lead.find_id_by_email(user.email) + user.save_custom_fields + end + end + end +end diff --git a/plugin.rb b/plugin.rb index 27af618..0cf99e9 100644 --- a/plugin.rb +++ b/plugin.rb @@ -85,6 +85,7 @@ def self.seed_groups! require_relative "app/jobs/regular/create_feed_item" require_relative "app/jobs/regular/sync_case_comments" require_relative "app/jobs/regular/sync_case" + require_relative "app/jobs/regular/sync_salesforce_user" require_relative "app/jobs/scheduled/sync_salesforce_users" require_relative "app/models/salesforce/case" require_relative "app/models/salesforce/feed_item" @@ -115,13 +116,7 @@ def self.seed_groups! Search.preloaded_topic_custom_fields << ::CaseMixin::HAS_SALESFORCE_CASE on(:user_created) do |user, opts| - if ::Salesforce::Api.has_credentials? - if user.salesforce_contact_id = ::Salesforce::Contact.find_id_by_email(user.email) - user.save_custom_fields - elsif user.salesforce_lead_id = ::Salesforce::Lead.find_id_by_email(user.email) - user.save_custom_fields - end - end + Jobs.enqueue(:sync_salesforce_user, user_id: user.id) if ::Salesforce::Api.has_credentials? end on(:post_created) do |post, opts| diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb new file mode 100644 index 0000000..0e41541 --- /dev/null +++ b/spec/models/user_spec.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +require "rails_helper" +require_relative "../spec_helper" + +RSpec.describe User do + include_context "with salesforce spec helper" + + describe "#on_create" do + it "syncs user to Salesforce" do + user = Fabricate.build(:user) + user.save! + + job_args = Jobs::SyncSalesforceUser.jobs.last["args"].first + expect(job_args["user_id"]).to eq(user.id) + end + end +end