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:
2026-08-20 16:09:04 +02:00
co-authored by Cursor
parent 43d5003de8
commit a07f231417
24 changed files with 366 additions and 69 deletions
+39 -10
View File
@@ -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