Don't reject already accepted subscriptions.
[akkoma] / lib / pleroma / web / mastodon_api / mastodon_api_controller.ex
index 8b794fb61587a3e27bb828853b497973a54ae22b..a01a199fb8a2f1d83c76f8c206ee618cf3127483 100644 (file)
@@ -77,7 +77,10 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
   end
 
   def home_timeline(%{assigns: %{user: user}} = conn, params) do
-    activities = ActivityPub.fetch_activities([user.ap_id | user.following], Map.put(params, "type", "Create"))
+    params = params
+    |> Map.put("type", ["Create", "Announce"])
+
+    activities = ActivityPub.fetch_activities([user.ap_id | user.following], params)
     |> Enum.reverse
 
     conn
@@ -87,7 +90,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
 
   def public_timeline(%{assigns: %{user: user}} = conn, params) do
     params = params
-    |> Map.put("type", "Create")
+    |> Map.put("type", ["Create", "Announce"])
     |> Map.put("local_only", !!params["local"])
 
     activities = ActivityPub.fetch_public_activities(params)
@@ -102,7 +105,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
   def user_statuses(%{assigns: %{user: user}} = conn, params) do
     with %User{ap_id: ap_id} <- Repo.get(User, params["id"]) do
       params = params
-      |> Map.put("type", "Create")
+      |> Map.put("type", ["Create", "Announce"])
       |> Map.put("actor_id", ap_id)
 
       activities = ActivityPub.fetch_activities([], params)
@@ -287,6 +290,43 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
     end
   end
 
+  def search(%{assigns: %{user: user}} = conn, %{"q" => query} = params) do
+    if params["resolve"] == "true" do
+      User.get_or_fetch_by_nickname(query)
+    end
+
+    q = from u in User,
+      where: fragment("(to_tsvector('english', ?) || to_tsvector('english', ?)) @@ plainto_tsquery('english', ?)", u.nickname, u.name, ^query),
+      limit: 20
+    accounts = Repo.all(q)
+
+    q = from a in Activity,
+      where: fragment("?->>'type' = 'Create'", a.data),
+      where: fragment("to_tsvector('english', ?->'object'->>'content') @@ plainto_tsquery('english', ?)", a.data, ^query),
+      limit: 20
+    statuses = Repo.all(q)
+
+    res = %{
+      "accounts" => AccountView.render("accounts.json", users: accounts, for: user, as: :user),
+      "statuses" => StatusView.render("index.json", activities: statuses, for: user, as: :activity),
+      "hashtags" => []
+    }
+
+    json(conn, res)
+  end
+
+  def favourites(%{assigns: %{user: user}} = conn, params) do
+    params = conn
+    |> Map.put("type", "Create")
+    |> Map.put("favorited_by", user.ap_id)
+
+    activities = ActivityPub.fetch_activities([], params)
+    |> Enum.reverse
+
+    conn
+    |> render(StatusView, "index.json", %{activities: activities, for: user, as: :activity})
+  end
+
   def relationship_noop(%{assigns: %{user: user}} = conn, %{"id" => id}) do
     Logger.debug("Unimplemented, returning unmodified relationship")
     with %User{} = target <- Repo.get(User, id) do