diff options
Diffstat (limited to 'app/models/concerns/has_user_type.rb')
-rw-r--r-- | app/models/concerns/has_user_type.rb | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/app/models/concerns/has_user_type.rb b/app/models/concerns/has_user_type.rb new file mode 100644 index 00000000000..8a238dc736c --- /dev/null +++ b/app/models/concerns/has_user_type.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +module HasUserType + extend ActiveSupport::Concern + + USER_TYPES = { + human: nil, + support_bot: 1, + alert_bot: 2, + visual_review_bot: 3, + service_user: 4, + ghost: 5, + project_bot: 6, + migration_bot: 7 + }.with_indifferent_access.freeze + + BOT_USER_TYPES = %w[alert_bot project_bot support_bot visual_review_bot migration_bot].freeze + NON_INTERNAL_USER_TYPES = %w[human project_bot service_user].freeze + INTERNAL_USER_TYPES = (USER_TYPES.keys - NON_INTERNAL_USER_TYPES).freeze + + included do + scope :humans, -> { where(user_type: :human) } + scope :bots, -> { where(user_type: BOT_USER_TYPES) } + scope :bots_without_project_bot, -> { where(user_type: BOT_USER_TYPES - ['project_bot']) } + scope :non_internal, -> { humans.or(where(user_type: NON_INTERNAL_USER_TYPES)) } + scope :without_ghosts, -> { humans.or(where.not(user_type: :ghost)) } + scope :without_project_bot, -> { humans.or(where.not(user_type: :project_bot)) } + + enum user_type: USER_TYPES + + def human? + super || user_type.nil? + end + end + + def bot? + BOT_USER_TYPES.include?(user_type) + end + + # The explicit check for project_bot will be removed with Bot Categorization + # Ref: https://gitlab.com/gitlab-org/gitlab/-/issues/213945 + def internal? + ghost? || (bot? && !project_bot?) + end +end |