trabajo-afectivo/app/models/observer/transaction.rb

235 lines
5.9 KiB
Ruby
Raw Normal View History

2016-10-19 03:11:36 +00:00
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
2016-04-15 21:56:10 +00:00
class Observer::Transaction < ActiveRecord::Observer
2016-07-06 06:13:44 +00:00
observe :ticket, 'ticket::_article', :user, :organization, :tag
def self.commit(params = {})
# add attribute of interface handle (e. g. to send (no) notifications if a agent
# is creating a ticket via application_server, but send it if it's created via
# postmaster)
params[:interface_handle] = ApplicationHandleInfo.current
2016-04-15 21:56:10 +00:00
# execute object transactions
Observer::Transaction.perform(params)
end
def self.perform(params)
# return if we run import mode
return if Setting.get('import_mode')
# get buffer
list = EventBuffer.list('transaction')
# reset buffer
EventBuffer.reset('transaction')
2016-05-03 00:36:44 +00:00
# get asyn backends
sync_backends = []
2016-06-30 20:04:48 +00:00
Setting.where(area: 'Transaction::Backend::Sync').order(:name).each { |setting|
2016-05-03 00:36:44 +00:00
backend = Setting.get(setting.name)
next if params[:disable] && params[:disable].include?(backend)
2016-05-03 00:36:44 +00:00
sync_backends.push Kernel.const_get(backend)
}
2016-04-15 21:56:10 +00:00
# get uniq objects
list_objects = get_uniq_changes(list)
2016-06-30 20:04:48 +00:00
list_objects.each { |_object, objects|
objects.each { |_id, item|
2016-05-03 00:36:44 +00:00
# execute sync backends
2016-06-30 20:04:48 +00:00
sync_backends.each { |backend|
2016-05-03 00:36:44 +00:00
execute_singel_backend(backend, item, params)
}
# execute async backends
Delayed::Job.enqueue(Transaction::BackgroundJob.new(item, params))
}
2016-04-15 21:56:10 +00:00
}
end
2016-05-03 00:36:44 +00:00
def self.execute_singel_backend(backend, item, params)
2016-05-05 19:04:51 +00:00
Rails.logger.debug "Execute singel backend #{backend}"
2016-05-03 00:36:44 +00:00
begin
UserInfo.current_user_id = nil
integration = backend.new(item, params)
integration.perform
rescue => e
Rails.logger.error 'ERROR: ' + backend.inspect
Rails.logger.error 'ERROR: ' + e.inspect
Rails.logger.error e.backtrace.inspect
2016-05-03 00:36:44 +00:00
end
end
2016-04-15 21:56:10 +00:00
=begin
result = get_uniq_changes(events)
result = {
'Ticket' =>
1 => {
object: 'Ticket',
type: 'create',
object_id: 123,
article_id: 123,
user_id: 123,
2016-07-10 22:47:21 +00:00
created_at: Time.zone.now,
},
9 => {
object: 'Ticket',
type: 'update',
object_id: 123,
changes: {
attribute1: [before, now],
attribute2: [before, now],
},
user_id: 123,
2016-07-10 22:47:21 +00:00
created_at: Time.zone.now,
},
2016-04-15 21:56:10 +00:00
},
}
result = {
'Ticket' =>
9 => {
object: 'Ticket',
type: 'update',
object_id: 123,
article_id: 123,
changes: {
attribute1: [before, now],
attribute2: [before, now],
},
user_id: 123,
2016-07-10 22:47:21 +00:00
created_at: Time.zone.now,
},
2016-04-15 21:56:10 +00:00
},
}
=end
def self.get_uniq_changes(events)
list_objects = {}
events.each { |event|
# simulate article create as ticket update
article = nil
if event[:object] == 'Ticket::Article'
2016-04-15 21:56:10 +00:00
article = Ticket::Article.lookup(id: event[:id])
next if !article
next if event[:type] == 'update'
# set new event infos
ticket = Ticket.lookup(id: article.ticket_id)
event[:object] = 'Ticket'
event[:id] = ticket.id
event[:type] = 'update'
event[:changes] = nil
end
2016-04-15 21:56:10 +00:00
# get current state of objects
object = Kernel.const_get(event[:object]).lookup(id: event[:id])
2016-04-15 21:56:10 +00:00
# next if object is already deleted
next if !object
2016-04-15 21:56:10 +00:00
if !list_objects[event[:object]]
list_objects[event[:object]] = {}
end
if !list_objects[event[:object]][object.id]
list_objects[event[:object]][object.id] = {}
end
store = list_objects[event[:object]][object.id]
store[:object] = event[:object]
store[:object_id] = object.id
store[:user_id] = event[:user_id]
2016-07-10 22:47:21 +00:00
store[:created_at] = event[:created_at]
2016-04-15 21:56:10 +00:00
if !store[:type] || store[:type] == 'update'
store[:type] = event[:type]
end
2016-04-15 21:56:10 +00:00
# merge changes
if event[:changes]
if !store[:changes]
store[:changes] = event[:changes]
else
2016-06-30 20:04:48 +00:00
event[:changes].each { |key, value|
if !store[:changes][key]
store[:changes][key] = value
else
store[:changes][key][1] = value[1]
end
}
2016-04-15 21:56:10 +00:00
end
end
2016-04-15 21:56:10 +00:00
# remember article id if exists
if article
store[:article_id] = article.id
2016-04-15 21:56:10 +00:00
end
}
list_objects
end
def after_create(record)
# return if we run import mode
return if Setting.get('import_mode')
e = {
object: record.class.name,
2016-04-15 21:56:10 +00:00
type: 'create',
data: record,
id: record.id,
user_id: record.created_by_id,
2016-07-10 22:47:21 +00:00
created_at: Time.zone.now,
2016-04-15 21:56:10 +00:00
}
EventBuffer.add('transaction', e)
end
def before_update(record)
# return if we run import mode
return if Setting.get('import_mode')
# ignore certain attributes
real_changes = {}
2016-06-30 20:04:48 +00:00
record.changes.each { |key, value|
2016-04-15 21:56:10 +00:00
next if key == 'updated_at'
next if key == 'first_response_at'
next if key == 'close_at'
next if key == 'last_contact_agent_at'
next if key == 'last_contact_customer_at'
next if key == 'last_contact_at'
2016-04-15 21:56:10 +00:00
next if key == 'article_count'
next if key == 'create_article_type_id'
next if key == 'create_article_sender_id'
real_changes[key] = value
}
# do not send anything if nothing has changed
return if real_changes.empty?
2016-07-06 06:13:44 +00:00
changed_by_id = nil
2016-07-07 05:16:13 +00:00
changed_by_id = if record.respond_to?('updated_by_id')
record.updated_by_id
else
record.created_by_id
end
2016-07-06 06:13:44 +00:00
2016-04-15 21:56:10 +00:00
e = {
object: record.class.name,
2016-04-15 21:56:10 +00:00
type: 'update',
data: record,
changes: real_changes,
id: record.id,
2016-07-06 06:13:44 +00:00
user_id: changed_by_id,
2016-07-10 22:47:21 +00:00
created_at: Time.zone.now,
2016-04-15 21:56:10 +00:00
}
EventBuffer.add('transaction', e)
end
end