Permette titolo, testo e link diversi per Android e iOS negli avvisi.
Separa i canali app e mostra il nodo ingest nelle sessioni admin. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -3,10 +3,12 @@ class AppAnnouncement < ApplicationRecord
|
||||
SEVERITIES = %w[info warning critical].freeze
|
||||
STATUSES = %w[draft published archived].freeze
|
||||
CHANNELS = {
|
||||
app: :show_on_app,
|
||||
android: :show_on_android,
|
||||
ios: :show_on_ios,
|
||||
web_public: :show_on_web_public,
|
||||
web_private: :show_on_web_private
|
||||
}.freeze
|
||||
URL_FIELDS = %i[action_url android_action_url ios_action_url].freeze
|
||||
|
||||
belongs_to :created_by_admin, class_name: "AdminAccount", optional: true
|
||||
|
||||
@@ -14,10 +16,12 @@ class AppAnnouncement < ApplicationRecord
|
||||
validates :kind, inclusion: { in: KINDS }
|
||||
validates :severity, inclusion: { in: SEVERITIES }
|
||||
validates :status, inclusion: { in: STATUSES }
|
||||
validates :title, length: { maximum: 120 }
|
||||
validates :body, length: { maximum: 2000 }
|
||||
validates :action_label, length: { maximum: 40 }, allow_blank: true
|
||||
validates :action_url, format: { with: /\Ahttps?:\/\/.+/i, allow_blank: true }
|
||||
validates :title, :android_title, :ios_title, length: { maximum: 120 }, allow_blank: true
|
||||
validates :body, :android_body, :ios_body, length: { maximum: 2000 }, allow_blank: true
|
||||
validates :action_label, :android_action_label, :ios_action_label, length: { maximum: 40 }, allow_blank: true
|
||||
URL_FIELDS.each do |field|
|
||||
validates field, format: { with: /\Ahttps?:\/\/.+/i, allow_blank: true }
|
||||
end
|
||||
validate :ends_at_after_starts_at
|
||||
validate :at_least_one_channel
|
||||
|
||||
@@ -38,7 +42,15 @@ class AppAnnouncement < ApplicationRecord
|
||||
end
|
||||
|
||||
def self.for_app
|
||||
for_channel(:app)
|
||||
active_now.where("show_on_android = TRUE OR show_on_ios = TRUE")
|
||||
end
|
||||
|
||||
def self.for_platform(platform)
|
||||
case platform.to_s
|
||||
when "android" then for_channel(:android)
|
||||
when "ios" then for_channel(:ios)
|
||||
else for_app
|
||||
end
|
||||
end
|
||||
|
||||
def published?
|
||||
@@ -56,17 +68,19 @@ class AppAnnouncement < ApplicationRecord
|
||||
id: id,
|
||||
kind: kind,
|
||||
severity: severity,
|
||||
title: title,
|
||||
body: body,
|
||||
title: copy_for(platform, :title),
|
||||
body: copy_for(platform, :body),
|
||||
dismissible: dismissible,
|
||||
action_url: resolved_action_url(platform),
|
||||
action_label: action_label.presence,
|
||||
action_label: copy_for(platform, :action_label).presence,
|
||||
starts_at: starts_at&.iso8601,
|
||||
ends_at: ends_at&.iso8601
|
||||
}
|
||||
end
|
||||
|
||||
def resolved_action_url(platform)
|
||||
override = platform_override(platform, :action_url)
|
||||
return override if override.present?
|
||||
return action_url if action_url.present?
|
||||
return nil unless kind == "update"
|
||||
|
||||
@@ -78,8 +92,23 @@ class AppAnnouncement < ApplicationRecord
|
||||
|
||||
private
|
||||
|
||||
def copy_for(platform, field)
|
||||
override = platform_override(platform, field)
|
||||
override.presence || public_send(field)
|
||||
end
|
||||
|
||||
def platform_override(platform, field)
|
||||
prefix = case platform.to_s
|
||||
when "android" then :android
|
||||
when "ios" then :ios
|
||||
end
|
||||
return if prefix.blank?
|
||||
|
||||
public_send("#{prefix}_#{field}")
|
||||
end
|
||||
|
||||
def at_least_one_channel
|
||||
return if show_on_app? || show_on_web_public? || show_on_web_private?
|
||||
return if show_on_android? || show_on_ios? || show_on_web_public? || show_on_web_private?
|
||||
|
||||
errors.add(:base, :no_channel)
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user