From ec546baee915ecd9843f3c84e5cb0dbdbdcad826 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Tue, 24 Oct 2017 10:39:23 +0200 Subject: Use different index for object fetching. --- lib/pleroma/object.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') 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 -- cgit v1.2.3 From 9af560083fcc513a7b3c41b06f4ed307c50a7529 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Tue, 24 Oct 2017 14:16:17 +0200 Subject: Use more efficient user note count update query. --- lib/pleroma/user.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 938b57d90..bfd3a3ad7 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) -- cgit v1.2.3 From 529351673090d8165bb0c54f9e957e611fcacd72 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Tue, 24 Oct 2017 14:39:01 +0200 Subject: Use more efficient query to fetch likes. --- lib/pleroma/web/activity_pub/utils.ex | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'lib') 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 -- cgit v1.2.3 From 813d2eaaf08efcb7aa87f6270e98c760b0b60b99 Mon Sep 17 00:00:00 2001 From: eal Date: Wed, 25 Oct 2017 21:02:42 +0300 Subject: Add mastodon API endpoint for follow --- .../web/mastodon_api/mastodon_api_controller.ex | 31 +++++++++++++++++++--- lib/pleroma/web/router.ex | 2 ++ 2 files changed, 29 insertions(+), 4 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex index a01a199fb..ea85e5bce 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -269,11 +269,13 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do end end - 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 + def follow(%{assigns: %{user: follower}} = conn, params) do + with {:ok, %User{} = followed} <- get_user(params), + {:ok, follower} <- User.follow(follower, followed), + {:ok, activity} <- ActivityPub.follow(follower, followed) do render conn, AccountView, "relationship.json", %{user: follower, target: followed} + else + err -> err end end @@ -338,4 +340,25 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do Logger.debug("Unimplemented, returning an empty array") json(conn, []) end + + defp get_user(params) do + case params do + %{"uri" => uri} -> + case target = Repo.get_by(User, nickname: uri) do + nil -> + {:error, "No user with such nickname"} + _ -> + {:ok, target} + end + %{"id" => id} -> + case target = Repo.get(User, id) do + nil -> + {:error, "No user with such id"} + _ -> + {:ok, target} + end + _ -> + {:error, "You need to specify uri or id"} + end + end end diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index cb818b3cc..45c47eefb 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -62,6 +62,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 -- cgit v1.2.3 From 11d2287476fe9518cd0a3721a0fe7a0a1fd937fd Mon Sep 17 00:00:00 2001 From: eal Date: Wed, 25 Oct 2017 21:25:37 +0300 Subject: Return error message on errors --- lib/pleroma/web/mastodon_api/mastodon_api_controller.ex | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex index ea85e5bce..5032c735d 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -275,7 +275,10 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do {:ok, activity} <- ActivityPub.follow(follower, followed) do render conn, AccountView, "relationship.json", %{user: follower, target: followed} else - err -> err + {:error, message} = err -> + conn + |> put_resp_content_type("application/json") + |> send_resp(403, Poison.encode!(%{"error" => message})) end end -- cgit v1.2.3 From c56d28f96c343d445ec8d06baf351423691036f3 Mon Sep 17 00:00:00 2001 From: eal Date: Sun, 29 Oct 2017 00:07:38 +0300 Subject: Fix return type of /api/v1/follows --- .../web/mastodon_api/mastodon_api_controller.ex | 38 +++++++++------------- lib/pleroma/web/router.ex | 2 +- 2 files changed, 16 insertions(+), 24 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex index 5032c735d..25c5418ab 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -269,8 +269,8 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do end end - def follow(%{assigns: %{user: follower}} = conn, params) do - with {:ok, %User{} = followed} <- get_user(params), + 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 render conn, AccountView, "relationship.json", %{user: follower, target: followed} @@ -282,6 +282,19 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do end end + def follows(%{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 + # TODO: Clean up and unify def unfollow(%{assigns: %{user: follower}} = conn, %{"id" => id}) do with %User{} = followed <- Repo.get(User, id), @@ -343,25 +356,4 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do Logger.debug("Unimplemented, returning an empty array") json(conn, []) end - - defp get_user(params) do - case params do - %{"uri" => uri} -> - case target = Repo.get_by(User, nickname: uri) do - nil -> - {:error, "No user with such nickname"} - _ -> - {:ok, target} - end - %{"id" => id} -> - case target = Repo.get(User, id) do - nil -> - {:error, "No user with such id"} - _ -> - {:ok, target} - end - _ -> - {:error, "You need to specify uri or id"} - end - end end diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 45c47eefb..557d094b4 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -62,7 +62,7 @@ defmodule Pleroma.Web.Router do post "/accounts/:id/mute", MastodonAPIController, :relationship_noop post "/accounts/:id/unmute", MastodonAPIController, :relationship_noop - post "/follows", MastodonAPIController, :follow + post "/follows", MastodonAPIController, :follows get "/blocks", MastodonAPIController, :empty_array get "/domain_blocks", MastodonAPIController, :empty_array -- cgit v1.2.3 From 2ffc6da20799ac8e7882f5e72d3f37dadc1f2428 Mon Sep 17 00:00:00 2001 From: eal Date: Sun, 29 Oct 2017 00:30:10 +0300 Subject: Clean style. Use 'follow' instead of 'follows' and correct indentation. --- lib/pleroma/web/mastodon_api/mastodon_api_controller.ex | 6 +++--- lib/pleroma/web/router.ex | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex index 25c5418ab..971772810 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -282,10 +282,10 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do end end - def follows(%{assigns: %{user: follower}} = conn, %{"uri" => uri}) do + 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 + {:ok, follower} <- User.follow(follower, followed), + {:ok, activity} <- ActivityPub.follow(follower, followed) do render conn, AccountView, "account.json", %{user: followed} else {:error, message} = err -> diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 557d094b4..45c47eefb 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -62,7 +62,7 @@ defmodule Pleroma.Web.Router do post "/accounts/:id/mute", MastodonAPIController, :relationship_noop post "/accounts/:id/unmute", MastodonAPIController, :relationship_noop - post "/follows", MastodonAPIController, :follows + post "/follows", MastodonAPIController, :follow get "/blocks", MastodonAPIController, :empty_array get "/domain_blocks", MastodonAPIController, :empty_array -- cgit v1.2.3 From efe12e1a73e13c9e749a4e6cc9c0c8a6988d87db Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Mon, 30 Oct 2017 03:37:07 +0000 Subject: Fix /api/v1/accounts/search by splitting account search into its own function --- lib/pleroma/web/mastodon_api/mastodon_api_controller.ex | 14 +++++++++++++- lib/pleroma/web/router.ex | 1 + 2 files changed, 14 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex index 971772810..dacb0ebe3 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -308,7 +308,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do end end - def search(%{assigns: %{user: user}} = conn, %{"q" => query} = params) do + def dousersearch(%{assigns: %{user: user}} = conn, %{"q" => query} = params) do if params["resolve"] == "true" do User.get_or_fetch_by_nickname(query) end @@ -317,6 +317,10 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do where: fragment("(to_tsvector('english', ?) || to_tsvector('english', ?)) @@ plainto_tsquery('english', ?)", u.nickname, u.name, ^query), limit: 20 accounts = Repo.all(q) + end + + def search(%{assigns: %{user: user}} = conn, %{"q" => query} = params) do + accounts = Pleroma.Web.MastodonAPI.MastodonAPIController.dousersearch(conn, params) q = from a in Activity, where: fragment("?->>'type' = 'Create'", a.data), @@ -333,6 +337,14 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do json(conn, res) end + def accountsearch(%{assigns: %{user: user}} = conn, %{"q" => query} = params) do + accounts = Pleroma.Web.MastodonAPI.MastodonAPIController.dousersearch(conn, params) + + 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 45c47eefb..53f4a45e3 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, :accountsearch post "/accounts/:id/follow", MastodonAPIController, :follow post "/accounts/:id/unfollow", MastodonAPIController, :unfollow post "/accounts/:id/block", MastodonAPIController, :relationship_noop -- cgit v1.2.3 From 502cb38cd69f9f8c15a0ee597584364f9d36bdf1 Mon Sep 17 00:00:00 2001 From: Roger Braun Date: Mon, 30 Oct 2017 19:23:16 +0100 Subject: Move user search to User module. --- lib/pleroma/user.ex | 10 ++++++++++ lib/pleroma/web/mastodon_api/mastodon_api_controller.ex | 17 +++-------------- lib/pleroma/web/router.ex | 2 +- 3 files changed, 14 insertions(+), 15 deletions(-) (limited to 'lib') diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index bfd3a3ad7..bf63a22b3 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -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/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex index dacb0ebe3..9399dee86 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -308,19 +308,8 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do end end - def dousersearch(%{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) - end - def search(%{assigns: %{user: user}} = conn, %{"q" => query} = params) do - accounts = Pleroma.Web.MastodonAPI.MastodonAPIController.dousersearch(conn, params) + accounts = User.search(query, params["resolve"] == "true") q = from a in Activity, where: fragment("?->>'type' = 'Create'", a.data), @@ -337,8 +326,8 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do json(conn, res) end - def accountsearch(%{assigns: %{user: user}} = conn, %{"q" => query} = params) do - accounts = Pleroma.Web.MastodonAPI.MastodonAPIController.dousersearch(conn, params) + 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) diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 53f4a45e3..1fb5eadf6 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -55,7 +55,7 @@ defmodule Pleroma.Web.Router do get "/accounts/verify_credentials", MastodonAPIController, :verify_credentials get "/accounts/relationships", MastodonAPIController, :relationships - get "/accounts/search", MastodonAPIController, :accountsearch + 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 -- cgit v1.2.3