|
@@ -4,11 +4,6 @@ class Tag < ApplicationModel
|
|
|
belongs_to :tag_object, class_name: 'Tag::Object'
|
|
|
belongs_to :tag_item, class_name: 'Tag::Item'
|
|
|
|
|
|
- # rubocop:disable Style/ClassVars
|
|
|
- @@cache_item = {}
|
|
|
- @@cache_object = {}
|
|
|
-# rubocop:enable Style/ClassVars
|
|
|
-
|
|
|
=begin
|
|
|
|
|
|
add tags for certain object
|
|
@@ -23,18 +18,19 @@ add tags for certain object
|
|
|
=end
|
|
|
|
|
|
def self.tag_add(data)
|
|
|
+ data[:item].strip!
|
|
|
|
|
|
# lookups
|
|
|
if data[:object]
|
|
|
- tag_object_id = tag_object_lookup(data[:object])
|
|
|
+ tag_object_id = Tag::Object.lookup_by_name_and_create(data[:object]).id
|
|
|
end
|
|
|
if data[:item]
|
|
|
- tag_item_id = tag_item_lookup(data[:item].strip)
|
|
|
+ tag_item_id = Tag::Item.lookup_by_name_and_create(data[:item]).id
|
|
|
end
|
|
|
|
|
|
- # return in duplicate
|
|
|
+ # return if duplicate
|
|
|
current_tags = tag_list(data)
|
|
|
- return true if current_tags.include?(data[:item].strip)
|
|
|
+ return true if current_tags.include?(data[:item])
|
|
|
|
|
|
# create history
|
|
|
Tag.create(
|
|
@@ -53,29 +49,41 @@ add tags for certain object
|
|
|
|
|
|
remove tags of certain object
|
|
|
|
|
|
- Tag.tag_add(
|
|
|
+ Tag.tag_remove(
|
|
|
object: 'Ticket',
|
|
|
o_id: ticket.id,
|
|
|
item: 'some tag',
|
|
|
created_by_id: current_user.id,
|
|
|
)
|
|
|
|
|
|
+or by ids
|
|
|
+
|
|
|
+ Tag.tag_remove(
|
|
|
+ tag_object_id: 123,
|
|
|
+ o_id: ticket.id,
|
|
|
+ tag_item_id: 123,
|
|
|
+ created_by_id: current_user.id,
|
|
|
+ )
|
|
|
+
|
|
|
=end
|
|
|
|
|
|
def self.tag_remove(data)
|
|
|
|
|
|
# lookups
|
|
|
if data[:object]
|
|
|
- tag_object_id = tag_object_lookup(data[:object])
|
|
|
+ data[:tag_object_id] = Tag::Object.lookup_by_name_and_create(data[:object]).id
|
|
|
+ else
|
|
|
+ data[:object] = Tag::Object.lookup(id: data[:tag_object_id]).name
|
|
|
end
|
|
|
if data[:item]
|
|
|
- tag_item_id = tag_item_lookup(data[:item].strip)
|
|
|
+ data[:item].strip!
|
|
|
+ data[:tag_item_id] = Tag::Item.lookup_by_name_and_create(data[:item]).id
|
|
|
end
|
|
|
|
|
|
# create history
|
|
|
result = Tag.where(
|
|
|
- tag_object_id: tag_object_id,
|
|
|
- tag_item_id: tag_item_id,
|
|
|
+ tag_object_id: data[:tag_object_id],
|
|
|
+ tag_item_id: data[:tag_item_id],
|
|
|
o_id: data[:o_id],
|
|
|
)
|
|
|
result.each(&:destroy)
|
|
@@ -92,8 +100,6 @@ tag list for certain object
|
|
|
tags = Tag.tag_list(
|
|
|
object: 'Ticket',
|
|
|
o_id: ticket.id,
|
|
|
- item: 'some tag',
|
|
|
- created_by_id: current_user.id,
|
|
|
)
|
|
|
|
|
|
returns
|
|
@@ -103,82 +109,154 @@ returns
|
|
|
=end
|
|
|
|
|
|
def self.tag_list(data)
|
|
|
- tag_object_id_requested = tag_object_lookup(data[:object])
|
|
|
+ tag_object_id_requested = Tag::Object.lookup(name: data[:object])
|
|
|
+ return [] if !tag_object_id_requested
|
|
|
tag_search = Tag.where(
|
|
|
tag_object_id: tag_object_id_requested,
|
|
|
o_id: data[:o_id],
|
|
|
)
|
|
|
tags = []
|
|
|
tag_search.each {|tag|
|
|
|
- tags.push tag_item_lookup_id(tag.tag_item_id)
|
|
|
+ tag_item = Tag::Item.lookup(id: tag.tag_item_id)
|
|
|
+ next if !tag_item
|
|
|
+ tags.push tag_item.name
|
|
|
}
|
|
|
tags
|
|
|
end
|
|
|
|
|
|
- def self.tag_item_lookup_id(id)
|
|
|
+ class Object < ApplicationModel
|
|
|
+ validates :name, presence: true
|
|
|
|
|
|
- # use cache
|
|
|
- return @@cache_item[id] if @@cache_item[id]
|
|
|
+=begin
|
|
|
|
|
|
- # lookup
|
|
|
- tag_item = Tag::Item.find(id)
|
|
|
- @@cache_item[id] = tag_item.name
|
|
|
- tag_item.name
|
|
|
- end
|
|
|
+lookup by name and create tag item
|
|
|
|
|
|
- def self.tag_item_lookup(name)
|
|
|
+ tag_object = Tag::Object.lookup_by_name_and_create('some tag')
|
|
|
|
|
|
- # use cache
|
|
|
- return @@cache_item[name] if @@cache_item[name]
|
|
|
+=end
|
|
|
|
|
|
- # lookup
|
|
|
- tag_items = Tag::Item.where(name: name)
|
|
|
- tag_items.each {|tag_item|
|
|
|
- next if tag_item.name != name
|
|
|
- @@cache_item[name] = tag_item.id
|
|
|
- return tag_item.id
|
|
|
- }
|
|
|
+ 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
|
|
|
|
|
|
- # create
|
|
|
- tag_item = Tag::Item.create(name: name)
|
|
|
- @@cache_item[name] = tag_item.id
|
|
|
- tag_item.id
|
|
|
end
|
|
|
|
|
|
- def self.tag_object_lookup_id(id)
|
|
|
+ class Item < ApplicationModel
|
|
|
+ validates :name, presence: true
|
|
|
+ before_save :fill_namedowncase
|
|
|
|
|
|
- # use cache
|
|
|
- return @@cache_object[id] if @@cache_object[id]
|
|
|
+=begin
|
|
|
|
|
|
- # lookup
|
|
|
- tag_object = Tag::Object.find(id)
|
|
|
- @@cache_object[id] = tag_object.name
|
|
|
- tag_object.name
|
|
|
- end
|
|
|
+lookup by name and create tag item
|
|
|
|
|
|
- def self.tag_object_lookup(name)
|
|
|
+ tag_item = Tag::Item.lookup_by_name_and_create('some tag')
|
|
|
|
|
|
- # use cache
|
|
|
- return @@cache_object[name] if @@cache_object[name]
|
|
|
+=end
|
|
|
+
|
|
|
+ def self.lookup_by_name_and_create(name)
|
|
|
+ name.strip!
|
|
|
+
|
|
|
+ tag_item = Tag::Item.lookup(name: name)
|
|
|
+ return tag_item if tag_item
|
|
|
|
|
|
- # lookup
|
|
|
- tag_object = Tag::Object.find_by(name: name)
|
|
|
- if tag_object
|
|
|
- @@cache_object[name] = tag_object.id
|
|
|
- return tag_object.id
|
|
|
+ Tag::Item.create(name: name)
|
|
|
end
|
|
|
|
|
|
- # create
|
|
|
- tag_object = Tag::Object.create(name: name)
|
|
|
- @@cache_object[name] = tag_object.id
|
|
|
- tag_object.id
|
|
|
- end
|
|
|
+=begin
|
|
|
|
|
|
- class Object < ActiveRecord::Base
|
|
|
- end
|
|
|
+rename tag items
|
|
|
|
|
|
- class Item < ActiveRecord::Base
|
|
|
- before_save :fill_namedowncase
|
|
|
+ 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)
|
|
|
+
|
|
|
+ # 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 {|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,
|
|
|
+ )
|
|
|
+ }
|
|
|
+
|
|
|
+ # delete not longer used tag
|
|
|
+ old_tag_item.destroy
|
|
|
+
|
|
|
+ # update new tag name
|
|
|
+ else
|
|
|
+
|
|
|
+ old_tag_item.name = new_tag_name
|
|
|
+ old_tag_item.save
|
|
|
+
|
|
|
+ # touch reference objects
|
|
|
+ Tag.where(tag_item_id: old_tag_item.id).each {|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 {|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,
|
|
|
+ )
|
|
|
+ }
|
|
|
+ Tag::Item.find(id).destroy
|
|
|
+ true
|
|
|
+ end
|
|
|
|
|
|
def fill_namedowncase
|
|
|
self.name_downcase = name.downcase
|