diff options
author | Peter Leitzen <pleitzen@gitlab.com> | 2018-12-18 20:18:05 +0100 |
---|---|---|
committer | Peter Leitzen <pleitzen@gitlab.com> | 2019-01-02 15:29:33 +0100 |
commit | 909082b397b53bce44666ab740f8f14bbef1da08 (patch) | |
tree | ac36de2d7e8e902dc6ff06e5f0683cea4ad0fb37 | |
parent | 064409b854e66b2c5ebbbcad7a1be248483f40ba (diff) | |
download | gitlab-ce-909082b397b53bce44666ab740f8f14bbef1da08.tar.gz |
Implement error tracking setting service
-rw-r--r-- | app/models/error_tracking/error_tracking_setting.rb | 12 | ||||
-rw-r--r-- | app/models/project.rb | 2 | ||||
-rw-r--r-- | app/services/projects/error_tracking/setting_service.rb | 20 | ||||
-rw-r--r-- | spec/factories/error_tracking/error_setting_tracking.rb | 10 | ||||
-rw-r--r-- | spec/services/projects/error_tracking/setting_service_spec.rb | 65 |
5 files changed, 109 insertions, 0 deletions
diff --git a/app/models/error_tracking/error_tracking_setting.rb b/app/models/error_tracking/error_tracking_setting.rb index ad9df40f74d..c8ff3173227 100644 --- a/app/models/error_tracking/error_tracking_setting.rb +++ b/app/models/error_tracking/error_tracking_setting.rb @@ -4,11 +4,23 @@ module ErrorTracking class ErrorTrackingSetting < ActiveRecord::Base belongs_to :project + validates :uri, length: { maximum: 255 }, public_url: true + validates :token, presence: true + attr_encrypted :token, mode: :per_attribute_iv, key: Settings.attr_encrypted_db_key_base_truncated, algorithm: 'aes-256-gcm' + def self.create_or_update(project, params) + self.transaction(requires_new: true) do + setting = self.for_project(project) + setting.update!(params) + end + rescue ActiveRecord::RecordNotUnique + retry + end + def self.for_project(project) self.where(project: project).first_or_initialize end diff --git a/app/models/project.rb b/app/models/project.rb index 220b0dc8a27..00fa9bf1edf 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -236,6 +236,8 @@ class Project < ActiveRecord::Base has_one :project_feature, inverse_of: :project has_one :statistics, class_name: 'ProjectStatistics' + has_one :error_tracking_setting, inverse_of: :project, class_name: 'ErrorTracking::ErrorTrackingSetting' + has_one :cluster_project, class_name: 'Clusters::Project' has_many :clusters, through: :cluster_project, class_name: 'Clusters::Cluster' has_many :cluster_ingresses, through: :clusters, source: :application_ingress, class_name: 'Clusters::Applications::Ingress' diff --git a/app/services/projects/error_tracking/setting_service.rb b/app/services/projects/error_tracking/setting_service.rb new file mode 100644 index 00000000000..76c52981e82 --- /dev/null +++ b/app/services/projects/error_tracking/setting_service.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +module Projects + module ErrorTracking + class SettingService < BaseService + def execute + ::ErrorTracking::ErrorTrackingSetting.create_or_update(project, params) + success + rescue ActiveRecord::RecordInvalid => e + error(message_from(e.record)) + end + + private + + def message_from(setting) + setting.errors.full_messages.to_sentence + end + end + end +end diff --git a/spec/factories/error_tracking/error_setting_tracking.rb b/spec/factories/error_tracking/error_setting_tracking.rb new file mode 100644 index 00000000000..c90940ab94c --- /dev/null +++ b/spec/factories/error_tracking/error_setting_tracking.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +FactoryBot.define do + factory :error_tracking_setting, class: ErrorTracking::ErrorTrackingSetting do + project + enabled true + uri 'http://error_tracking.url' + token 'token' + end +end diff --git a/spec/services/projects/error_tracking/setting_service_spec.rb b/spec/services/projects/error_tracking/setting_service_spec.rb new file mode 100644 index 00000000000..b3c5fe3a476 --- /dev/null +++ b/spec/services/projects/error_tracking/setting_service_spec.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Projects::ErrorTracking::SettingService do + set(:user) { create(:user) } + set(:project) { create(:project) } + let(:result) { described_class.new(project, user, params).execute } + + let(:params) do + { + enabled: true, + uri: 'http://error_tracking.url', + token: 'token' + } + end + + describe '#execute' do + context 'with existing error tracking setting' do + before do + create(:error_tracking_setting, project: project) + end + + let(:params) do + { + enabled: false, + uri: 'http://something', + token: 'another token' + } + end + + it 'updates the settings' do + expect(result[:status]).to eq(:success) + + project.reload + expect(project.error_tracking_setting).not_to be_enabled + expect(project.error_tracking_setting.uri).to eq('http://something') + expect(project.error_tracking_setting.token).to eq('another token') + end + end + + context 'without an existing error tracking setting' do + it 'creates a setting' do + expect(result[:status]).to eq(:success) + + expect(project.error_tracking_setting).to be_enabled + expect(project.error_tracking_setting.uri).to eq('http://error_tracking.url') + expect(project.error_tracking_setting.token).to eq('token') + end + end + + context 'with invalid parameters' do + let(:params) do + { + } + end + + it 'fails to create the setting' do + expect(result[:status]).to eq(:error) + expect(result[:message]).to match(/valid URL/) + expect(result[:message]).to match(/be blank/) + end + end + end +end |