defmodule CLWiFi.SplashRouter do use Plug.Router plug :set_session_name plug :ensure_session_is_running plug :add_credentials plug :respond_to_request plug :match plug :dispatch match(_) do conn |> send_resp(404, "Not Found") end def set_session_name(%{private: %{development_mode: true}} = conn, _) do conn |> Plug.Conn.put_private(:connection, CLWiFi.Development.default_session_name()) end def set_session_name(%{query_params: %{"connection" => session_name}} = conn, _) do conn |> Plug.Conn.put_private(:connection, session_name) end def set_session_name(%{params: %{"location_id" => location_id, "mac" => mac_address}} = conn, _) do session_name = CLWiFi.Session.generate_session_name(location_id, mac_address) conn |> Plug.Conn.put_private(:connection, session_name) end def ensure_session_is_running(%{private: %{connection: session_name}} = conn, _opts) do case CLWiFi.Session.ensure_running(session_name) do :ok -> conn :error -> ExWeb.Errors.render(conn, 404) end end def add_credentials(%{private: %{connection: session_name}, params: %{"uamip" => router_ip, "uamport" => router_port, "challenge" => challenge}} = conn, _opts) do CLWiFi.Session.set_credentials(session_name, challenge, router_ip, router_port) conn end def add_credentials(conn, _opts) do conn end def respond_to_request(%{private: %{connection: session_name, development_mode: true}} = conn, _opts) do CLWiFi.Session.show_splash_page(session_name) CLWiFi.redirect_to(conn, Application.get_env(:cl_wifi, :start_path) || "/") end def respond_to_request(%{private: %{connection: session_name}, params: %{"res" => "notyet"}} = conn, _opts) do CLWiFi.Session.show_splash_page(session_name) CLWiFi.redirect_to(conn, Application.get_env(:cl_wifi, :start_path) || "/") end def respond_to_request(%{private: %{connection: session_name}, params: %{"res" => "success"}} = conn, _opts) do CLWiFi.redirect_to(conn, Application.get_env(:cl_wifi, :success_path) || "/success") end def respond_to_request(%{params: %{"res" => "failed"}} = conn, _opts) do CLWiFi.redirect_to(conn, Application.get_env(:cl_wifi, :failed_path) || "/failed") end def respond_to_request(%{params: %{"res" => _}} = conn, _opts) do CLWiFi.redirect_to(conn, Application.get_env(:cl_wifi, :success_path) || "/success") end end