aboutsummaryrefslogtreecommitdiff
path: root/lib/pleroma
diff options
context:
space:
mode:
authorRoger Braun <roger@rogerbraun.net>2017-04-14 17:13:51 +0200
committerRoger Braun <roger@rogerbraun.net>2017-04-14 17:13:51 +0200
commit03ddaead7e01d096cc3caa95a956d049be2e28f6 (patch)
tree14ffabd4929e556c668d94d6e5f21634397d6a2a /lib/pleroma
parent90b38fd51b4d40b6240ff5e5e3bb852eb18f97df (diff)
downloadpleroma-03ddaead7e01d096cc3caa95a956d049be2e28f6.tar.gz
Add basic user caching.
Expires after 5 seconds.
Diffstat (limited to 'lib/pleroma')
-rw-r--r--lib/pleroma/application.ex4
-rw-r--r--lib/pleroma/user.ex13
-rw-r--r--lib/pleroma/web/twitter_api/twitter_api.ex13
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