summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorRoger Braun <roger@rogerbraun.net>2017-10-30 19:25:32 +0100
committerRoger Braun <roger@rogerbraun.net>2017-10-30 19:25:32 +0100
commitf23edd2d6b67ee30ccd16b7a27d9e07a9f928574 (patch)
tree7f8516e81ff6d1aa188904dab044fec01488bc70 /lib
parent261ec824515c1de6d93ad1c4ca7d3cf73faa58a4 (diff)
parent502cb38cd69f9f8c15a0ee597584364f9d36bdf1 (diff)
downloadpleroma-f23edd2d6b67ee30ccd16b7a27d9e07a9f928574.tar.gz
pleroma-f23edd2d6b67ee30ccd16b7a27d9e07a9f928574.zip
Merge branch 'feld/pleroma-feld-mastodon-usersearch' into develop
Diffstat (limited to 'lib')
-rw-r--r--lib/pleroma/object.ex2
-rw-r--r--lib/pleroma/user.ex12
-rw-r--r--lib/pleroma/web/activity_pub/utils.ex6
-rw-r--r--lib/pleroma/web/mastodon_api/mastodon_api_controller.ex39
-rw-r--r--lib/pleroma/web/router.ex3
5 files changed, 49 insertions, 13 deletions
diff --git a/lib/pleroma/object.ex b/lib/pleroma/object.ex
index 3c42c7cb5..a5a1d6a76 100644
--- a/lib/pleroma/object.ex
+++ b/lib/pleroma/object.ex
@@ -24,7 +24,7 @@ defmodule Pleroma.Object do
def get_by_ap_id(nil), do: nil
def get_by_ap_id(ap_id) do
Repo.one(from object in Object,
- where: fragment("? @> ?", object.data, ^%{id: ap_id}))
+ where: fragment("(?)->>'id' = ?", object.data, ^ap_id))
end
def get_cached_by_ap_id(ap_id) do
diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex
index 938b57d90..bf63a22b3 100644
--- a/lib/pleroma/user.ex
+++ b/lib/pleroma/user.ex
@@ -241,7 +241,7 @@ defmodule Pleroma.User do
def update_note_count(%User{} = user) do
note_count_query = from a in Object,
- where: fragment("? @> ?", a.data, ^%{actor: user.ap_id, type: "Note"}),
+ where: fragment("?->>'actor' = ? and ?->>'type' = 'Note'", a.data, ^user.ap_id, a.data),
select: count(a.id)
note_count = Repo.one(note_count_query)
@@ -274,4 +274,14 @@ defmodule Pleroma.User do
Repo.all(query)
end
+
+ def search(query, resolve) do
+ if resolve 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
+ Repo.all(q)
+ end
end
diff --git a/lib/pleroma/web/activity_pub/utils.ex b/lib/pleroma/web/activity_pub/utils.ex
index 4b8e6b690..4e3a7e2bd 100644
--- a/lib/pleroma/web/activity_pub/utils.ex
+++ b/lib/pleroma/web/activity_pub/utils.ex
@@ -90,7 +90,11 @@ defmodule Pleroma.Web.ActivityPub.Utils do
"""
def get_existing_like(actor, %{data: %{"id" => id}} = object) do
query = from activity in Activity,
- where: fragment("? @> ?", activity.data, ^%{actor: actor, object: id, type: "Like"})
+ where: fragment("(?)->>'actor' = ?", activity.data, ^actor),
+ # this is to use the index
+ where: fragment("coalesce((?)->'object'->>'id', (?)->>'object') = ?", activity.data, activity.data, ^id),
+ where: fragment("(?)->>'type' = 'Like'", activity.data)
+
Repo.one(query)
end
diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
index a01a199fb..9399dee86 100644
--- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
+++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
@@ -271,9 +271,27 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
def follow(%{assigns: %{user: follower}} = conn, %{"id" => id}) do
with %User{} = followed <- Repo.get(User, id),
- {:ok, follower} <- User.follow(follower, followed),
- {:ok, activity} <- ActivityPub.follow(follower, followed) do
+ {:ok, follower} <- User.follow(follower, followed),
+ {:ok, activity} <- ActivityPub.follow(follower, followed) do
render conn, AccountView, "relationship.json", %{user: follower, target: followed}
+ else
+ {:error, message} = err ->
+ conn
+ |> put_resp_content_type("application/json")
+ |> send_resp(403, Poison.encode!(%{"error" => message}))
+ end
+ end
+
+ def follow(%{assigns: %{user: follower}} = conn, %{"uri" => uri}) do
+ with %User{} = followed <- Repo.get_by(User, nickname: uri),
+ {:ok, follower} <- User.follow(follower, followed),
+ {:ok, activity} <- ActivityPub.follow(follower, followed) do
+ render conn, AccountView, "account.json", %{user: followed}
+ else
+ {:error, message} = err ->
+ conn
+ |> put_resp_content_type("application/json")
+ |> send_resp(403, Poison.encode!(%{"error" => message}))
end
end
@@ -291,14 +309,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
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)
+ accounts = User.search(query, params["resolve"] == "true")
q = from a in Activity,
where: fragment("?->>'type' = 'Create'", a.data),
@@ -315,6 +326,14 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
json(conn, res)
end
+ def account_search(%{assigns: %{user: user}} = conn, %{"q" => query} = params) do
+ accounts = User.search(query, params["resolve"] == "true")
+
+ res = AccountView.render("accounts.json", users: accounts, for: user, as: :user)
+
+ json(conn, res)
+ end
+
def favourites(%{assigns: %{user: user}} = conn, params) do
params = conn
|> Map.put("type", "Create")
diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex
index cb818b3cc..1fb5eadf6 100644
--- a/lib/pleroma/web/router.ex
+++ b/lib/pleroma/web/router.ex
@@ -55,6 +55,7 @@ defmodule Pleroma.Web.Router do
get "/accounts/verify_credentials", MastodonAPIController, :verify_credentials
get "/accounts/relationships", MastodonAPIController, :relationships
+ get "/accounts/search", MastodonAPIController, :account_search
post "/accounts/:id/follow", MastodonAPIController, :follow
post "/accounts/:id/unfollow", MastodonAPIController, :unfollow
post "/accounts/:id/block", MastodonAPIController, :relationship_noop
@@ -62,6 +63,8 @@ defmodule Pleroma.Web.Router do
post "/accounts/:id/mute", MastodonAPIController, :relationship_noop
post "/accounts/:id/unmute", MastodonAPIController, :relationship_noop
+ post "/follows", MastodonAPIController, :follow
+
get "/blocks", MastodonAPIController, :empty_array
get "/domain_blocks", MastodonAPIController, :empty_array
get "/follow_requests", MastodonAPIController, :empty_array