admin_settings.rb 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. # frozen_string_literal: true
  2. class Form::AdminSettings
  3. include ActiveModel::Model
  4. KEYS = %i(
  5. site_contact_username
  6. site_contact_email
  7. site_title
  8. site_short_description
  9. site_extended_description
  10. site_terms
  11. registrations_mode
  12. closed_registrations_message
  13. timeline_preview
  14. bootstrap_timeline_accounts
  15. theme
  16. activity_api_enabled
  17. peers_api_enabled
  18. preview_sensitive_media
  19. custom_css
  20. profile_directory
  21. thumbnail
  22. mascot
  23. trends
  24. trendable_by_default
  25. show_domain_blocks
  26. show_domain_blocks_rationale
  27. noindex
  28. require_invite_text
  29. media_cache_retention_period
  30. content_cache_retention_period
  31. backups_retention_period
  32. ).freeze
  33. BOOLEAN_KEYS = %i(
  34. timeline_preview
  35. activity_api_enabled
  36. peers_api_enabled
  37. preview_sensitive_media
  38. profile_directory
  39. trends
  40. trendable_by_default
  41. noindex
  42. require_invite_text
  43. ).freeze
  44. UPLOAD_KEYS = %i(
  45. thumbnail
  46. mascot
  47. ).freeze
  48. attr_accessor(*KEYS)
  49. validates :registrations_mode, inclusion: { in: %w(open approved none) }, if: -> { defined?(@registrations_mode) }
  50. validates :site_contact_email, :site_contact_username, presence: true, if: -> { defined?(@site_contact_username) || defined?(@site_contact_email) }
  51. validates :site_contact_username, existing_username: true, if: -> { defined?(@site_contact_username) }
  52. validates :bootstrap_timeline_accounts, existing_username: { multiple: true }, if: -> { defined?(@bootstrap_timeline_accounts) }
  53. validates :show_domain_blocks, inclusion: { in: %w(disabled users all) }, if: -> { defined?(@show_domain_blocks) }
  54. validates :show_domain_blocks_rationale, inclusion: { in: %w(disabled users all) }, if: -> { defined?(@show_domain_blocks_rationale) }
  55. validates :media_cache_retention_period, :content_cache_retention_period, :backups_retention_period, numericality: { only_integer: true }, allow_blank: true, if: -> { defined?(@media_cache_retention_period) || defined?(@content_cache_retention_period) || defined?(@backups_retention_period) }
  56. validates :site_short_description, length: { maximum: 200 }, if: -> { defined?(@site_short_description) }
  57. KEYS.each do |key|
  58. define_method(key) do
  59. return instance_variable_get("@#{key}") if instance_variable_defined?("@#{key}")
  60. stored_value = begin
  61. if UPLOAD_KEYS.include?(key)
  62. SiteUpload.where(var: key).first_or_initialize(var: key)
  63. else
  64. Setting.public_send(key)
  65. end
  66. end
  67. instance_variable_set("@#{key}", stored_value)
  68. end
  69. end
  70. UPLOAD_KEYS.each do |key|
  71. define_method("#{key}=") do |file|
  72. value = public_send(key)
  73. value.file = file
  74. end
  75. end
  76. def save
  77. return false unless valid?
  78. KEYS.each do |key|
  79. next unless instance_variable_defined?("@#{key}")
  80. if UPLOAD_KEYS.include?(key)
  81. public_send(key).save
  82. else
  83. setting = Setting.where(var: key).first_or_initialize(var: key)
  84. setting.update(value: typecast_value(key, instance_variable_get("@#{key}")))
  85. end
  86. end
  87. end
  88. private
  89. def typecast_value(key, value)
  90. if BOOLEAN_KEYS.include?(key)
  91. value == '1'
  92. else
  93. value
  94. end
  95. end
  96. end