trabajo-afectivo/lib/enrichment/clearbit/organization.rb

150 lines
3.7 KiB
Ruby

# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
module Enrichment
module Clearbit
class Organization
def initialize(user:, payload:)
@user = user
@payload = payload
@source = 'clearbit'
@config = Setting.get('clearbit_config')
@object = 'Organization'
end
def synced?
return false if !@config
UserInfo.current_user_id = 1
return false if !mapping?
return false if !changes?
# create new organization
return organization_created? if !remote_id? || !external_found?
# update existing organization
organization = existing_organization
return true if @user.organization_id
# assign new organization to user
update_user(organization)
end
private
def mapping?
@mapping = @config['organization_sync'].dup
return false if @mapping.blank?
# TODO: Refactoring:
# Currently all target keys are prefixed with
# organization.
# which is not necessary since the target object
# is always an organization
@mapping.transform_values! { |value| value.sub('organization.', '') }
true
end
def changes?
@current_changes = ExternalSync.map(
mapping: @mapping,
source: @payload
)
@current_changes.present?
end
def remote_id?
return if !@payload['company']
@remote_id = @payload['company']['id']
end
def external_found?
return true if @external_organization
@external_organization = ExternalSync.find_by(
source: @source,
source_id: @remote_id,
object: @object,
)
@external_organization.present?
end
def organization_created?
# if organization is already assigned, do not create a new one
return false if @user.organization_id
# can't create organization without name
return false if @current_changes[:name].blank?
organization = create_current
# assign new organization to user
update_user(organization)
end
def create_current
organization = ::Organization.find_by(name: @current_changes[:name])
return organization if organization
organization = ::Organization.new(
shared: @config['organization_shared'],
)
return organization if !ExternalSync.changed?(
object: organization,
current_changes: @current_changes,
)
organization.save!
ExternalSync.create(
source: @source,
source_id: @remote_id,
object: @object,
o_id: organization.id,
last_payload: @payload,
)
organization
end
def load_previous_changes
last_payload = @external_organization.last_payload
return if !last_payload
@previous_changes = ExternalSync.map(
mapping: @mapping,
source: last_payload
)
end
def existing_organization
load_previous_changes
organization = ::Organization.find(@external_organization[:o_id])
return organization if !ExternalSync.changed?(
object: organization,
previous_changes: @previous_changes,
current_changes: @current_changes,
)
organization.updated_by_id = 1
organization.save!
@external_organization.last_payload = @payload
@external_organization.save!
organization
end
def update_user(organization)
@user.organization_id = organization.id
true
end
end
end
end