diff options
author | Roger Braun <roger@rogerbraun.net> | 2017-05-07 20:05:03 +0200 |
---|---|---|
committer | Roger Braun <roger@rogerbraun.net> | 2017-05-07 20:05:03 +0200 |
commit | 4f9328c622d4d97b339006443073b22b2668c4da (patch) | |
tree | 02c6e9ab8508dd89da46eadf5aa4d98ed7405ac2 /lib | |
parent | b403ea4d2b69cef4434ad68babdfb402d8227847 (diff) | |
download | pleroma-4f9328c622d4d97b339006443073b22b2668c4da.tar.gz |
Preserve ids on favorites / retweets.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pleroma/web/activity_pub/activity_pub.ex | 11 | ||||
-rw-r--r-- | lib/pleroma/web/ostatus/ostatus.ex | 10 |
2 files changed, 15 insertions, 6 deletions
diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index f3e94b101..e25555adf 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -41,7 +41,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do end end - def like(%User{ap_id: ap_id} = user, %Object{data: %{"id" => id}} = object, local \\ true) do + def like(%User{ap_id: ap_id} = user, %Object{data: %{"id" => id}} = object, activity_id \\ nil, local \\ true) do cond do # There's already a like here, so return the original activity. ap_id in (object.data["likes"] || []) -> @@ -59,6 +59,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do "context" => object.data["context"] } + data = if activity_id, do: Map.put(data, "id", activity_id), else: data + {:ok, activity} = insert(data, local) likes = [ap_id | (object.data["likes"] || [])] |> Enum.uniq @@ -81,7 +83,10 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do end defp update_object_in_activities(%{data: %{"id" => id}} = object) do + # TODO # Update activities that already had this. Could be done in a seperate process. + # Alternatively, just don't do this and fetch the current object each time. Most + # could probably be taken from cache. relevant_activities = Activity.all_by_object_ap_id(id) Enum.map(relevant_activities, fn (activity) -> new_activity_data = activity.data |> Map.put("object", object.data) @@ -176,7 +181,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do Enum.reverse(Repo.all(query)) end - def announce(%User{ap_id: ap_id} = user, %Object{data: %{"id" => id}} = object, local \\ true) do + def announce(%User{ap_id: ap_id} = user, %Object{data: %{"id" => id}} = object, activity_id \\ nil, local \\ true) do data = %{ "type" => "Announce", "actor" => ap_id, @@ -185,6 +190,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do "context" => object.data["context"] } + data = if activity_id, do: Map.put(data, "id", activity_id), else: data + {:ok, activity} = insert(data, local) announcements = [ap_id | (object.data["announcements"] || [])] |> Enum.uniq diff --git a/lib/pleroma/web/ostatus/ostatus.ex b/lib/pleroma/web/ostatus/ostatus.ex index 842ad0f01..01f65affc 100644 --- a/lib/pleroma/web/ostatus/ostatus.ex +++ b/lib/pleroma/web/ostatus/ostatus.ex @@ -49,10 +49,11 @@ defmodule Pleroma.Web.OStatus do {:ok, activities} end - def make_share(_entry, doc, retweeted_activity) do + def make_share(entry, doc, retweeted_activity) do with {:ok, actor} <- find_make_or_update_user(doc), %Object{} = object <- Object.get_cached_by_ap_id(retweeted_activity.data["object"]["id"]), - {:ok, activity, _object} = ActivityPub.announce(actor, object, false) do + id when not is_nil(id) <- string_from_xpath("/entry/id", entry), + {:ok, activity, _object} = ActivityPub.announce(actor, object, id, false) do {:ok, activity} end end @@ -67,10 +68,11 @@ defmodule Pleroma.Web.OStatus do end end - def make_favorite(_entry, doc, favorited_activity) do + def make_favorite(entry, doc, favorited_activity) do with {:ok, actor} <- find_make_or_update_user(doc), %Object{} = object <- Object.get_cached_by_ap_id(favorited_activity.data["object"]["id"]), - {:ok, activity, _object} = ActivityPub.like(actor, object, false) do + id when not is_nil(id) <- string_from_xpath("/entry/id", entry), + {:ok, activity, _object} = ActivityPub.like(actor, object, id, false) do {:ok, activity} end end |