link.rb 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. # Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
  2. class Link < ApplicationModel
  3. # rubocop:disable Rails/InverseOf
  4. belongs_to :link_type, class_name: 'Link::Type'
  5. belongs_to :link_object, class_name: 'Link::Object'
  6. # rubocop:enable Rails/InverseOf
  7. after_destroy :touch_link_references
  8. @map = {
  9. 'normal' => 'normal',
  10. 'parent' => 'child',
  11. 'child' => 'parent',
  12. }
  13. =begin
  14. links = Link.list(
  15. link_object: 'Ticket',
  16. link_object_value: 1
  17. )
  18. =end
  19. def self.list(data)
  20. linkobject = link_object_get( name: data[:link_object] )
  21. return if !linkobject
  22. items = []
  23. # get links for one site
  24. list = Link.where(
  25. 'link_object_source_id = ? AND link_object_source_value = ?', linkobject.id, data[:link_object_value]
  26. )
  27. list.each do |item|
  28. link = {}
  29. link['link_type'] = @map[ Link::Type.find( item.link_type_id ).name ]
  30. link['link_object'] = Link::Object.find( item.link_object_target_id ).name
  31. link['link_object_value'] = item.link_object_target_value
  32. items.push link
  33. end
  34. # get links for the other site
  35. list = Link.where(
  36. 'link_object_target_id = ? AND link_object_target_value = ?', linkobject.id, data[:link_object_value]
  37. )
  38. list.each do |item|
  39. link = {}
  40. link['link_type'] = Link::Type.find( item.link_type_id ).name
  41. link['link_object'] = Link::Object.find( item.link_object_source_id ).name
  42. link['link_object_value'] = item.link_object_source_value
  43. items.push link
  44. end
  45. items
  46. end
  47. =begin
  48. Link.add(
  49. link_type: 'normal',
  50. link_object_source: 'Ticket',
  51. link_object_source_value: 6,
  52. link_object_target: 'Ticket',
  53. link_object_target_value: 31
  54. )
  55. Link.add(
  56. link_types_id: 12,
  57. link_object_source_id: 1,
  58. link_object_source_value: 1,
  59. link_object_target_id: 1,
  60. link_object_target_value: 1
  61. )
  62. =end
  63. def self.add(data)
  64. if data.key?(:link_type)
  65. linktype = link_type_get(name: data[:link_type])
  66. data[:link_type_id] = linktype.id
  67. data.delete(:link_type)
  68. end
  69. if data.key?(:link_object_source)
  70. linkobject = link_object_get(name: data[:link_object_source])
  71. data[:link_object_source_id] = linkobject.id
  72. touch_reference_by_params(
  73. object: data[:link_object_source],
  74. o_id: data[:link_object_source_value],
  75. )
  76. data.delete(:link_object_source)
  77. end
  78. if data.key?(:link_object_target)
  79. linkobject = link_object_get(name: data[:link_object_target])
  80. data[:link_object_target_id] = linkobject.id
  81. touch_reference_by_params(
  82. object: data[:link_object_target],
  83. o_id: data[:link_object_target_value],
  84. )
  85. data.delete(:link_object_target)
  86. end
  87. Link.create(data)
  88. end
  89. =begin
  90. Link.remove(
  91. link_type: 'normal',
  92. link_object_source: 'Ticket',
  93. link_object_source_value: 6,
  94. link_object_target: 'Ticket',
  95. link_object_target_value: 31
  96. )
  97. =end
  98. def self.remove(data)
  99. if data.key?(:link_object_source)
  100. linkobject = link_object_get(name: data[:link_object_source])
  101. data[:link_object_source_id] = linkobject.id
  102. end
  103. if data.key?(:link_object_target)
  104. linkobject = link_object_get(name: data[:link_object_target])
  105. data[:link_object_target_id] = linkobject.id
  106. end
  107. # from one site
  108. if data.key?(:link_type)
  109. linktype = link_type_get(name: data[:link_type])
  110. data[:link_type_id] = linktype.id
  111. end
  112. Link.where(
  113. link_type_id: data[:link_type_id],
  114. link_object_source_id: data[:link_object_source_id],
  115. link_object_source_value: data[:link_object_source_value],
  116. link_object_target_id: data[:link_object_target_id],
  117. link_object_target_value: data[:link_object_target_value]
  118. ).destroy_all
  119. # from the other site
  120. if data.key?(:link_type)
  121. linktype = link_type_get(name: @map[ data[:link_type] ])
  122. data[:link_type_id] = linktype.id
  123. end
  124. Link.where(
  125. link_type_id: data[:link_type_id],
  126. link_object_target_id: data[:link_object_source_id],
  127. link_object_target_value: data[:link_object_source_value],
  128. link_object_source_id: data[:link_object_target_id],
  129. link_object_source_value: data[:link_object_target_value]
  130. ).destroy_all
  131. end
  132. =begin
  133. Link.remove_all(
  134. link_object: 'Ticket',
  135. link_object_value: 6,
  136. )
  137. =end
  138. def self.remove_all(data)
  139. if data.key?(:link_object)
  140. linkobject = link_object_get(name: data[:link_object])
  141. data[:link_object_id] = linkobject.id
  142. end
  143. Link.where(
  144. link_object_target_id: data[:link_object_id],
  145. link_object_target_value: data[:link_object_value],
  146. ).destroy_all
  147. Link.where(
  148. link_object_source_id: data[:link_object_id],
  149. link_object_source_value: data[:link_object_value],
  150. ).destroy_all
  151. true
  152. end
  153. def touch_link_references
  154. Link.touch_reference_by_params(
  155. object: Link::Object.lookup(id: link_object_source_id).name,
  156. o_id: link_object_source_value,
  157. )
  158. Link.touch_reference_by_params(
  159. object: Link::Object.lookup(id: link_object_target_id).name,
  160. o_id: link_object_target_value,
  161. )
  162. end
  163. def self.link_type_get(data)
  164. linktype = Link::Type.find_by(name: data[:name])
  165. if !linktype
  166. linktype = Link::Type.create(name: data[:name])
  167. end
  168. linktype
  169. end
  170. def self.link_object_get(data)
  171. linkobject = Link::Object.find_by(name: data[:name])
  172. if !linkobject
  173. linkobject = Link::Object.create(name: data[:name])
  174. end
  175. linkobject
  176. end
  177. end
  178. class Link::Type < ApplicationModel
  179. validates :name, presence: true
  180. end
  181. class Link::Object < ApplicationModel
  182. validates :name, presence: true
  183. end