Add basic user caching.
Expires after 5 seconds.
This commit is contained in:
parent
90b38fd51b
commit
03ddaead7e
|
@ -14,6 +14,10 @@ def start(_type, _args) do
|
||||||
supervisor(Pleroma.Web.Endpoint, []),
|
supervisor(Pleroma.Web.Endpoint, []),
|
||||||
# Start your own worker by calling: Pleroma.Worker.start_link(arg1, arg2, arg3)
|
# Start your own worker by calling: Pleroma.Worker.start_link(arg1, arg2, arg3)
|
||||||
# worker(Pleroma.Worker, [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
|
# See http://elixir-lang.org/docs/stable/elixir/Supervisor.html
|
||||||
|
|
|
@ -52,4 +52,17 @@ def unfollow(%User{} = follower, %User{} = followed) do
|
||||||
def following?(%User{} = follower, %User{} = followed) do
|
def following?(%User{} = follower, %User{} = followed) do
|
||||||
Enum.member?(follower.following, User.ap_followers(followed))
|
Enum.member?(follower.following, User.ap_followers(followed))
|
||||||
end
|
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
|
end
|
||||||
|
|
|
@ -175,7 +175,7 @@ def parse_mentions(text) do
|
||||||
Regex.scan(regex, text)
|
Regex.scan(regex, text)
|
||||||
|> List.flatten
|
|> List.flatten
|
||||||
|> Enum.uniq
|
|> 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)
|
|> Enum.filter(fn ({_match, user}) -> user end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -205,7 +205,7 @@ defp activities_to_statuses(activities, opts) do
|
||||||
# For likes, fetch the liked activity, too.
|
# For likes, fetch the liked activity, too.
|
||||||
defp activity_to_status(%Activity{data: %{"type" => "Like"}} = activity, opts) do
|
defp activity_to_status(%Activity{data: %{"type" => "Like"}} = activity, opts) do
|
||||||
actor = get_in(activity.data, ["actor"])
|
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"])
|
[liked_activity] = Activity.all_by_object_ap_id(activity.data["object"])
|
||||||
|
|
||||||
ActivityRepresenter.to_map(activity, Map.merge(opts, %{user: user, liked_activity: liked_activity}))
|
ActivityRepresenter.to_map(activity, Map.merge(opts, %{user: user, liked_activity: liked_activity}))
|
||||||
|
@ -213,8 +213,13 @@ defp activity_to_status(%Activity{data: %{"type" => "Like"}} = activity, opts) d
|
||||||
|
|
||||||
defp activity_to_status(activity, opts) do
|
defp activity_to_status(activity, opts) do
|
||||||
actor = get_in(activity.data, ["actor"])
|
actor = get_in(activity.data, ["actor"])
|
||||||
user = Repo.get_by!(User, ap_id: actor)
|
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 = 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}))
|
ActivityRepresenter.to_map(activity, Map.merge(opts, %{user: user, mentioned: mentioned_users}))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
1
mix.exs
1
mix.exs
|
@ -38,6 +38,7 @@ defp deps do
|
||||||
{:trailing_format_plug, "~> 0.0.5" },
|
{:trailing_format_plug, "~> 0.0.5" },
|
||||||
{:html_sanitize_ex, "~> 1.0.0"},
|
{:html_sanitize_ex, "~> 1.0.0"},
|
||||||
{:calendar, "~> 0.16.1"},
|
{:calendar, "~> 0.16.1"},
|
||||||
|
{:con_cache, "~> 0.12.0"},
|
||||||
{:ex_machina, "~> 2.0", only: :test},
|
{:ex_machina, "~> 2.0", only: :test},
|
||||||
{:mix_test_watch, "~> 0.2", only: :dev}]
|
{:mix_test_watch, "~> 0.2", only: :dev}]
|
||||||
end
|
end
|
||||||
|
|
2
mix.lock
2
mix.lock
|
@ -1,6 +1,7 @@
|
||||||
%{"calendar": {:hex, :calendar, "0.16.1", "782327ad8bae7c797b887840dc4ddb933f05ce6e333e5b04964d7a5d5f79bde3", [:mix], [{:tzdata, "~> 0.5.8 or ~> 0.1.201603", [hex: :tzdata, optional: false]}]},
|
%{"calendar": {:hex, :calendar, "0.16.1", "782327ad8bae7c797b887840dc4ddb933f05ce6e333e5b04964d7a5d5f79bde3", [:mix], [{:tzdata, "~> 0.5.8 or ~> 0.1.201603", [hex: :tzdata, optional: false]}]},
|
||||||
"certifi": {:hex, :certifi, "1.0.0", "1c787a85b1855ba354f0b8920392c19aa1d06b0ee1362f9141279620a5be2039", [:rebar3], []},
|
"certifi": {:hex, :certifi, "1.0.0", "1c787a85b1855ba354f0b8920392c19aa1d06b0ee1362f9141279620a5be2039", [:rebar3], []},
|
||||||
"comeonin": {:hex, :comeonin, "3.0.2", "8b213268a6634bd2e31a8035a963e974681d13ccc1f73f2ae664b6ac4e993c96", [:make, :mix], [{:elixir_make, "~> 0.4", [hex: :elixir_make, optional: false]}]},
|
"comeonin": {:hex, :comeonin, "3.0.2", "8b213268a6634bd2e31a8035a963e974681d13ccc1f73f2ae664b6ac4e993c96", [:make, :mix], [{:elixir_make, "~> 0.4", [hex: :elixir_make, optional: false]}]},
|
||||||
|
"con_cache": {:hex, :con_cache, "0.12.0", "2d961aec219aa5a914473873f348f5a6088292dc69d5192a9d25f8a1e13e9905", [:mix], [{:exactor, "~> 2.2.0", [hex: :exactor, optional: false]}]},
|
||||||
"connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], []},
|
"connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], []},
|
||||||
"cowboy": {:hex, :cowboy, "1.1.2", "61ac29ea970389a88eca5a65601460162d370a70018afe6f949a29dca91f3bb0", [:rebar3], [{:cowlib, "~> 1.0.2", [hex: :cowlib, optional: false]}, {:ranch, "~> 1.3.2", [hex: :ranch, optional: false]}]},
|
"cowboy": {:hex, :cowboy, "1.1.2", "61ac29ea970389a88eca5a65601460162d370a70018afe6f949a29dca91f3bb0", [:rebar3], [{:cowlib, "~> 1.0.2", [hex: :cowlib, optional: false]}, {:ranch, "~> 1.3.2", [hex: :ranch, optional: false]}]},
|
||||||
"cowlib": {:hex, :cowlib, "1.0.2", "9d769a1d062c9c3ac753096f868ca121e2730b9a377de23dec0f7e08b1df84ee", [:make], []},
|
"cowlib": {:hex, :cowlib, "1.0.2", "9d769a1d062c9c3ac753096f868ca121e2730b9a377de23dec0f7e08b1df84ee", [:make], []},
|
||||||
|
@ -9,6 +10,7 @@
|
||||||
"ecto": {:hex, :ecto, "2.1.4", "d1ba932813ec0e0d9db481ef2c17777f1cefb11fc90fa7c142ff354972dfba7e", [:mix], [{:db_connection, "~> 1.1", [hex: :db_connection, optional: true]}, {:decimal, "~> 1.2", [hex: :decimal, optional: false]}, {:mariaex, "~> 0.8.0", [hex: :mariaex, optional: true]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, optional: true]}, {:poolboy, "~> 1.5", [hex: :poolboy, optional: false]}, {:postgrex, "~> 0.13.0", [hex: :postgrex, optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, optional: true]}]},
|
"ecto": {:hex, :ecto, "2.1.4", "d1ba932813ec0e0d9db481ef2c17777f1cefb11fc90fa7c142ff354972dfba7e", [:mix], [{:db_connection, "~> 1.1", [hex: :db_connection, optional: true]}, {:decimal, "~> 1.2", [hex: :decimal, optional: false]}, {:mariaex, "~> 0.8.0", [hex: :mariaex, optional: true]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, optional: true]}, {:poolboy, "~> 1.5", [hex: :poolboy, optional: false]}, {:postgrex, "~> 0.13.0", [hex: :postgrex, optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, optional: true]}]},
|
||||||
"elixir_make": {:hex, :elixir_make, "0.4.0", "992f38fabe705bb45821a728f20914c554b276838433349d4f2341f7a687cddf", [:mix], []},
|
"elixir_make": {:hex, :elixir_make, "0.4.0", "992f38fabe705bb45821a728f20914c554b276838433349d4f2341f7a687cddf", [:mix], []},
|
||||||
"ex_machina": {:hex, :ex_machina, "2.0.0", "ec284c6f57233729cea9319e083f66e613e82549f78eccdb2059aeba5d0df9f3", [:mix], [{:ecto, "~> 2.1", [hex: :ecto, optional: true]}]},
|
"ex_machina": {:hex, :ex_machina, "2.0.0", "ec284c6f57233729cea9319e083f66e613e82549f78eccdb2059aeba5d0df9f3", [:mix], [{:ecto, "~> 2.1", [hex: :ecto, optional: true]}]},
|
||||||
|
"exactor": {:hex, :exactor, "2.2.3", "a6972f43bb6160afeb73e1d8ab45ba604cd0ac8b5244c557093f6e92ce582786", [:mix], []},
|
||||||
"fs": {:hex, :fs, "2.12.0", "ad631efacc9a5683c8eaa1b274e24fa64a1b8eb30747e9595b93bec7e492e25e", [:rebar3], []},
|
"fs": {:hex, :fs, "2.12.0", "ad631efacc9a5683c8eaa1b274e24fa64a1b8eb30747e9595b93bec7e492e25e", [:rebar3], []},
|
||||||
"gettext": {:hex, :gettext, "0.13.1", "5e0daf4e7636d771c4c71ad5f3f53ba09a9ae5c250e1ab9c42ba9edccc476263", [:mix], []},
|
"gettext": {:hex, :gettext, "0.13.1", "5e0daf4e7636d771c4c71ad5f3f53ba09a9ae5c250e1ab9c42ba9edccc476263", [:mix], []},
|
||||||
"hackney": {:hex, :hackney, "1.7.1", "e238c52c5df3c3b16ce613d3a51c7220a784d734879b1e231c9babd433ac1cb4", [:rebar3], [{:certifi, "1.0.0", [hex: :certifi, optional: false]}, {:idna, "4.0.0", [hex: :idna, optional: false]}, {:metrics, "1.0.1", [hex: :metrics, optional: false]}, {:mimerl, "1.0.2", [hex: :mimerl, optional: false]}, {:ssl_verify_fun, "1.1.1", [hex: :ssl_verify_fun, optional: false]}]},
|
"hackney": {:hex, :hackney, "1.7.1", "e238c52c5df3c3b16ce613d3a51c7220a784d734879b1e231c9babd433ac1cb4", [:rebar3], [{:certifi, "1.0.0", [hex: :certifi, optional: false]}, {:idna, "4.0.0", [hex: :idna, optional: false]}, {:metrics, "1.0.1", [hex: :metrics, optional: false]}, {:mimerl, "1.0.2", [hex: :mimerl, optional: false]}, {:ssl_verify_fun, "1.1.1", [hex: :ssl_verify_fun, optional: false]}]},
|
||||||
|
|
|
@ -184,4 +184,10 @@ defp with_credentials(conn, username, password) do
|
||||||
header_content = "Basic " <> Base.encode64("#{username}:#{password}")
|
header_content = "Basic " <> Base.encode64("#{username}:#{password}")
|
||||||
put_req_header(conn, "authorization", header_content)
|
put_req_header(conn, "authorization", header_content)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
setup do
|
||||||
|
Supervisor.terminate_child(Pleroma.Supervisor, ConCache)
|
||||||
|
Supervisor.restart_child(Pleroma.Supervisor, ConCache)
|
||||||
|
:ok
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -190,4 +190,10 @@ test "it favorites a status, returns the updated status" do
|
||||||
|
|
||||||
assert status == ActivityRepresenter.to_map(updated_activity, %{user: activity_user, for: user})
|
assert status == ActivityRepresenter.to_map(updated_activity, %{user: activity_user, for: user})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
setup do
|
||||||
|
Supervisor.terminate_child(Pleroma.Supervisor, ConCache)
|
||||||
|
Supervisor.restart_child(Pleroma.Supervisor, ConCache)
|
||||||
|
:ok
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue