about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2019-07-28 17:47:37 +0200
committerGitHub <noreply@github.com>2019-07-28 17:47:37 +0200
commitb9b0313c78ca4efcc8cda089c652be0b333aa16a (patch)
tree7f94dada733b514a2034839c3ca6fb6776487250
parent75f7f9930eb2a6f5c4041ec44fe0aa795c9ec449 (diff)
Revert "Remove conversation URI (#11423)" (#11424)
This reverts commit 75f7f9930eb2a6f5c4041ec44fe0aa795c9ec449.
-rw-r--r--app/lib/activitypub/activity/create.rb11
-rw-r--r--app/models/conversation.rb7
-rw-r--r--app/serializers/activitypub/note_serializer.rb15
-rw-r--r--db/post_migrate/20190519130537_remove_boosts_widening_audience.rb2
-rw-r--r--db/post_migrate/20190728084117_remove_uri_from_conversations.rb12
-rw-r--r--db/schema.rb4
-rw-r--r--spec/models/conversation_spec.rb8
7 files changed, 42 insertions, 17 deletions
diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb
index eb7b09e44..000b77df5 100644
--- a/app/lib/activitypub/activity/create.rb
+++ b/app/lib/activitypub/activity/create.rb
@@ -67,6 +67,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
         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,
       }
@@ -261,6 +262,16 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
     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
diff --git a/app/models/conversation.rb b/app/models/conversation.rb
index 37d233f32..4dfaea889 100644
--- a/app/models/conversation.rb
+++ b/app/models/conversation.rb
@@ -4,10 +4,17 @@
 # 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
diff --git a/app/serializers/activitypub/note_serializer.rb b/app/serializers/activitypub/note_serializer.rb
index 88b50b3ea..67f596e78 100644
--- a/app/serializers/activitypub/note_serializer.rb
+++ b/app/serializers/activitypub/note_serializer.rb
@@ -1,13 +1,14 @@
 # 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?
@@ -109,6 +110,16 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer
     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
diff --git a/db/post_migrate/20190519130537_remove_boosts_widening_audience.rb b/db/post_migrate/20190519130537_remove_boosts_widening_audience.rb
index b89efd989..d2d924239 100644
--- a/db/post_migrate/20190519130537_remove_boosts_widening_audience.rb
+++ b/db/post_migrate/20190519130537_remove_boosts_widening_audience.rb
@@ -1,5 +1,3 @@
-# frozen_string_literal: true
-
 class RemoveBoostsWideningAudience < ActiveRecord::Migration[5.2]
   disable_ddl_transaction!
 
diff --git a/db/post_migrate/20190728084117_remove_uri_from_conversations.rb b/db/post_migrate/20190728084117_remove_uri_from_conversations.rb
deleted file mode 100644
index b2b157ef7..000000000
--- a/db/post_migrate/20190728084117_remove_uri_from_conversations.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# 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
diff --git a/db/schema.rb b/db/schema.rb
index a722bad36..1847305c7 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
 #
 # 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"
@@ -203,8 +203,10 @@ ActiveRecord::Schema.define(version: 2019_07_28_084117) do
   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|
diff --git a/spec/models/conversation_spec.rb b/spec/models/conversation_spec.rb
index b91d36169..8b5e4fdaf 100644
--- a/spec/models/conversation_spec.rb
+++ b/spec/models/conversation_spec.rb
@@ -1,5 +1,13 @@
 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