about summary refs log tree commit diff
path: root/app
diff options
context:
space:
mode:
authormultiple creatures <dev@multiple-creature.party>2019-11-18 22:04:03 -0600
committermultiple creatures <dev@multiple-creature.party>2019-11-18 22:04:03 -0600
commit5c9fbacaafa0734d1c56762b671d39ba0391bc0b (patch)
treed4427fee31b360d29e702102f14a4a1cfd3a6986 /app
parent8f4f29f7101fd599f166b54a7c06faf782894748 (diff)
Add support for updating posts in-place to the frontend and API. This makes it possible to implement features such as *real* post editing.
Diffstat (limited to 'app')
-rw-r--r--app/javascript/flavours/glitch/actions/importer/index.js3
-rw-r--r--app/javascript/flavours/glitch/actions/importer/normalizer.js7
-rw-r--r--app/serializers/activitypub/activity_serializer.rb6
-rw-r--r--app/serializers/activitypub/note_serializer.rb6
-rw-r--r--app/serializers/rest/account_serializer.rb6
-rw-r--r--app/serializers/rest/status_serializer.rb6
6 files changed, 23 insertions, 11 deletions
diff --git a/app/javascript/flavours/glitch/actions/importer/index.js b/app/javascript/flavours/glitch/actions/importer/index.js
index f4372fb31..a7a5c60d7 100644
--- a/app/javascript/flavours/glitch/actions/importer/index.js
+++ b/app/javascript/flavours/glitch/actions/importer/index.js
@@ -9,6 +9,9 @@ export const POLLS_IMPORT    = 'POLLS_IMPORT';
 function pushUnique(array, object) {
   if (array.every(element => element.id !== object.id)) {
     array.push(object);
+  } else {
+    const idx = array.findIndex(element => element.id === object.id);
+    array.splice(idx, 1, object);
   }
 }
 
diff --git a/app/javascript/flavours/glitch/actions/importer/normalizer.js b/app/javascript/flavours/glitch/actions/importer/normalizer.js
index 12f8e3395..38d4d389c 100644
--- a/app/javascript/flavours/glitch/actions/importer/normalizer.js
+++ b/app/javascript/flavours/glitch/actions/importer/normalizer.js
@@ -47,9 +47,10 @@ export function normalizeStatus(status, normalOldStatus) {
     normalStatus.poll = status.poll.id;
   }
 
-  // Only calculate these values when status first encountered
-  // Otherwise keep the ones already in the reducer
-  if (normalOldStatus) {
+  const oldUpdatedAt = normalOldStatus ? normalOldStatus.updated_at || normalOldStatus.created_at : null;
+  const newUpdatedAt = normalStatus ? normalStatus.updated_at || normalStatus.created_at : null;
+
+  if (normalOldStatus && oldUpdatedAt === newUpdatedAt) {
     normalStatus.search_index = normalOldStatus.get('search_index');
     normalStatus.contentHtml = normalOldStatus.get('contentHtml');
     normalStatus.spoilerHtml = normalOldStatus.get('spoilerHtml');
diff --git a/app/serializers/activitypub/activity_serializer.rb b/app/serializers/activitypub/activity_serializer.rb
index 21386ab8a..799f9329f 100644
--- a/app/serializers/activitypub/activity_serializer.rb
+++ b/app/serializers/activitypub/activity_serializer.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 class ActivityPub::ActivitySerializer < ActivityPub::Serializer
-  attributes :id, :type, :actor, :published, :to, :cc
+  attributes :id, :type, :actor, :published, :updated, :to, :cc
 
   has_one :proper, key: :object, serializer: ActivityPub::NoteSerializer, if: :serialize_object?
   attribute :proper_uri, key: :object, unless: :serialize_object?
@@ -22,6 +22,10 @@ class ActivityPub::ActivitySerializer < ActivityPub::Serializer
     object.created_at.iso8601
   end
 
+  def updated
+    object.updated_at.iso8601
+  end
+
   def to
     ActivityPub::TagManager.instance.to(object)
   end
diff --git a/app/serializers/activitypub/note_serializer.rb b/app/serializers/activitypub/note_serializer.rb
index ff39c97c4..cbabc275c 100644
--- a/app/serializers/activitypub/note_serializer.rb
+++ b/app/serializers/activitypub/note_serializer.rb
@@ -6,7 +6,7 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer
                      :reject_replies
 
   attributes :id, :type, :summary,
-             :in_reply_to, :published, :url,
+             :in_reply_to, :published, :updated, :url,
              :attributed_to, :to, :cc, :sensitive,
              :conversation, :source, :tails_never_fail,
              :reject_replies
@@ -85,6 +85,10 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer
     object.created_at.iso8601
   end
 
+  def updated
+    object.updated_at.iso8601
+  end
+
   def url
     ActivityPub::TagManager.instance.url_for(object)
   end
diff --git a/app/serializers/rest/account_serializer.rb b/app/serializers/rest/account_serializer.rb
index 509b688db..3e826aaf3 100644
--- a/app/serializers/rest/account_serializer.rb
+++ b/app/serializers/rest/account_serializer.rb
@@ -4,9 +4,9 @@ class REST::AccountSerializer < ActiveModel::Serializer
   include RoutingHelper
 
   attributes :id, :username, :acct, :display_name, :locked, :bot, :created_at,
-             :note, :url, :avatar, :avatar_static, :header, :header_static,
-             :followers_count, :following_count, :statuses_count, :replies,
-             :adult_content, :gently, :kobold, :role, :froze, :identity,
+             :updated_at, :note, :url, :avatar, :avatar_static, :header,
+             :header_static, :followers_count, :following_count, :statuses_count,
+             :replies, :adult_content, :gently, :kobold, :role, :froze, :identity,
              :limited, :signature
 
   has_one :moved_to_account, key: :moved, serializer: REST::AccountSerializer, if: :moved_and_not_nested?
diff --git a/app/serializers/rest/status_serializer.rb b/app/serializers/rest/status_serializer.rb
index 86c63e772..75a1dc591 100644
--- a/app/serializers/rest/status_serializer.rb
+++ b/app/serializers/rest/status_serializer.rb
@@ -3,9 +3,9 @@
 class REST::StatusSerializer < ActiveModel::Serializer
   include Redisable
 
-  attributes :id, :created_at, :in_reply_to_id, :in_reply_to_account_id,
-             :sensitive, :spoiler_text, :visibility, :language,
-             :uri, :url, :replies_count, :reblogs_count,
+  attributes :id, :created_at, :updated_at, :in_reply_to_id,
+             :in_reply_to_account_id, :sensitive, :spoiler_text, :visibility,
+             :language, :uri, :url, :replies_count, :reblogs_count,
              :favourites_count, :network, :curated, :reject_replies
 
   attribute :favourited, if: :current_user?