last_seen_plug.ex 772 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. defmodule PlausibleWeb.LastSeenPlug do
  2. import Plug.Conn
  3. use Plausible.Repo
  4. @one_hour 60 * 60
  5. def init(opts) do
  6. opts
  7. end
  8. def call(conn, _opts) do
  9. last_seen = get_session(conn, :last_seen)
  10. user = conn.assigns[:current_user]
  11. cond do
  12. user && last_seen && last_seen < unix_now() - @one_hour ->
  13. persist_last_seen(user)
  14. put_session(conn, :last_seen, unix_now())
  15. user && !last_seen ->
  16. put_session(conn, :last_seen, unix_now())
  17. true ->
  18. conn
  19. end
  20. end
  21. defp persist_last_seen(user) do
  22. q = from(u in Plausible.Auth.User, where: u.id == ^user.id)
  23. Repo.update_all(q, set: [last_seen: DateTime.utc_now()])
  24. end
  25. defp unix_now do
  26. DateTime.utc_now() |> DateTime.to_unix()
  27. end
  28. end