Class: Faq::MergeService

Inherits:
Object
  • Object
show all
Defined in:
app/services/faq/merge_service.rb

Defined Under Namespace

Classes: Result

Instance Method Summary collapse

Constructor Details

#initialize(target:, sources:, merge_answer: false, approved_answer: nil) ⇒ MergeService

Returns a new instance of MergeService.



11
12
13
14
15
16
# File 'app/services/faq/merge_service.rb', line 11

def initialize(target:, sources:, merge_answer: false, approved_answer: nil)
  @target = target
  @sources = Array(sources).reject { |s| s.id == target.id }
  @merge_answer = merge_answer
  @approved_answer = approved_answer
end

Instance Method Details

#callObject



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'app/services/faq/merge_service.rb', line 18

def call
  return Result.new(success: false, error: 'No source FAQs to merge') if @sources.empty?
  return Result.new(success: false, error: 'Target must be a FAQ') unless @target.is_a?(ArticleFaq)

  prepare_merged_answer

  ActiveRecord::Base.transaction do
    reassign_embedded_assets
    union_associations
    apply_answer
    @target.save!
    archive_sources
  end

  Result.new(success: true, target: @target, merged_count: @sources.size)
rescue StandardError => e
  ErrorReporting.error(e, context: { target_id: @target.id, source_ids: @sources.map(&:id) })
  Result.new(success: false, error: "Merge failed: #{e.message}")
end