philomena/lib/philomena_web/plugs/reload_user_plug.ex

59 lines
1.4 KiB
Elixir
Raw Normal View History

2019-11-17 13:18:21 -05:00
defmodule PhilomenaWeb.ReloadUserPlug do
2019-12-16 21:49:17 -05:00
alias Plug.Conn
2019-10-31 13:57:39 -04:00
alias Pow.Plug
2019-12-16 17:50:15 -05:00
alias Philomena.Users
2019-10-31 13:57:39 -04:00
2019-12-16 21:49:17 -05:00
alias Philomena.UserIps.UserIp
alias Philomena.UserFingerprints.UserFingerprint
alias Philomena.Repo
2019-12-17 00:44:24 -05:00
import Ecto.Query
2019-12-16 21:49:17 -05:00
2019-10-31 13:57:39 -04:00
def init(opts), do: opts
def call(conn, _opts) do
config = Plug.fetch_config(conn)
case Plug.current_user(conn, config) do
nil ->
conn
user ->
2019-12-16 21:49:17 -05:00
spawn fn -> update_usages(conn, user) end
2019-12-16 17:50:15 -05:00
reloaded_user = Users.get_by(id: user.id)
2019-10-31 13:57:39 -04:00
Plug.assign_current_user(conn, reloaded_user, config)
end
end
2019-12-16 21:49:17 -05:00
# TODO: move this to a background server instead of spawning
# off for every connection
defp update_usages(conn, user) do
conn = Conn.fetch_cookies(conn)
{:ok, ip} = EctoNetwork.INET.cast(conn.remote_ip)
fp = conn.cookies["_ses"]
if ip do
2019-12-17 00:44:24 -05:00
update = update(UserIp, inc: [uses: 1], set: [updated_at: fragment("now()")])
2019-12-16 21:49:17 -05:00
Repo.insert_all(
UserIp,
[%{user_id: user.id, ip: ip, uses: 1}],
conflict_target: [:user_id, :ip],
2019-12-17 00:44:24 -05:00
on_conflict: update
2019-12-16 21:49:17 -05:00
)
end
if fp do
2019-12-17 00:44:24 -05:00
update = update(UserFingerprint, inc: [uses: 1], set: [updated_at: fragment("now()")])
2019-12-16 21:49:17 -05:00
Repo.insert_all(
UserFingerprint,
[%{user_id: user.id, fingerprint: fp, uses: 1}],
conflict_target: [:user_id, :fingerprint],
2019-12-17 00:44:24 -05:00
on_conflict: update
2019-12-16 21:49:17 -05:00
)
end
end
2019-12-16 17:50:15 -05:00
end