openSUSE/open-build-service

View on GitHub
src/api/app/models/status_message.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
class StatusMessage < ApplicationRecord
  belongs_to :user # TODO: rename as creator
  has_many :status_message_acknowledgements, dependent: :destroy
  has_many :users, through: :status_message_acknowledgements

  validates :severity, :message, presence: true

  scope :announcements, -> { order('created_at DESC').where(severity: 'announcement') }
  scope :for_current_user, -> { where(communication_scope: communication_scopes_for_current_user) }
  scope :newest, -> { order('created_at DESC') }
  scope :for_severity, ->(severity) { where(severity: severity) if severity.present? }
  scope :for_communication_scope, ->(communication_scope) { where(communication_scope: communication_scope) if communication_scope.present? }

  enum severity: { information: 0, green: 1, yellow: 2, red: 3, announcement: 4 }
  enum communication_scope: { all_users: 0, logged_in_users: 1, admin_users: 2, in_beta_users: 3, in_rollout_users: 4 }
  alias_attribute :scope, :communication_scope

  def acknowledge!
    return false if acknowledged?

    users << User.session!
    RabbitmqBus.send_to_bus('metrics', "user.acknowledged_status_message status_message_id=#{id}")
    true
  end

  def acknowledged?
    users.include?(User.session!)
  end

  def self.latest_for_current_user
    announcement = StatusMessage.announcements.find_by(communication_scope: StatusMessage.communication_scopes_for_current_user)
    return nil unless announcement
    return nil if StatusMessageAcknowledgement.find_by(status_message: announcement, user: User.session)

    announcement
  end

  def self.communication_scopes_for_current_user
    scopes = [:all_users]
    return scopes unless User.session

    scopes << :admin_users if User.session.is_admin?
    scopes << :in_rollout_users if User.session.in_rollout?
    scopes << :in_beta_users if User.session.in_beta?
    scopes << :logged_in_users
  end
end

# == Schema Information
#
# Table name: status_messages
#
#  id                  :integer          not null, primary key
#  communication_scope :integer          default("all_users")
#  message             :text(65535)
#  severity            :integer
#  created_at          :datetime         indexed
#  user_id             :integer          indexed
#
# Indexes
#
#  index_status_messages_on_created_at  (created_at)
#  user                                 (user_id)
#