summaryrefslogtreecommitdiff
path: root/app/services/database/consistency_fix_service.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/database/consistency_fix_service.rb')
-rw-r--r--app/services/database/consistency_fix_service.rb48
1 files changed, 48 insertions, 0 deletions
diff --git a/app/services/database/consistency_fix_service.rb b/app/services/database/consistency_fix_service.rb
new file mode 100644
index 00000000000..402fa7541b3
--- /dev/null
+++ b/app/services/database/consistency_fix_service.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+module Database
+ class ConsistencyFixService
+ def initialize(source_model:, target_model:, sync_event_class:, source_sort_key:, target_sort_key:)
+ @source_model = source_model
+ @target_model = target_model
+ @sync_event_class = sync_event_class
+ @source_sort_key = source_sort_key
+ @target_sort_key = target_sort_key
+ end
+
+ attr_accessor :source_model, :target_model, :sync_event_class, :source_sort_key, :target_sort_key
+
+ def execute(ids:)
+ ids.each do |id|
+ if source_object(id) && target_object(id)
+ create_sync_event_for(id)
+ elsif target_object(id)
+ target_object(id).destroy!
+ end
+ end
+ sync_event_class.enqueue_worker
+ end
+
+ private
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def source_object(id)
+ source_model.find_by(source_sort_key => id)
+ end
+
+ def target_object(id)
+ target_model.find_by(target_sort_key => id)
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ def create_sync_event_for(id)
+ if source_model == Namespace
+ sync_event_class.create!(namespace_id: id)
+ elsif source_model == Project
+ sync_event_class.create!(project_id: id)
+ else
+ raise("Unknown Source Model #{source_model.name}")
+ end
+ end
+ end
+end