Refactoring: Move Ruby class definitions to dedicated files to improve orientation and expressiveness.

This commit is contained in:
Thorsten Eckel 2019-09-27 09:22:16 +02:00
parent f0fdf7e7f3
commit d354dee74c
16 changed files with 311 additions and 298 deletions

View file

@ -225,8 +225,4 @@ returns
# create # create
History::Attribute.create!(name: name) History::Attribute.create!(name: name)
end end
class Object < ApplicationModel; end
class Type < ApplicationModel; end
class Attribute < ApplicationModel; end
end end

View file

@ -0,0 +1,4 @@
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
class History::Attribute < ApplicationModel
end

View file

@ -0,0 +1,4 @@
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
class History::Object < ApplicationModel
end

View file

@ -0,0 +1,4 @@
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
class History::Type < ApplicationModel
end

View file

@ -245,11 +245,3 @@ class Link < ApplicationModel
end end
end end
class Link::Type < ApplicationModel
validates :name, presence: true
end
class Link::Object < ApplicationModel
validates :name, presence: true
end

View file

@ -0,0 +1,5 @@
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
class Link::Object < ApplicationModel
validates :name, presence: true
end

5
app/models/link/type.rb Normal file
View file

@ -0,0 +1,5 @@
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
class Link::Type < ApplicationModel
validates :name, presence: true
end

View file

@ -485,83 +485,4 @@ execute all pending package migrations at once
true true
end end
class Migration < ApplicationModel
def self.linked
szpm_files = []
Dir.chdir(root) do
szpm_files = Dir['*.szpm']
end
szpm_files.each do |szpm_file|
package = szpm_file.sub('.szpm', '')
migrate(package)
end
end
def self.migrate(package, direction = 'normal')
location = "#{root}/db/addon/#{package.underscore}"
return true if !File.exist?(location)
# get existing migrations
migrations_existing = []
Dir.foreach(location) do |entry|
next if entry == '.'
next if entry == '..'
migrations_existing.push entry
end
# up
migrations_existing = migrations_existing.sort
# down
if direction == 'reverse'
migrations_existing = migrations_existing.reverse
end
migrations_existing.each do |migration|
next if !migration.match?(/\.rb$/)
version = nil
name = nil
if migration =~ /^(.+?)_(.*)\.rb$/
version = $1
name = $2
end
if !version || !name
raise "Invalid package migration '#{migration}'"
end
# down
done = Package::Migration.find_by(name: package.underscore, version: version)
if direction == 'reverse'
next if !done
logger.info "NOTICE: down package migration '#{migration}'"
load "#{location}/#{migration}"
classname = name.camelcase
classname.constantize.down
record = Package::Migration.find_by(name: package.underscore, version: version)
record&.destroy
# up
else
next if done
logger.info "NOTICE: up package migration '#{migration}'"
load "#{location}/#{migration}"
classname = name.camelcase
classname.constantize.up
Package::Migration.create(name: package.underscore, version: version)
end
end
end
def self.root
Rails.root
end
end
end end

View file

@ -0,0 +1,80 @@
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
class Package::Migration < ApplicationModel
def self.linked
szpm_files = []
Dir.chdir(root) do
szpm_files = Dir['*.szpm']
end
szpm_files.each do |szpm_file|
package = szpm_file.sub('.szpm', '')
migrate(package)
end
end
def self.migrate(package, direction = 'normal')
location = "#{root}/db/addon/#{package.underscore}"
return true if !File.exist?(location)
# get existing migrations
migrations_existing = []
Dir.foreach(location) do |entry|
next if entry == '.'
next if entry == '..'
migrations_existing.push entry
end
# up
migrations_existing = migrations_existing.sort
# down
if direction == 'reverse'
migrations_existing = migrations_existing.reverse
end
migrations_existing.each do |migration|
next if !migration.match?(/\.rb$/)
version = nil
name = nil
if migration =~ /^(.+?)_(.*)\.rb$/
version = $1
name = $2
end
if !version || !name
raise "Invalid package migration '#{migration}'"
end
# down
done = Package::Migration.find_by(name: package.underscore, version: version)
if direction == 'reverse'
next if !done
logger.info "NOTICE: down package migration '#{migration}'"
load "#{location}/#{migration}"
classname = name.camelcase
classname.constantize.down
record = Package::Migration.find_by(name: package.underscore, version: version)
record&.destroy
# up
else
next if done
logger.info "NOTICE: up package migration '#{migration}'"
load "#{location}/#{migration}"
classname = name.camelcase
classname.constantize.up
Package::Migration.create(name: package.underscore, version: version)
end
end
end
def self.root
Rails.root
end
end

View file

@ -150,198 +150,4 @@ returns
.order(:id) .order(:id)
.pluck('tag_items.name') .pluck('tag_items.name')
end end
class Object < ApplicationModel
validates :name, presence: true
=begin
lookup by name and create tag item
tag_object = Tag::Object.lookup_by_name_and_create('some tag')
=end
def self.lookup_by_name_and_create(name)
name.strip!
tag_object = Tag::Object.lookup(name: name)
return tag_object if tag_object
Tag::Object.create(name: name)
end
end
class Item < ApplicationModel
validates :name, presence: true
before_save :fill_namedowncase
=begin
lookup by name and create tag item
tag_item = Tag::Item.lookup_by_name_and_create('some tag')
=end
def self.lookup_by_name_and_create(name)
name.strip!
tag_item = Tag::Item.lookup(name: name)
return tag_item if tag_item
Tag::Item.create(name: name)
end
=begin
rename tag items
Tag::Item.rename(
id: existing_tag_item_to_rename,
name: 'new tag item name',
updated_by_id: current_user.id,
)
=end
def self.rename(data)
new_tag_name = data[:name].strip
old_tag_item = Tag::Item.find(data[:id])
already_existing_tag = Tag::Item.lookup(name: new_tag_name)
# check if no rename is needed
return true if new_tag_name == old_tag_item.name
# merge old with new tag if already existing
if already_existing_tag
# re-assign old tag to already existing tag
Tag.where(tag_item_id: old_tag_item.id).each do |tag|
# check if tag already exists on object
if Tag.find_by(tag_object_id: tag.tag_object_id, o_id: tag.o_id, tag_item_id: already_existing_tag.id)
Tag.tag_remove(
tag_object_id: tag.tag_object_id,
o_id: tag.o_id,
tag_item_id: old_tag_item.id,
)
next
end
# re-assign
tag_object = Tag::Object.lookup(id: tag.tag_object_id)
tag.tag_item_id = already_existing_tag.id
tag.save
# touch reference objects
Tag.touch_reference_by_params(
object: tag_object.name,
o_id: tag.o_id,
)
end
# delete not longer used tag
old_tag_item.destroy
return true
end
update_referenced_objects(old_tag_item.name, new_tag_name)
# update new tag name
old_tag_item.name = new_tag_name
old_tag_item.save
# touch reference objects
Tag.where(tag_item_id: old_tag_item.id).each do |tag|
tag_object = Tag::Object.lookup(id: tag.tag_object_id)
Tag.touch_reference_by_params(
object: tag_object.name,
o_id: tag.o_id,
)
end
true
end
=begin
remove tag item (destroy with reverences)
Tag::Item.remove(id)
=end
def self.remove(id)
# search for references, destroy and touch
Tag.where(tag_item_id: id).each do |tag|
tag_object = Tag::Object.lookup(id: tag.tag_object_id)
tag.destroy
Tag.touch_reference_by_params(
object: tag_object.name,
o_id: tag.o_id,
)
end
Tag::Item.find(id).destroy
true
end
def fill_namedowncase
self.name_downcase = name.downcase
true
end
=begin
Update referenced objects such as triggers, overviews, schedulers, and postmaster filters
Specifically, the following fields are updated:
Overview.condition
Trigger.condition Trigger.perform
Job.condition Job.perform
PostmasterFilter.perform
=end
def self.update_referenced_objects(old_name, new_name)
objects = Overview.all + Trigger.all + Job.all + PostmasterFilter.all
objects.each do |object|
changed = false
if object.has_attribute?(:condition)
changed |= update_condition_hash object.condition, old_name, new_name
end
if object.has_attribute?(:perform)
changed |= update_condition_hash object.perform, old_name, new_name
end
object.save if changed
end
end
def self.update_condition_hash(hash, old_name, new_name)
changed = false
hash.each do |key, condition|
next if %w[ticket.tags x-zammad-ticket-tags].exclude? key
next if condition[:value].split(', ').exclude? old_name
condition[:value] = update_name(condition[:value], old_name, new_name)
changed = true
end
changed
end
def self.update_name(condition, old_name, new_name)
tags = condition.split(', ')
return new_name if tags.size == 1
tags = tags.map { |t| t == old_name ? new_name : t }
tags.join(', ')
end
end
end end

171
app/models/tag/item.rb Normal file
View file

@ -0,0 +1,171 @@
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
class Tag::Item < ApplicationModel
validates :name, presence: true
before_save :fill_namedowncase
=begin
lookup by name and create tag item
tag_item = Tag::Item.lookup_by_name_and_create('some tag')
=end
def self.lookup_by_name_and_create(name)
name.strip!
tag_item = Tag::Item.lookup(name: name)
return tag_item if tag_item
Tag::Item.create(name: name)
end
=begin
rename tag items
Tag::Item.rename(
id: existing_tag_item_to_rename,
name: 'new tag item name',
updated_by_id: current_user.id,
)
=end
def self.rename(data)
new_tag_name = data[:name].strip
old_tag_item = Tag::Item.find(data[:id])
already_existing_tag = Tag::Item.lookup(name: new_tag_name)
# check if no rename is needed
return true if new_tag_name == old_tag_item.name
# merge old with new tag if already existing
if already_existing_tag
# re-assign old tag to already existing tag
Tag.where(tag_item_id: old_tag_item.id).each do |tag|
# check if tag already exists on object
if Tag.find_by(tag_object_id: tag.tag_object_id, o_id: tag.o_id, tag_item_id: already_existing_tag.id)
Tag.tag_remove(
tag_object_id: tag.tag_object_id,
o_id: tag.o_id,
tag_item_id: old_tag_item.id,
)
next
end
# re-assign
tag_object = Tag::Object.lookup(id: tag.tag_object_id)
tag.tag_item_id = already_existing_tag.id
tag.save
# touch reference objects
Tag.touch_reference_by_params(
object: tag_object.name,
o_id: tag.o_id,
)
end
# delete not longer used tag
old_tag_item.destroy
return true
end
update_referenced_objects(old_tag_item.name, new_tag_name)
# update new tag name
old_tag_item.name = new_tag_name
old_tag_item.save
# touch reference objects
Tag.where(tag_item_id: old_tag_item.id).each do |tag|
tag_object = Tag::Object.lookup(id: tag.tag_object_id)
Tag.touch_reference_by_params(
object: tag_object.name,
o_id: tag.o_id,
)
end
true
end
=begin
remove tag item (destroy with reverences)
Tag::Item.remove(id)
=end
def self.remove(id)
# search for references, destroy and touch
Tag.where(tag_item_id: id).each do |tag|
tag_object = Tag::Object.lookup(id: tag.tag_object_id)
tag.destroy
Tag.touch_reference_by_params(
object: tag_object.name,
o_id: tag.o_id,
)
end
Tag::Item.find(id).destroy
true
end
def fill_namedowncase
self.name_downcase = name.downcase
true
end
=begin
Update referenced objects such as triggers, overviews, schedulers, and postmaster filters
Specifically, the following fields are updated:
Overview.condition
Trigger.condition Trigger.perform
Job.condition Job.perform
PostmasterFilter.perform
=end
def self.update_referenced_objects(old_name, new_name)
objects = Overview.all + Trigger.all + Job.all + PostmasterFilter.all
objects.each do |object|
changed = false
if object.has_attribute?(:condition)
changed |= update_condition_hash object.condition, old_name, new_name
end
if object.has_attribute?(:perform)
changed |= update_condition_hash object.perform, old_name, new_name
end
object.save if changed
end
end
def self.update_condition_hash(hash, old_name, new_name)
changed = false
hash.each do |key, condition|
next if %w[ticket.tags x-zammad-ticket-tags].exclude? key
next if condition[:value].split(', ').exclude? old_name
condition[:value] = update_name(condition[:value], old_name, new_name)
changed = true
end
changed
end
def self.update_name(condition, old_name, new_name)
tags = condition.split(', ')
return new_name if tags.size == 1
tags = tags.map { |t| t == old_name ? new_name : t }
tags.join(', ')
end
end

22
app/models/tag/object.rb Normal file
View file

@ -0,0 +1,22 @@
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
class Tag::Object < ApplicationModel
validates :name, presence: true
=begin
lookup by name and create tag item
tag_object = Tag::Object.lookup_by_name_and_create('some tag')
=end
def self.lookup_by_name_and_create(name)
name.strip!
tag_object = Tag::Object.lookup(name: name)
return tag_object if tag_object
Tag::Object.create(name: name)
end
end

View file

@ -412,17 +412,4 @@ returns
o_id: id, o_id: id,
) )
end end
class Flag < ApplicationModel
end
class Sender < ApplicationModel
include ChecksLatestChangeObserved
validates :name, presence: true
end
class Type < ApplicationModel
include ChecksLatestChangeObserved
validates :name, presence: true
end
end end

View file

@ -0,0 +1,4 @@
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
class Ticket::Article::Flag < ApplicationModel
end

View file

@ -0,0 +1,6 @@
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
class Ticket::Article::Sender < ApplicationModel
include ChecksLatestChangeObserved
validates :name, presence: true
end

View file

@ -0,0 +1,6 @@
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
class Ticket::Article::Type < ApplicationModel
include ChecksLatestChangeObserved
validates :name, presence: true
end