From 9f0a2a714b498edfbacc638fa79e06e3a8dc4d04 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Sat, 16 Sep 2017 10:42:24 +0200 Subject: [PATCH] Add basic search. --- .../mastodon_api/mastodon_api_controller.ex | 21 ++++++++++++++++++ lib/pleroma/web/router.ex | 2 ++ .../mastodon_api_controller_test.exs | 22 +++++++++++++++++++ 3 files changed, 45 insertions(+) diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex index 8b794fb61..6b84d732f 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -287,6 +287,27 @@ def unfollow(%{assigns: %{user: follower}} = conn, %{"id" => id}) do end end + def search(%{assigns: %{user: user}} = conn, %{"q" => query}) do + q = from u in User, + where: fragment("(to_tsvector(?) || to_tsvector(?)) @@ plainto_tsquery(?)", 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(?->'object'->>'content') @@ plainto_tsquery(?)", 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 relationship_noop(%{assigns: %{user: user}} = conn, %{"id" => id}) do Logger.debug("Unimplemented, returning unmodified relationship") with %User{} = target <- Repo.get(User, id) do diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 3de77d220..e8460db16 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -87,6 +87,8 @@ def user_fetcher(username) do get "/accounts/:id/followers", MastodonAPIController, :followers get "/accounts/:id/following", MastodonAPIController, :following get "/accounts/:id", MastodonAPIController, :user + + get "/search", MastodonAPIController, :search end scope "/api", Pleroma.Web do diff --git a/test/web/mastodon_api/mastodon_api_controller_test.exs b/test/web/mastodon_api/mastodon_api_controller_test.exs index 1b887cc24..1bef1a1fd 100644 --- a/test/web/mastodon_api/mastodon_api_controller_test.exs +++ b/test/web/mastodon_api/mastodon_api_controller_test.exs @@ -310,4 +310,26 @@ test "unimplemented mutes, follow_requests, blocks, domain blocks" do assert [] = json_response(conn, 200) end) end + + test "search", %{conn: conn} do + user = insert(:user) + user_two = insert(:user, %{nickname: "shp@shitposter.club"}) + user_three = insert(:user, %{nickname: "shp@heldscal.la", name: "I love 2hu"}) + + {:ok, activity} = CommonAPI.post(user, %{"status" => "This is about 2hu"}) + {:ok, _} = CommonAPI.post(user_two, %{"status" => "This isn't"}) + + conn = conn + |> get("/api/v1/search", %{"q" => "2hu"}) + + assert results = json_response(conn, 200) + + [account] = results["accounts"] + assert account["id"] == user_three.id + + assert results["hashtags"] == [] + + [status] = results["statuses"] + assert status["id"] == activity.id + end end