diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pleroma/user.ex | 6 | ||||
-rw-r--r-- | lib/pleroma/web/activity_pub/activity_pub.ex | 10 | ||||
-rw-r--r-- | lib/pleroma/web/twitter_api/twitter_api.ex | 12 |
3 files changed, 23 insertions, 5 deletions
diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 5e579dc44..e1a7befaa 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -2,7 +2,8 @@ defmodule Pleroma.User do use Ecto.Schema import Ecto.Changeset import Ecto.Query - alias Pleroma.{Repo, User, Activity, Object} + alias Pleroma.{Repo, User, Object} + alias Pleroma.Web.ActivityPub.ActivityPub schema "users" do field :bio, :string @@ -99,9 +100,10 @@ defmodule Pleroma.User do following = follower.following |> List.delete(ap_followers) - follower + { :ok, follower } = follower |> follow_changeset(%{following: following}) |> Repo.update + { :ok, follower, ActivityPub.fetch_latest_follow(follower, followed)} else { :error, "Not subscribed!" } end diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index e9f0dcd32..5937ec88c 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -174,6 +174,16 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do Repo.all(query) end + def fetch_latest_follow(%User{ap_id: follower_id}, + %User{ap_id: followed_id}) do + query = from activity in Activity, + where: fragment("? @> ?", activity.data, ^%{type: "Follow", actor: follower_id, + object: followed_id}), + order_by: [desc: :inserted_at], + limit: 1 + Repo.one(query) + end + def upload(file) do data = Upload.store(file) Repo.insert(%Object{data: data}) diff --git a/lib/pleroma/web/twitter_api/twitter_api.ex b/lib/pleroma/web/twitter_api/twitter_api.ex index f2b2b4418..8e2cd98ca 100644 --- a/lib/pleroma/web/twitter_api/twitter_api.ex +++ b/lib/pleroma/web/twitter_api/twitter_api.ex @@ -131,11 +131,17 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do end end - def unfollow(%User{} = follower, params) do +def unfollow(%User{} = follower, params) do with { :ok, %User{} = unfollowed } <- get_user(params), - { :ok, follower } <- User.unfollow(follower, unfollowed) + { :ok, follower, follow_activity } <- User.unfollow(follower, unfollowed), + { :ok, _activity } <- ActivityPub.insert(%{ + "type" => "Undo", + "actor" => follower.ap_id, + "object" => follow_activity, # get latest Follow for these users + "published" => make_date() + }) do - { :ok, follower, unfollowed} + { :ok, follower, unfollowed } else err -> err end |