summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Leitzen <pleitzen@gitlab.com>2018-12-18 20:18:05 +0100
committerPeter Leitzen <pleitzen@gitlab.com>2019-01-02 15:29:33 +0100
commit909082b397b53bce44666ab740f8f14bbef1da08 (patch)
treeac36de2d7e8e902dc6ff06e5f0683cea4ad0fb37
parent064409b854e66b2c5ebbbcad7a1be248483f40ba (diff)
downloadgitlab-ce-909082b397b53bce44666ab740f8f14bbef1da08.tar.gz
Implement error tracking setting service
-rw-r--r--app/models/error_tracking/error_tracking_setting.rb12
-rw-r--r--app/models/project.rb2
-rw-r--r--app/services/projects/error_tracking/setting_service.rb20
-rw-r--r--spec/factories/error_tracking/error_setting_tracking.rb10
-rw-r--r--spec/services/projects/error_tracking/setting_service_spec.rb65
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