[Pleroma.Web.MastodonApi.MastodonApiController] Add /api/v2/search
authorHaelwenn (lanodan) Monnier <contact@hacktivis.me>
Wed, 13 Jun 2018 16:21:59 +0000 (18:21 +0200)
committerHaelwenn (lanodan) Monnier <contact@hacktivis.me>
Sat, 23 Jun 2018 14:22:47 +0000 (16:22 +0200)
lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
lib/pleroma/web/router.ex

index a42f341c20da936d66be896b48ee0e3183fd5b36..71f34a488aeec9e26fb440f8d510d8df7541c65b 100644 (file)
@@ -621,6 +621,58 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
     json(conn, %{})
   end
 
+  def search2(%{assigns: %{user: user}} = conn, %{"q" => query} = params) do
+    accounts = User.search(query, params["resolve"] == "true")
+
+    fetched =
+      if Regex.match?(~r/https?:/, query) do
+        with {:ok, activities} <- OStatus.fetch_activity_from_url(query) do
+          activities
+          |> Enum.filter(fn
+            %{data: %{"type" => "Create"}} -> true
+            _ -> false
+          end)
+        else
+          _e -> []
+        end
+      end || []
+
+    q =
+      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', ?)",
+            a.data,
+            ^query
+          ),
+        limit: 20,
+        order_by: [desc: :id]
+      )
+
+    statuses = Repo.all(q) ++ fetched
+
+    tags_path = Web.base_url() <> "/tag/"
+
+    tags =
+      String.split(query)
+      |> Enum.uniq()
+      |> Enum.filter(fn tag -> String.starts_with?(tag, "#") end)
+      |> Enum.map(fn tag -> String.slice(tag, 1..-1) end)
+      |> Enum.map(fn tag -> %{name: tag, url: tags_path <> tag} end)
+
+    res = %{
+      "accounts" => AccountView.render("accounts.json", users: accounts, for: user, as: :user),
+      "statuses" =>
+        StatusView.render("index.json", activities: statuses, for: user, as: :activity),
+      "hashtags" => tags
+    }
+
+    json(conn, res)
+  end
+
   def search(%{assigns: %{user: user}} = conn, %{"q" => query} = params) do
     accounts = User.search(query, params["resolve"] == "true")
 
index 929a70f91041f5dbfb4e27451a11cb7c3ff6eb15..ebe68218b3992e4b8d18cf24d61ba67c22b92445 100644 (file)
@@ -175,6 +175,11 @@ defmodule Pleroma.Web.Router do
     get("/search", MastodonAPIController, :search)
   end
 
+  scope "/api/v2", Pleroma.Web.MastodonAPI do
+    pipe_through(:api)
+    get("/search", MastodonAPIController, :search2)
+  end
+
   scope "/api", Pleroma.Web do
     pipe_through(:config)