diff options
Diffstat (limited to 'app/models/work_items/type.rb')
-rw-r--r-- | app/models/work_items/type.rb | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/app/models/work_items/type.rb b/app/models/work_items/type.rb index 4ccef4c93d3..38416f6cb76 100644 --- a/app/models/work_items/type.rb +++ b/app/models/work_items/type.rb @@ -9,6 +9,11 @@ module WorkItems self.table_name = 'work_item_types' include CacheMarkdownField + include ReactiveCaching + + self.reactive_cache_work_type = :no_dependency + self.reactive_cache_refresh_interval = 10.minutes + self.reactive_cache_lifetime = 1.hour # type name is used in restrictions DB seeder to assure restrictions for # default types are pre-filled @@ -53,8 +58,14 @@ module WorkItems has_many :widget_definitions, foreign_key: :work_item_type_id, inverse_of: :work_item_type has_many :enabled_widget_definitions, -> { where(disabled: false) }, foreign_key: :work_item_type_id, inverse_of: :work_item_type, class_name: 'WorkItems::WidgetDefinition' + has_many :child_restrictions, class_name: 'WorkItems::HierarchyRestriction', foreign_key: :parent_type_id, + inverse_of: :parent_type + has_many :allowed_child_types_by_name, -> { order_by_name_asc }, + through: :child_restrictions, class_name: 'WorkItems::Type', + foreign_key: :child_type_id, source: :child_type before_validation :strip_whitespace + after_save :clear_reactive_cache! # TODO: review validation rules # https://gitlab.com/gitlab-org/gitlab/-/issues/336919 @@ -82,7 +93,7 @@ module WorkItems end def self.allowed_types_for_issues - base_types.keys.excluding('task', 'objective', 'key_result', 'epic', 'ticket') + base_types.keys.excluding('objective', 'key_result', 'epic', 'ticket') end def default? @@ -101,6 +112,16 @@ module WorkItems name == WorkItems::Type::TYPE_NAMES[:issue] end + def calculate_reactive_cache + allowed_child_types_by_name + end + + def allowed_child_types(cache: false) + cached_data = cache ? with_reactive_cache { |query_data| query_data } : nil + + cached_data || allowed_child_types_by_name + end + private def strip_whitespace |