diff --git a/app/jobs/regular/create_case_comment.rb b/app/jobs/regular/create_case_comment.rb index ccefcdc..b63a8c7 100644 --- a/app/jobs/regular/create_case_comment.rb +++ b/app/jobs/regular/create_case_comment.rb @@ -14,7 +14,10 @@ def execute(args) topic = post.topic return unless topic.present? && topic.has_salesforce_case - ::Salesforce::CaseComment.new(topic.salesforce_case.uid, post).create! + begin + ::Salesforce::CaseComment.new(topic.salesforce_case.uid, post).create! + rescue Salesforce::InvalidCredentials + end end end end diff --git a/app/jobs/regular/create_feed_item.rb b/app/jobs/regular/create_feed_item.rb index aac524e..26fe224 100644 --- a/app/jobs/regular/create_feed_item.rb +++ b/app/jobs/regular/create_feed_item.rb @@ -15,7 +15,10 @@ def execute(args) uid = user.salesforce_contact_id || user.salesforce_lead_id return if uid.blank? - ::Salesforce::FeedItem.new(uid, post).create! + begin + ::Salesforce::FeedItem.new(uid, post).create! + rescue Salesforce::InvalidCredentials + end end end end diff --git a/app/jobs/regular/sync_case.rb b/app/jobs/regular/sync_case.rb index ad9ed4e..0fd55f4 100644 --- a/app/jobs/regular/sync_case.rb +++ b/app/jobs/regular/sync_case.rb @@ -6,7 +6,10 @@ def execute(args) return unless SiteSetting.salesforce_enabled topic = Topic.find(args[:topic_id]) - ::Salesforce::Case.sync!(topic) + begin + ::Salesforce::Case.sync!(topic) + rescue Salesforce::InvalidCredentials + end end end end diff --git a/app/jobs/regular/sync_case_comments.rb b/app/jobs/regular/sync_case_comments.rb index 58e0fa7..2c21195 100644 --- a/app/jobs/regular/sync_case_comments.rb +++ b/app/jobs/regular/sync_case_comments.rb @@ -9,8 +9,12 @@ def execute(args) post_id = args[:post_id] return if topic_id.blank? - salesforce_case = ::Salesforce::Case.find_by(topic_id: topic_id) - return if salesforce_case.blank? + begin + salesforce_case = ::Salesforce::Case.find_by(topic_id: topic_id) + return if salesforce_case.blank? + rescue Salesforce::InvalidCredentials + return + end posts = Post diff --git a/app/jobs/regular/sync_salesforce_user.rb b/app/jobs/regular/sync_salesforce_user.rb index 7741553..44bd134 100644 --- a/app/jobs/regular/sync_salesforce_user.rb +++ b/app/jobs/regular/sync_salesforce_user.rb @@ -6,10 +6,13 @@ 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 + begin + 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 + rescue Salesforce::InvalidCredentials end end end diff --git a/app/services/salesforce/problem_check/salesforce_invalid_credentials.rb b/app/services/salesforce/problem_check/salesforce_invalid_credentials.rb new file mode 100644 index 0000000..01b7fe2 --- /dev/null +++ b/app/services/salesforce/problem_check/salesforce_invalid_credentials.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +class Salesforce::ProblemCheck::SalesforceInvalidCredentials < ProblemCheck::InlineProblemCheck + self.priority = "high" +end diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 3424d84..82ac8ee 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -22,3 +22,5 @@ en: dashboard: salesforce: app_not_approved: "The Discourse connected app is not yet authorized in Salesforce by the user mentioned in site setting `salesforce_username`. Please follow this link to authorize it." + problem: + salesforce_invalid_credentials: "There was an issue with the Salesforce credentials. Please confirm the validity of the Salesforce client id and client secret settings" diff --git a/lib/salesforce/api.rb b/lib/salesforce/api.rb index c06fba4..22bf018 100644 --- a/lib/salesforce/api.rb +++ b/lib/salesforce/api.rb @@ -57,7 +57,10 @@ def call(path) end def set_access_token - raise Salesforce::InvalidCredentials unless self.class.has_credentials? + if !self.class.has_credentials? + ProblemCheckTracker[:salesforce_invalid_credentials].problem! + raise Salesforce::InvalidCredentials + end if AdminDashboardData.problem_message_check(APP_NOT_APPROVED) AdminDashboardData.clear_problem_message(APP_NOT_APPROVED) @@ -85,8 +88,13 @@ def set_access_token if status >= 300 && SiteSetting.salesforce_api_error_logs Rails.logger.error("Salesforce API error: #{status} #{body}") end - raise Salesforce::InvalidCredentials if status != 200 + if status != 200 + ProblemCheckTracker[:salesforce_invalid_credentials].problem! + raise Salesforce::InvalidCredentials + end + + ProblemCheckTracker[:salesforce_invalid_credentials].no_problem! data = JSON.parse(body) Discourse.redis.setex("salesforce_access_token", 10.minutes, data["access_token"]) SiteSetting.salesforce_instance_url = data["instance_url"] diff --git a/plugin.rb b/plugin.rb index 5997ab2..0631b31 100644 --- a/plugin.rb +++ b/plugin.rb @@ -30,6 +30,7 @@ module ::Salesforce after_initialize do SeedFu.fixture_paths << Rails.root.join("plugins", "discourse-salesforce", "db", "fixtures").to_s + register_problem_check Salesforce::ProblemCheck::SalesforceInvalidCredentials AdminDashboardData.problem_messages << ::Salesforce::Api::APP_NOT_APPROVED diff --git a/spec/lib/api_spec.rb b/spec/lib/api_spec.rb index b1029dd..f1fae92 100644 --- a/spec/lib/api_spec.rb +++ b/spec/lib/api_spec.rb @@ -14,6 +14,22 @@ it "returns invalid credentials error when Salesforce client ID is blank" do SiteSetting.salesforce_client_id = "" + expect { described_class.new }.to raise_error(::Salesforce::InvalidCredentials) + + problem = AdminNotice.find_by(identifier: "salesforce_invalid_credentials") + expect(problem.message).to eq( + I18n.t("dashboard.problem.salesforce_invalid_credentials", base_path: Discourse.base_path), + ) + expect(ProblemCheckTracker["salesforce_invalid_credentials"].failing?).to eq(true) + end + + it "resets invalid credentials error when Salesforce client ID is present" do + SiteSetting.salesforce_client_id = "client_id" + ProblemCheckTracker["salesforce_invalid_credentials"].problem! + + described_class.new + + expect(ProblemCheckTracker["salesforce_invalid_credentials"].failing?).to eq(false) end end