OAuthPlug: use user cache instead of joining
authorHélène <pleroma-dev@helene.moe>
Tue, 23 Aug 2022 15:15:06 +0000 (17:15 +0200)
committerFloatingGhost <hannah@coffee-and-dreams.uk>
Sun, 11 Sep 2022 18:55:55 +0000 (19:55 +0100)
As this plug is called on every request, this should reduce load on the
database by not requiring to select on the users table every single
time, and to instead use the by-ID user cache whenever possible.

lib/pleroma/web/plugs/o_auth_plug.ex

index 5e06ac3f68ea17a0111c4b560d91c2fe717414aa..91f6e997419312c580dd4f600aee22fc003b9823 100644 (file)
@@ -47,15 +47,17 @@ defmodule Pleroma.Web.Plugs.OAuthPlug do
   #
   @spec fetch_user_and_token(String.t()) :: {:ok, User.t(), Token.t()} | nil
   defp fetch_user_and_token(token) do
-    query =
+    token_query =
       from(t in Token,
-        where: t.token == ^token,
-        join: user in assoc(t, :user),
-        preload: [user: user]
+        where: t.token == ^token
       )
 
-    with %Token{user: user} = token_record <- Repo.one(query) do
+    with %Token{user_id: user_id} = token_record <- Repo.one(token_query),
+         false <- is_nil(user_id),
+         %User{} = user <- User.get_cached_by_id(user_id) do
       {:ok, user, token_record}
+    else
+      _ -> nil
     end
   end