ファイル
btrc-hub/backend/app/services/material_sync_importer.rb
T
2026-06-25 17:40:34 +09:00

50 行
1.5 KiB
Ruby

class MaterialSyncImporter
Result = Struct.new(:material, :suppressed, :suppression, keyword_init: true)
def self.import! attributes
new(attributes).import!
end
def initialize attributes
@attributes = attributes
end
def import!
source = source_attributes
key = normalized_source_key(source)
raise ArgumentError, 'normalized_source_key is required for material sync' if key.blank?
suppression = MaterialSyncSuppressionMatcher.match(**source)
return Result.new(material: nil, suppressed: true, suppression:) if suppression
material =
Material
.unscoped
.find_or_initialize_by(normalized_source_key: key)
material.assign_attributes(material_attributes.merge(source))
material.save!
Result.new(material:, suppressed: false, suppression: nil)
end
private
def source_attributes
{ source_kind: @attributes[:source_kind],
source_uri: @attributes[:source_uri],
source_path: @attributes[:source_path],
source_file_id: @attributes[:source_file_id] }
end
def normalized_source_key source
MaterialSyncSuppression.normalize_source_key(source_kind: source[:source_kind],
source_uri: source[:source_uri],
source_path: source[:source_path],
source_file_id: source[:source_file_id])
end
def material_attributes
@attributes.except(:source_kind, :source_uri, :source_path, :source_file_id)
end
end