51 lines
1.7 KiB
Ruby
51 lines
1.7 KiB
Ruby
require_dependency 'carto/notifications_markdown_renderer'
|
|
|
|
module Carto
|
|
class Notification < ActiveRecord::Base
|
|
MAX_BODY_LENGTH = 140
|
|
|
|
# Update CartoGearsAPI::Notifications::Notification when adding constants here
|
|
ICON_ALERT = 'alert'.freeze
|
|
ICON_SUCCESS = 'success'.freeze
|
|
ICONS = [ICON_SUCCESS, ICON_ALERT].freeze
|
|
|
|
RECIPIENT_ALL = 'all'.freeze
|
|
RECIPIENTS = [RECIPIENT_ALL, 'builders'.freeze, 'viewers'.freeze].freeze
|
|
|
|
belongs_to :organization, inverse_of: :notifications
|
|
has_many :received_notifications, inverse_of: :notification
|
|
|
|
validates :icon, presence: true, inclusion: { in: ICONS }
|
|
validates :recipients, inclusion: { in: [nil] + RECIPIENTS }
|
|
validates :recipients, presence: true, if: :organization
|
|
validates :body, presence: true
|
|
validate :valid_markdown
|
|
|
|
after_create :send_to_organization_members
|
|
|
|
private
|
|
|
|
def send_to_organization_members
|
|
return unless organization
|
|
# This avoids resending an already sent notification. Example: importing notifications
|
|
return unless received_notifications.empty?
|
|
users = if recipients == 'builders'
|
|
organization.builder_users
|
|
elsif recipients == 'viewers'
|
|
organization.viewer_users
|
|
else
|
|
organization.users
|
|
end
|
|
users.each { |u| received_notifications.create!(user: u, received_at: created_at) }
|
|
end
|
|
|
|
def valid_markdown
|
|
return unless body.present?
|
|
text = Redcarpet::Markdown.new(NotificationsMarkdownRenderer).render(body).strip
|
|
errors.add(:body, "cannot be longer than #{MAX_BODY_LENGTH} characters") if text.length > MAX_BODY_LENGTH
|
|
rescue RuntimeError => e
|
|
errors.add(:body, e.message)
|
|
end
|
|
end
|
|
end
|