sensitive: @object['sensitive'] || false,
visibility: visibility_from_audience,
thread: replied_to_status,
+ conversation: conversation_from_uri(@object['conversation']),
media_attachment_ids: process_attachments.take(4).map(&:id),
poll: process_poll,
}
ActivityPub::FetchRepliesWorker.perform_async(status.id, uri) unless uri.nil?
end
+ def conversation_from_uri(uri)
+ return nil if uri.nil?
+ return Conversation.find_by(id: OStatus::TagManager.instance.unique_tag_to_local_id(uri, 'Conversation')) if OStatus::TagManager.instance.local_id?(uri)
+ begin
+ Conversation.find_or_create_by!(uri: uri)
+ rescue ActiveRecord::RecordInvalid, ActiveRecord::RecordNotUnique
+ retry
+ end
+ end
+
def visibility_from_audience
if equals_or_includes?(@object['to'], ActivityPub::TagManager::COLLECTIONS[:public])
:public
# Table name: conversations
#
# id :bigint(8) not null, primary key
+# uri :string
# created_at :datetime not null
# updated_at :datetime not null
#
class Conversation < ApplicationRecord
+ validates :uri, uniqueness: true, if: :uri?
+
has_many :statuses
+
+ def local?
+ uri.nil?
+ end
end
# frozen_string_literal: true
class ActivityPub::NoteSerializer < ActivityPub::Serializer
- context_extensions :atom_uri, :sensitive,
+ context_extensions :atom_uri, :conversation, :sensitive,
:hashtag, :emoji, :focal_point, :blurhash
attributes :id, :type, :summary,
:in_reply_to, :published, :url,
:attributed_to, :to, :cc, :sensitive,
- :atom_uri, :in_reply_to_atom_uri
+ :atom_uri, :in_reply_to_atom_uri,
+ :conversation
attribute :content
attribute :content_map, if: :language?
OStatus::TagManager.instance.uri_for(object.thread)
end
+ def conversation
+ return if object.conversation.nil?
+
+ if object.conversation.uri?
+ object.conversation.uri
+ else
+ OStatus::TagManager.instance.unique_tag(object.conversation.created_at, object.conversation.id, 'Conversation')
+ end
+ end
+
def local?
object.account.local?
end
-# frozen_string_literal: true
-
class RemoveBoostsWideningAudience < ActiveRecord::Migration[5.2]
disable_ddl_transaction!
+++ /dev/null
-# frozen_string_literal: true
-
-class RemoveUriFromConversations < ActiveRecord::Migration[5.2]
- def up
- safety_assured { remove_column :conversations, :uri, :string }
- end
-
- def down
- add_column :conversations, :uri, :string
- add_index :conversations, :uri, unique: true
- end
-end
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(version: 2019_07_28_084117) do
+ActiveRecord::Schema.define(version: 2019_07_26_175042) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
end
create_table "conversations", force: :cascade do |t|
+ t.string "uri"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
+ t.index ["uri"], name: "index_conversations_on_uri", unique: true
end
create_table "custom_emoji_categories", force: :cascade do |t|
require 'rails_helper'
RSpec.describe Conversation, type: :model do
+ describe '#local?' do
+ it 'returns true when URI is nil' do
+ expect(Fabricate(:conversation).local?).to be true
+ end
+ it 'returns false when URI is not nil' do
+ expect(Fabricate(:conversation, uri: 'abc').local?).to be false
+ end
+ end
end