From 3ad3223b466d8afbe8d11160a7351b34fe12c97a Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Fri, 15 Mar 2019 13:36:38 +0100 Subject: [PATCH] Fix detailed poll validation errors not being returned in the API (#10261) No more "Owned poll is invalid" --- app/models/status.rb | 3 ++- app/services/post_status_service.rb | 18 +++++++++--------- config/locales/activerecord.en.yml | 3 +++ 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/app/models/status.rb b/app/models/status.rb index d029ff3cd6..5711679436 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 a1705a6adc..3f392a6e6d 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 diff --git a/config/locales/activerecord.en.yml b/config/locales/activerecord.en.yml index 428aaf7273..561ce68b89 100644 --- a/config/locales/activerecord.en.yml +++ b/config/locales/activerecord.en.yml @@ -1,6 +1,9 @@ --- en: activerecord: + attributes: + status: + owned_poll: Poll errors: models: account: