diff options
Diffstat (limited to 'lib/pleroma')
-rw-r--r-- | lib/pleroma/application.ex | 4 | ||||
-rw-r--r-- | lib/pleroma/user.ex | 13 | ||||
-rw-r--r-- | lib/pleroma/web/twitter_api/twitter_api.ex | 13 |
3 files changed, 26 insertions, 4 deletions
diff --git a/lib/pleroma/application.ex b/lib/pleroma/application.ex index e88a85196..e5bd17ced 100644 --- a/lib/pleroma/application.ex +++ b/lib/pleroma/application.ex @@ -14,6 +14,10 @@ defmodule Pleroma.Application do supervisor(Pleroma.Web.Endpoint, []), # Start your own worker by calling: Pleroma.Worker.start_link(arg1, arg2, arg3) # worker(Pleroma.Worker, [arg1, arg2, arg3]), + supervisor(ConCache, [[ + ttl_check: :timer.seconds(1), + ttl: :timer.seconds(5) + ], [name: :users]]) ] # See http://elixir-lang.org/docs/stable/elixir/Supervisor.html diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index c77704db0..0a443d22a 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -52,4 +52,17 @@ defmodule Pleroma.User do def following?(%User{} = follower, %User{} = followed) do Enum.member?(follower.following, User.ap_followers(followed)) end + + def get_cached_by_ap_id(ap_id) do + ConCache.get_or_store(:users, "ap_id:#{ap_id}", fn() -> + # Return false so the cache will store it. + Repo.get_by(User, ap_id: ap_id) || false + end) + end + + def get_cached_by_nickname(nickname) do + ConCache.get_or_store(:users, "nickname:#{nickname}", fn() -> + Repo.get_by(User, nickname: nickname) || false + end) + end end diff --git a/lib/pleroma/web/twitter_api/twitter_api.ex b/lib/pleroma/web/twitter_api/twitter_api.ex index 19f3c1c8c..d6ef0f4ed 100644 --- a/lib/pleroma/web/twitter_api/twitter_api.ex +++ b/lib/pleroma/web/twitter_api/twitter_api.ex @@ -175,7 +175,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do Regex.scan(regex, text) |> List.flatten |> Enum.uniq - |> Enum.map(fn ("@" <> match = full_match) -> {full_match, Repo.get_by(User, nickname: match)} end) + |> Enum.map(fn ("@" <> match = full_match) -> {full_match, User.get_cached_by_nickname(match)} end) |> Enum.filter(fn ({_match, user}) -> user end) end @@ -205,7 +205,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do # For likes, fetch the liked activity, too. defp activity_to_status(%Activity{data: %{"type" => "Like"}} = activity, opts) do actor = get_in(activity.data, ["actor"]) - user = Repo.get_by!(User, ap_id: actor) + user = User.get_cached_by_ap_id(actor) [liked_activity] = Activity.all_by_object_ap_id(activity.data["object"]) ActivityRepresenter.to_map(activity, Map.merge(opts, %{user: user, liked_activity: liked_activity})) @@ -213,8 +213,13 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do defp activity_to_status(activity, opts) do actor = get_in(activity.data, ["actor"]) - user = Repo.get_by!(User, ap_id: actor) - mentioned_users = Repo.all(from user in User, where: user.ap_id in ^activity.data["to"]) + user = User.get_cached_by_ap_id(actor) + # mentioned_users = Repo.all(from user in User, where: user.ap_id in ^activity.data["to"]) + mentioned_users = Enum.map(activity.data["to"], fn (ap_id) -> + User.get_cached_by_ap_id(ap_id) + end) + |> Enum.filter(&(&1)) + ActivityRepresenter.to_map(activity, Map.merge(opts, %{user: user, mentioned: mentioned_users})) end |