defmodule MicrowavepropWeb.WeatherTileController do use MicrowavepropWeb, :controller alias Microwaveprop.Weather.MapLayers alias Microwaveprop.Weather.TileRenderer @spec show(Plug.Conn.t(), map()) :: Plug.Conn.t() def show(conn, %{"z" => z, "x" => x, "y" => y, "layer" => layer_id, "time" => time_param}) do with true <- MapLayers.valid_id?(layer_id), {z, ""} <- Integer.parse(z), {x, ""} <- Integer.parse(x), {y, ""} <- Integer.parse(y), {:ok, valid_time, _offset} <- DateTime.from_iso8601(time_param) do body = TileRenderer.render_svg(valid_time, layer_id, z, x, y) conn |> put_resp_content_type("image/svg+xml") |> put_resp_header("cache-control", "public, max-age=60") |> send_resp(200, body) else _ -> conn |> put_resp_content_type("image/svg+xml") |> put_resp_header("cache-control", "public, max-age=5") |> send_resp(200, TileRenderer.empty_svg()) end end end