From f37ca30ea166ee6a9c0e2fdec58ede0e10a7c6b5 Mon Sep 17 00:00:00 2001 From: "Renato \"Lond\" Cerqueira" Date: Sat, 25 Aug 2018 13:27:58 +0200 Subject: [PATCH] Add backend support for local_only on status create Based off ThibG implementation on glitch #502 --- app/controllers/api/v1/statuses_controller.rb | 5 +++-- app/models/status.rb | 10 ++++++++++ app/serializers/rest/status_serializer.rb | 2 +- app/services/post_status_service.rb | 8 +++++++- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/app/controllers/api/v1/statuses_controller.rb b/app/controllers/api/v1/statuses_controller.rb index 49a52f7a6..f377688d7 100644 --- a/app/controllers/api/v1/statuses_controller.rb +++ b/app/controllers/api/v1/statuses_controller.rb @@ -52,7 +52,8 @@ class Api::V1::StatusesController < Api::BaseController spoiler_text: status_params[:spoiler_text], visibility: status_params[:visibility], application: doorkeeper_token.application, - idempotency: request.headers['Idempotency-Key']) + idempotency: request.headers['Idempotency-Key'], + local_only: status_params[:local_only]) render json: @status, serializer: REST::StatusSerializer end @@ -77,7 +78,7 @@ class Api::V1::StatusesController < Api::BaseController end def status_params - params.permit(:status, :in_reply_to_id, :sensitive, :spoiler_text, :visibility, media_ids: []) + params.permit(:status, :in_reply_to_id, :sensitive, :spoiler_text, :visibility, :local_only, media_ids: []) end def pagination_params(core_params) diff --git a/app/models/status.rb b/app/models/status.rb index 90534bab8..8eaa74a04 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -130,6 +130,10 @@ class Status < ApplicationRecord attributes['local'] || uri.nil? end + def local_only? + local_only + end + def reblog? !reblog_of_id.nil? end @@ -222,6 +226,8 @@ class Status < ApplicationRecord around_create Mastodon::Snowflake::Callbacks + before_create :set_locality + before_validation :prepare_contents, if: :local? before_validation :set_reblog before_validation :set_visibility @@ -445,6 +451,10 @@ class Status < ApplicationRecord self.local = account.local? end + def set_locality + self.local_only = reblog.local_only if reblog? + end + def update_statistics return unless public_visibility? || unlisted_visibility? ActivityTracker.increment('activity:statuses:local') diff --git a/app/serializers/rest/status_serializer.rb b/app/serializers/rest/status_serializer.rb index 61423f961..fd3fc9a15 100644 --- a/app/serializers/rest/status_serializer.rb +++ b/app/serializers/rest/status_serializer.rb @@ -4,7 +4,7 @@ class REST::StatusSerializer < ActiveModel::Serializer attributes :id, :created_at, :in_reply_to_id, :in_reply_to_account_id, :sensitive, :spoiler_text, :visibility, :language, :uri, :content, :url, :replies_count, :reblogs_count, - :favourites_count + :favourites_count, :local_only attribute :favourited, if: :current_user? attribute :reblogged, if: :current_user? diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb index 52d49a69e..cdcb6b087 100644 --- a/app/services/post_status_service.rb +++ b/app/services/post_status_service.rb @@ -31,7 +31,8 @@ class PostStatusService < BaseService spoiler_text: options[:spoiler_text] || '', visibility: options[:visibility] || account.user&.setting_default_privacy, language: language_from_option(options[:language]) || account.user&.setting_default_language&.presence || LanguageDetector.instance.detect(text, account), - application: options[:application]) + application: options[:application], + local_only: local_only_option(options[:local_only], in_reply_to)) end process_hashtags_service.call(status) @@ -57,6 +58,11 @@ class PostStatusService < BaseService private + def local_only_option(local_only, in_reply_to) + return in_reply_to&.local_only? if local_only.nil? # XXX temporary, just until clients implement to avoid leaking local_only posts + local_only + end + def validate_media!(media_ids) return if media_ids.blank? || !media_ids.is_a?(Enumerable)