Squashed commit of the following:

commit c8f7c2c2c489708c16e4eef584f45995576e2ce8
Author: Martin Edenhofer <me@edenhofer.de>
Date:   Mon Sep 5 23:23:21 2016 +0200

    Introduced Transaction.execute.
This commit is contained in:
Martin Edenhofer 2016-09-06 07:51:12 +02:00
parent 703ccd150f
commit be67419379
8 changed files with 67 additions and 69 deletions

View file

@ -419,14 +419,13 @@ retrns
# set interface handle
original_interface_handle = ApplicationHandleInfo.current
ApplicationHandleInfo.current = "#{original_interface_handle}.postmaster"
ticket = nil
article = nil
session_user = nil
# use transaction
ActiveRecord::Base.transaction do
Transaction.execute(interface_handle: "#{original_interface_handle}.postmaster") do
# get sender user
session_user_id = mail[ 'x-zammad-session-user-id'.to_sym ]
@ -552,11 +551,6 @@ retrns
end
end
ApplicationHandleInfo.current = original_interface_handle
# execute object transaction
Observer::Transaction.commit
# run postmaster post filter
filters = {}
Setting.where(area: 'Postmaster::PostFilter').order(:name).each { |setting|

View file

@ -40,16 +40,8 @@ class Job < ApplicationModel
if tickets
tickets.each do |ticket|
# use transaction
ActiveRecord::Base.transaction do
UserInfo.current_user_id = 1
Transaction.execute(disable_notification: job.disable_notification, reset_user_id: true) do
ticket.perform_changes(job.perform, 'job')
# execute object transaction
Observer::Transaction.commit(
disable_notification: job.disable_notification
)
end
end
end

View file

@ -7,7 +7,7 @@ class Observer::Ticket::OnlineNotificationSeen::BackgroundJob
def perform
# set all online notifications to seen
ActiveRecord::Base.transaction do
Transaction.execute do
ticket = Ticket.lookup(id: @ticket_id)
OnlineNotification.list_by_object('Ticket', @ticket_id).each { |notification|
next if notification.seen

View file

@ -160,15 +160,12 @@ returns
.where('pending_time <= ?', Time.zone.now)
tickets.each { |ticket|
ticket.state_id = next_state_map[ticket.state_id]
ticket.updated_at = Time.zone.now
ticket.updated_by_id = 1
ticket.save!
# we do not have an destructor at this point, so we need to
# execute object transaction manually
Observer::Transaction.commit
Transaction.execute do
ticket.state_id = next_state_map[ticket.state_id]
ticket.updated_at = Time.zone.now
ticket.updated_by_id = 1
ticket.save!
end
result.push ticket
}
end
@ -285,46 +282,50 @@ returns
def merge_to(data)
# update articles
Ticket::Article.where(ticket_id: id).each(&:touch)
Transaction.execute do
# quiet update of reassign of articles
Ticket::Article.where(ticket_id: id).update_all(['ticket_id = ?', data[:ticket_id] ])
Ticket::Article.where(ticket_id: id).each(&:touch)
# touch new ticket (to broadcast change)
Ticket.find(data[:ticket_id]).touch
# quiet update of reassign of articles
Ticket::Article.where(ticket_id: id).update_all(['ticket_id = ?', data[:ticket_id]])
# update history
# update history
# create new merge article
Ticket::Article.create(
ticket_id: id,
type_id: Ticket::Article::Type.lookup(name: 'note').id,
sender_id: Ticket::Article::Sender.lookup(name: 'Agent').id,
body: 'merged',
internal: false,
created_by_id: data[:user_id],
updated_by_id: data[:user_id],
)
# create new merge article
Ticket::Article.create(
ticket_id: id,
type_id: Ticket::Article::Type.lookup(name: 'note').id,
sender_id: Ticket::Article::Sender.lookup(name: 'Agent').id,
body: 'merged',
internal: false,
created_by_id: data[:user_id],
updated_by_id: data[:user_id],
)
# add history to both
# add history to both
# link tickets
Link.add(
link_type: 'parent',
link_object_source: 'Ticket',
link_object_source_value: data[:ticket_id],
link_object_target: 'Ticket',
link_object_target_value: id
)
# link tickets
Link.add(
link_type: 'parent',
link_object_source: 'Ticket',
link_object_source_value: data[:ticket_id],
link_object_target: 'Ticket',
link_object_target_value: id
)
# set state to 'merged'
self.state_id = Ticket::State.lookup(name: 'merged').id
# set state to 'merged'
self.state_id = Ticket::State.lookup(name: 'merged').id
# rest owner
self.owner_id = User.find_by(login: '-').id
# rest owner
self.owner_id = User.find_by(login: '-').id
# save ticket
save
# save ticket
save!
# touch new ticket (to broadcast change)
Ticket.find(data[:ticket_id]).touch
end
true
end
=begin

View file

@ -1,3 +1,20 @@
class Transaction
def self.execute(options = {})
if options[:reset_user_id] == true
UserInfo.current_user_id = 1
end
original_interface_handle = ApplicationHandleInfo.current
if options[:interface_handle]
ApplicationHandleInfo.current = options[:interface_handle]
end
ActiveRecord::Base.transaction do
PushMessages.init
yield
if options[:interface_handle]
ApplicationHandleInfo.current = original_interface_handle
end
Observer::Transaction.commit(disable_notification: options[:disable_notification])
PushMessages.finish
end
end
end

View file

@ -285,9 +285,7 @@ result
ticket = nil
# use transaction
ActiveRecord::Base.transaction do
UserInfo.current_user_id = 1
Transaction.execute(reset_user_id: true) do
existing_article = Ticket::Article.find_by(message_id: post['id'])
ticket = if existing_article
existing_article.ticket
@ -295,9 +293,6 @@ result
to_ticket(post, group_id, channel, page)
end
to_article(post, ticket, page)
# execute object transaction
Observer::Transaction.commit
end
ticket

View file

@ -6,6 +6,7 @@ module PushMessages
end
def self.init
return true if enabled?
Thread.current[:push_messages] = []
end
@ -22,6 +23,7 @@ module PushMessages
end
def self.finish
return false if !enabled?
Thread.current[:push_messages].each { |data|
Sessions.broadcast(
data[:message],
@ -30,6 +32,7 @@ module PushMessages
)
}
Thread.current[:push_messages] = nil
true
end
end

View file

@ -220,9 +220,8 @@ class TweetBase
end
}
end
ActiveRecord::Base.transaction do
UserInfo.current_user_id = 1
Transaction.execute(reset_user_id: true) do
# check if parent exists
user = to_user(tweet)
@ -251,9 +250,6 @@ class TweetBase
else
raise "Unknown tweet type '#{tweet.class}'"
end
# execute object transaction
Observer::Transaction.commit
end
if @connection_type == 'stream'