about summary refs log tree commit diff
path: root/app
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2019-03-15 13:36:38 +0100
committerGitHub <noreply@github.com>2019-03-15 13:36:38 +0100
commit3ad3223b466d8afbe8d11160a7351b34fe12c97a (patch)
treebc42e2dd461279c7d707535a6fa717f5015bf94b /app
parentc20d096e6a251e1b84ac47b751d2eb065743dbc2 (diff)
Fix detailed poll validation errors not being returned in the API (#10261)
No more "Owned poll is invalid"
Diffstat (limited to 'app')
-rw-r--r--app/models/status.rb3
-rw-r--r--app/services/post_status_service.rb18
2 files changed, 11 insertions, 10 deletions
diff --git a/app/models/status.rb b/app/models/status.rb
index d029ff3cd..571167943 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -71,7 +71,8 @@ class Status < ApplicationRecord
   validates_with DisallowedHashtagsValidator
   validates :reblog, uniqueness: { scope: :account }, if: :reblog?
   validates :visibility, exclusion: { in: %w(direct limited) }, if: :reblog?
-  validates_associated :owned_poll
+
+  accepts_nested_attributes_for :owned_poll
 
   default_scope { recent }
 
diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb
index a1705a6ad..3f392a6e6 100644
--- a/app/services/post_status_service.rb
+++ b/app/services/post_status_service.rb
@@ -29,7 +29,6 @@ class PostStatusService < BaseService
     return idempotency_duplicate if idempotency_given? && idempotency_duplicate?
 
     validate_media!
-    validate_poll!
     preprocess_attributes!
 
     if scheduled?
@@ -71,6 +70,7 @@ class PostStatusService < BaseService
 
   def schedule_status!
     status_for_validation = @account.statuses.build(status_attributes)
+
     if status_for_validation.valid?
       status_for_validation.destroy
 
@@ -103,12 +103,6 @@ class PostStatusService < BaseService
     raise Mastodon::ValidationError, I18n.t('media_attachments.validations.images_and_video') if @media.size > 1 && @media.find(&:video?)
   end
 
-  def validate_poll!
-    return if @options[:poll].blank?
-
-    @poll = @account.polls.new(@options[:poll])
-  end
-
   def language_from_option(str)
     ISO_639.find(str)&.alpha2
   end
@@ -161,13 +155,13 @@ class PostStatusService < BaseService
       text: @text,
       media_attachments: @media || [],
       thread: @in_reply_to,
-      owned_poll: @poll,
+      owned_poll_attributes: poll_attributes,
       sensitive: (@options[:sensitive].nil? ? @account.user&.setting_default_sensitive : @options[:sensitive]) || @options[:spoiler_text].present?,
       spoiler_text: @options[:spoiler_text] || '',
       visibility: @visibility,
       language: language_from_option(@options[:language]) || @account.user&.setting_default_language&.presence || LanguageDetector.instance.detect(@text, @account),
       application: @options[:application],
-    }
+    }.compact
   end
 
   def scheduled_status_attributes
@@ -178,6 +172,12 @@ class PostStatusService < BaseService
     }
   end
 
+  def poll_attributes
+    return if @options[:poll].blank?
+
+    @options[:poll].merge(account: @account)
+  end
+
   def scheduled_options
     @options.tap do |options_hash|
       options_hash[:in_reply_to_id] = options_hash.delete(:thread)&.id