X-Git-Url: http://git.squeep.com/?a=blobdiff_plain;f=lib%2Fpleroma%2Fweb%2Ftwitter_api%2Ftwitter_api.ex;h=722e436e22e7f23b7aa16c75bfa7f489804bb53d;hb=89c5de90969cbd2b7cd5854c7209795443659062;hp=b3b505be23c698b069c8a8faa729240893684f86;hpb=7ab94ae22d559c26920372774b7c96552901f1cc;p=akkoma diff --git a/lib/pleroma/web/twitter_api/twitter_api.ex b/lib/pleroma/web/twitter_api/twitter_api.ex index b3b505be2..722e436e2 100644 --- a/lib/pleroma/web/twitter_api/twitter_api.ex +++ b/lib/pleroma/web/twitter_api/twitter_api.ex @@ -1,7 +1,6 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do alias Pleroma.{User, Activity, Repo, Object} alias Pleroma.Web.ActivityPub.ActivityPub - alias Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter alias Pleroma.Web.TwitterAPI.UserView alias Pleroma.Web.{OStatus, CommonAPI} import Ecto.Query @@ -12,71 +11,15 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do CommonAPI.post(user, data) end - def fetch_friend_statuses(user, opts \\ %{}) do - opts = - opts - |> Map.put("blocking_user", user) - |> Map.put("user", user) - |> Map.put("type", ["Create", "Announce", "Follow", "Like"]) - - ActivityPub.fetch_activities([user.ap_id | user.following], opts) - |> activities_to_statuses(%{for: user}) - end - - def fetch_public_statuses(user, opts \\ %{}) do - opts = - opts - |> Map.put("local_only", true) - |> Map.put("blocking_user", user) - |> Map.put("type", ["Create", "Announce", "Follow"]) - - ActivityPub.fetch_public_activities(opts) - |> activities_to_statuses(%{for: user}) - end - - def fetch_public_and_external_statuses(user, opts \\ %{}) do - opts = - opts - |> Map.put("blocking_user", user) - |> Map.put("type", ["Create", "Announce", "Follow"]) - - ActivityPub.fetch_public_activities(opts) - |> activities_to_statuses(%{for: user}) - end - - def fetch_user_statuses(user, opts \\ %{}) do - opts = - opts - |> Map.put("type", ["Create"]) - - ActivityPub.fetch_public_activities(opts) - |> activities_to_statuses(%{for: user}) - end - - def fetch_mentions(user, opts \\ %{}) do - ActivityPub.fetch_activities([user.ap_id], opts) - |> activities_to_statuses(%{for: user}) - end - - def fetch_conversation(user, id) do - with context when is_binary(context) <- conversation_id_to_context(id), - activities <- - ActivityPub.fetch_activities_for_context(context, %{ - "blocking_user" => user, - "user" => user - }), - statuses <- activities |> activities_to_statuses(%{for: user}) do - statuses - else - _e -> - [] - end - end - - def fetch_status(user, id) do - with %Activity{} = activity <- Repo.get(Activity, id), - true <- ActivityPub.visible_for_user?(activity, user) do - activity_to_status(activity, %{for: user}) + def delete(%User{} = user, id) do + # TwitterAPI does not have an "unretweet" endpoint; instead this is done + # via the "destroy" endpoint. Therefore, we need to handle + # when the status to "delete" is actually an Announce (repeat) object. + with %Activity{data: %{"type" => type}} <- Repo.get(Activity, id) do + case type do + "Announce" -> unrepeat(user, id) + _ -> CommonAPI.delete(id, user) + end end end @@ -127,25 +70,28 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do def repeat(%User{} = user, ap_id_or_id) do with {:ok, _announce, %{data: %{"id" => id}}} = CommonAPI.repeat(ap_id_or_id, user), - %Activity{} = activity <- Activity.get_create_activity_by_object_ap_id(id), - status <- activity_to_status(activity, %{for: user}) do - {:ok, status} + %Activity{} = activity <- Activity.get_create_activity_by_object_ap_id(id) do + {:ok, activity} + end + end + + defp unrepeat(%User{} = user, ap_id_or_id) do + with {:ok, _unannounce, activity, _object} <- CommonAPI.unrepeat(ap_id_or_id, user) do + {:ok, activity} end end def fav(%User{} = user, ap_id_or_id) do - with {:ok, _announce, %{data: %{"id" => id}}} = CommonAPI.favorite(ap_id_or_id, user), - %Activity{} = activity <- Activity.get_create_activity_by_object_ap_id(id), - status <- activity_to_status(activity, %{for: user}) do - {:ok, status} + with {:ok, _fav, %{data: %{"id" => id}}} = CommonAPI.favorite(ap_id_or_id, user), + %Activity{} = activity <- Activity.get_create_activity_by_object_ap_id(id) do + {:ok, activity} end end def unfav(%User{} = user, ap_id_or_id) do - with {:ok, %{data: %{"id" => id}}} = CommonAPI.unfavorite(ap_id_or_id, user), - %Activity{} = activity <- Activity.get_create_activity_by_object_ap_id(id), - status <- activity_to_status(activity, %{for: user}) do - {:ok, status} + with {:ok, _unfav, _fav, %{data: %{"id" => id}}} = CommonAPI.unfavorite(ap_id_or_id, user), + %Activity{} = activity <- Activity.get_create_activity_by_object_ap_id(id) do + {:ok, activity} end end @@ -255,7 +201,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do defp parse_int(_, default), do: default - def search(user, %{"q" => query} = params) do + def search(_user, %{"q" => query} = params) do limit = parse_int(params["rpp"], 20) page = parse_int(params["page"], 1) offset = (page - 1) * limit @@ -264,6 +210,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do from( a in Activity, where: fragment("?->>'type' = 'Create'", a.data), + where: "https://www.w3.org/ns/activitystreams#Public" in a.recipients, where: fragment( "to_tsvector('english', ?->'object'->>'content') @@ plainto_tsquery('english', ?)", @@ -276,70 +223,14 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do order_by: [desc: :inserted_at] ) - activities = Repo.all(q) - end - - defp activities_to_statuses(activities, opts) do - Enum.map(activities, fn activity -> - activity_to_status(activity, opts) - end) - end - - # For likes, fetch the liked activity, too. - defp activity_to_status(%Activity{data: %{"type" => "Like"}} = activity, opts) do - actor = get_in(activity.data, ["actor"]) - user = User.get_cached_by_ap_id(actor) - [liked_activity] = Activity.all_by_object_ap_id(activity.data["object"]) - - ActivityRepresenter.to_map( - activity, - Map.merge(opts, %{user: user, liked_activity: liked_activity}) - ) - end - - # For announces, fetch the announced activity and the user. - defp activity_to_status(%Activity{data: %{"type" => "Announce"}} = activity, opts) do - actor = get_in(activity.data, ["actor"]) - user = User.get_cached_by_ap_id(actor) - [announced_activity] = Activity.all_by_object_ap_id(activity.data["object"]) - announced_actor = User.get_cached_by_ap_id(announced_activity.data["actor"]) - - ActivityRepresenter.to_map( - activity, - Map.merge(opts, %{users: [user, announced_actor], announced_activity: announced_activity}) - ) - end - - defp activity_to_status(%Activity{data: %{"type" => "Delete"}} = activity, opts) do - actor = get_in(activity.data, ["actor"]) - user = User.get_cached_by_ap_id(actor) - ActivityRepresenter.to_map(activity, Map.merge(opts, %{user: user})) - end - - defp activity_to_status(activity, opts) do - actor = get_in(activity.data, ["actor"]) - user = User.get_cached_by_ap_id(actor) - # mentioned_users = Repo.all(from user in User, where: user.ap_id in ^activity.data["to"]) - mentioned_users = - Enum.map(activity.recipients || [], fn ap_id -> - if ap_id do - User.get_cached_by_ap_id(ap_id) - else - nil - end - end) - |> Enum.filter(& &1) - - ActivityRepresenter.to_map( - activity, - Map.merge(opts, %{user: user, mentioned: mentioned_users}) - ) + _activities = Repo.all(q) end defp make_date do DateTime.utc_now() |> DateTime.to_iso8601() end + # DEPRECATED mostly, context objects are now created at insertion time. def context_to_conversation_id(context) do with %Object{id: id} <- Object.get_cached_by_ap_id(context) do id