Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 27 additions & 2 deletions app/services/sync_forward_email_service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,21 @@ def sync_mappings_for_domain(domain:) # rubocop:disable Metrics/AbcSize,Metrics/
return if mappings.nil?

mapping_names = Set.new(mappings.keys)
aliases = fetch_aliases(domain:)
aliases_by_name = fetch_aliases(domain:)

errors = []

aliases = {}
aliases_by_name.each do |alias_name, alias_entries|
aliases[alias_name] = alias_entries.shift

alias_entries.each do |a|
delete_alias(alias_name:, id: a.fetch("id"), domain:)
rescue StandardError => e
Rails.logger.warn("Error while deleting duplicate alias #{alias_name}@#{domain}:\n#{e.message}")
errors << e
end
end

add_aliases = mapping_names - aliases.keys
delete_aliases = Set.new(aliases.keys) - mapping_names
Expand All @@ -46,11 +60,17 @@ def sync_mappings_for_domain(domain:) # rubocop:disable Metrics/AbcSize,Metrics/
add_aliases.each do |alias_name|
mapping = mappings.fetch(alias_name)
add_alias(alias_name:, domain:, recipients: mapping.destination_addresses)
rescue StandardError => e
Rails.logger.warn("Error while adding #{alias_name}@#{domain}\n#{e.message}")
errors << e
end

delete_aliases.each do |alias_name|
a = aliases.fetch(alias_name)
delete_alias(alias_name:, id: a.fetch("id"), domain:)
rescue StandardError => e
Rails.logger.warn("Error while deleting #{alias_name}@#{domain}:\n#{e.message}")
errors << e
end

check_aliases.each do |alias_name|
Expand All @@ -60,15 +80,20 @@ def sync_mappings_for_domain(domain:) # rubocop:disable Metrics/AbcSize,Metrics/
if mapping.destination_addresses.sort != a.fetch("recipients").sort
update_alias(alias_name:, domain:, id: a.fetch("id"), recipients: mapping.destination_addresses)
end
rescue StandardError => e
Rails.logger.warn("Error while updating #{alias_name}@#{domain}\n#{e.message}")
errors << e
end

{ errors: }
end

def fetch_domains
paginate_request("/v1/domains?pagination=true").index_by { |d| d["name"] }
end

def fetch_aliases(domain:)
paginate_request("/v1/domains/#{domain}/aliases?pagination=true").index_by { |a| a["name"] }
paginate_request("/v1/domains/#{domain}/aliases?pagination=true").group_by { |a| a["name"] }
end

def add_alias(alias_name:, domain:, recipients:)
Expand Down
Loading