# frozen_string_literal: true module CoinsPaid class Address module Types include Dry.Types() end class Data < Dry::Struct attribute :foreign_id, Types::Coercible::String attribute :currency, Types::String attribute :convert_to, Types::String end include Dry::Initializer.define -> do param :request_data, Data end def call ActiveRecord::Base.transaction do lookup_attrs = request_data.attributes.slice(:foreign_id, :convert_to, :currency) CoinsPaidAddress.lock.find_or_create_by!(lookup_attrs) do |address| response = CoinsPaid::API.take_address(request_data.attributes) address.assign_attributes(response.attributes) end end end end end