diff options
Diffstat (limited to 'app/services/database/consistency_fix_service.rb')
-rw-r--r-- | app/services/database/consistency_fix_service.rb | 48 |
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 |