From 41efbf41f5c0b5413ca46f2aaca523b793e7dba6 Mon Sep 17 00:00:00 2001 From: Mantas Date: Tue, 29 Dec 2020 10:54:39 +0200 Subject: [PATCH] Refactoring: Transaction more readable and ensures cleanup even if block exits early --- app/models/transaction.rb | 112 ++++++++++++++++++++++++++++++++------ 1 file changed, 94 insertions(+), 18 deletions(-) diff --git a/app/models/transaction.rb b/app/models/transaction.rb index 26704bc42..8ce3b1349 100644 --- a/app/models/transaction.rb +++ b/app/models/transaction.rb @@ -1,26 +1,102 @@ class Transaction - def self.execute(options = {}) - if options[:reset_user_id] == true - UserInfo.current_user_id = 1 - end - if options[:bulk] == true - BulkImportInfo.enable - end - original_interface_handle = ApplicationHandleInfo.current - if options[:interface_handle] - ApplicationHandleInfo.current = options[:interface_handle] - end + attr_reader :options + attr_accessor :original_user_id, :original_interface_handle + + def initialize(options = {}) + @options = options + end + + def execute + start_execute + ActiveRecord::Base.transaction do - PushMessages.init + start_transaction + yield - if options[:interface_handle] - ApplicationHandleInfo.current = original_interface_handle - end - TransactionDispatcher.commit(options) - PushMessages.finish + ensure + finish_transaction end - return if options[:bulk] != true + ensure + finish_execute + end + + def self.execute(options = {}, &block) + Transaction.new(options).execute(&block) + end + + private + + def start_execute + reset_user_id_start + bulk_import_start + interface_handle_start + end + + def start_transaction + PushMessages.init + end + + def finish_execute + reset_user_id_finish + bulk_import_finish + end + + def finish_transaction + interface_handle_finish + + TransactionDispatcher.commit(options) + PushMessages.finish + end + + def reset_user_id? + options[:reset_user_id] == true + end + + def reset_user_id_start + return if !reset_user_id? + + self.original_user_id = UserInfo.current_user_id + + UserInfo.current_user_id = 1 + end + + def reset_user_id_finish + return if !reset_user_id? + + UserInfo.current_user_id = original_user_id + end + + def bulk_import? + options[:bulk] == true + end + + def bulk_import_start + return if !bulk_import? + + BulkImportInfo.enable + end + + def bulk_import_finish + return if !bulk_import? BulkImportInfo.disable end + + def interface_handle? + options[:interface_handle].present? + end + + def interface_handle_start + return if !interface_handle? + + self.original_interface_handle = ApplicationHandleInfo.current + + ApplicationHandleInfo.current = options[:interface_handle] + end + + def interface_handle_finish + return if !interface_handle? + + ApplicationHandleInfo.current = original_interface_handle + end end