From 5c9fbacaafa0734d1c56762b671d39ba0391bc0b Mon Sep 17 00:00:00 2001 From: multiple creatures Date: Mon, 18 Nov 2019 22:04:03 -0600 Subject: Add support for updating posts in-place to the frontend and API. This makes it possible to implement features such as *real* post editing. --- app/javascript/flavours/glitch/actions/importer/index.js | 3 +++ app/javascript/flavours/glitch/actions/importer/normalizer.js | 7 ++++--- app/serializers/activitypub/activity_serializer.rb | 6 +++++- app/serializers/activitypub/note_serializer.rb | 6 +++++- app/serializers/rest/account_serializer.rb | 6 +++--- app/serializers/rest/status_serializer.rb | 6 +++--- 6 files changed, 23 insertions(+), 11 deletions(-) (limited to 'app') 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? -- cgit