towerops/lib/towerops_web/plugs/capture_timezone.ex

37 lines
1.3 KiB
Elixir

defmodule ToweropsWeb.Plugs.CaptureTimezone do
@moduledoc """
Captures the cf-timezone header from Cloudflare and stores it in session.
Cloudflare provides timezone detection via the cf-timezone header using
IANA timezone database format (e.g., "America/Chicago", "Europe/London").
Falls back to "UTC" if the header is not present (development, non-Cloudflare).
"""
import Plug.Conn
@doc false
def init(opts), do: opts
@doc false
def call(conn, _opts) do
case get_req_header(conn, "cf-timezone") do
[tz] when is_binary(tz) and byte_size(tz) > 0 ->
# Cloudflare header present - use it
put_session(conn, :detected_timezone, tz)
_ ->
# No Cloudflare header - only set if not already in session (allows test mocking)
# Check both atom and string keys since session keys may be converted by Phoenix
existing_tz = get_session(conn, :detected_timezone) || get_session(conn, "detected_timezone")
if existing_tz do
# Already set (possibly by test setup) - don't overwrite
# But ensure it's stored with atom key for consistency
put_session(conn, :detected_timezone, existing_tz)
else
# Not set - default to UTC
put_session(conn, :detected_timezone, "UTC")
end
end
end
end