diff --git a/lib/microwaveprop/beacons/beacon.ex b/lib/microwaveprop/beacons/beacon.ex index 1db1bb3d..6b4b0f96 100644 --- a/lib/microwaveprop/beacons/beacon.ex +++ b/lib/microwaveprop/beacons/beacon.ex @@ -2,7 +2,7 @@ defmodule Microwaveprop.Beacons.Beacon do @moduledoc """ A beacon transmitter. Frequency in MHz, coordinates as lat/lon, grid as Maidenhead (auto-computed from lat/lon when not supplied), - power in watts, height above ground in meters. + power in milliwatts, height above ground in meters. """ use Ecto.Schema @@ -19,22 +19,22 @@ defmodule Microwaveprop.Beacons.Beacon do field :grid, :string field :lat, :float field :lon, :float - field :power_watts, :float + field :power_mw, :float field :height_m, :float field :user_id, :binary_id timestamps(type: :utc_datetime) end - @required_fields [:frequency_mhz, :callsign, :lat, :lon, :power_watts, :height_m] + @required_fields [:frequency_mhz, :callsign, :lat, :lon, :power_mw, :height_m] def changeset(beacon, attrs) do beacon - |> cast(attrs, [:frequency_mhz, :callsign, :grid, :lat, :lon, :power_watts, :height_m]) + |> cast(attrs, [:frequency_mhz, :callsign, :grid, :lat, :lon, :power_mw, :height_m]) |> update_change(:callsign, fn cs -> cs && String.upcase(String.trim(cs)) end) |> validate_required(@required_fields) |> validate_number(:frequency_mhz, greater_than: 0) - |> validate_number(:power_watts, greater_than_or_equal_to: 0) + |> validate_number(:power_mw, greater_than_or_equal_to: 0) |> validate_number(:height_m, greater_than_or_equal_to: 0) |> validate_number(:lat, greater_than_or_equal_to: -90, less_than_or_equal_to: 90) |> validate_number(:lon, greater_than_or_equal_to: -180, less_than_or_equal_to: 180) diff --git a/lib/microwaveprop_web/controllers/user_settings_html/edit.html.heex b/lib/microwaveprop_web/controllers/user_settings_html/edit.html.heex index ab1ccae6..f6521d39 100644 --- a/lib/microwaveprop_web/controllers/user_settings_html/edit.html.heex +++ b/lib/microwaveprop_web/controllers/user_settings_html/edit.html.heex @@ -64,18 +64,20 @@ as={:beacon_monitor} action={~p"/users/beacon-monitors"} id="create_beacon_monitor" - class="flex items-end gap-2" > -
- <.input - field={f[:name]} + +
+ + <.button variant="primary" phx-disable-with="Adding...">Add monitor
- <.button variant="primary" phx-disable-with="Adding...">Add monitor <%= if @beacon_monitors == [] do %> diff --git a/lib/microwaveprop_web/live/beacon_live/form.ex b/lib/microwaveprop_web/live/beacon_live/form.ex index 516a8fc1..ebe63a67 100644 --- a/lib/microwaveprop_web/live/beacon_live/form.ex +++ b/lib/microwaveprop_web/live/beacon_live/form.ex @@ -27,9 +27,9 @@ defmodule MicrowavepropWeb.BeaconLive.Form do <.input field={@form[:lat]} type="number" label="Latitude" step="any" required /> <.input field={@form[:lon]} type="number" label="Longitude" step="any" required /> <.input - field={@form[:power_watts]} + field={@form[:power_mw]} type="number" - label="Power (W)" + label="Power (mW)" step="any" required /> diff --git a/lib/microwaveprop_web/live/beacon_live/index.ex b/lib/microwaveprop_web/live/beacon_live/index.ex index 5ee6880c..34060ca0 100644 --- a/lib/microwaveprop_web/live/beacon_live/index.ex +++ b/lib/microwaveprop_web/live/beacon_live/index.ex @@ -28,7 +28,7 @@ defmodule MicrowavepropWeb.BeaconLive.Index do <:col :let={{_id, beacon}} label="Grid">{beacon.grid} <:col :let={{_id, beacon}} label="Lat">{beacon.lat} <:col :let={{_id, beacon}} label="Lon">{beacon.lon} - <:col :let={{_id, beacon}} label="Power (W)">{beacon.power_watts} + <:col :let={{_id, beacon}} label="Power (mW)">{beacon.power_mw} <:col :let={{_id, beacon}} label="Height AGL (m)">{beacon.height_m} <:action :let={{_id, beacon}}>
diff --git a/lib/microwaveprop_web/live/beacon_live/show.ex b/lib/microwaveprop_web/live/beacon_live/show.ex index fb627ae8..48c6d8de 100644 --- a/lib/microwaveprop_web/live/beacon_live/show.ex +++ b/lib/microwaveprop_web/live/beacon_live/show.ex @@ -32,7 +32,7 @@ defmodule MicrowavepropWeb.BeaconLive.Show do <:item title="Grid">{@beacon.grid} <:item title="Latitude">{@beacon.lat} <:item title="Longitude">{@beacon.lon} - <:item title="Power (W)">{@beacon.power_watts} + <:item title="Power (mW)">{@beacon.power_mw} <:item title="Height above ground (m)">{@beacon.height_m} diff --git a/lib/microwaveprop_web/user_auth.ex b/lib/microwaveprop_web/user_auth.ex index 2c782ac1..56c64951 100644 --- a/lib/microwaveprop_web/user_auth.ex +++ b/lib/microwaveprop_web/user_auth.ex @@ -209,7 +209,7 @@ defmodule MicrowavepropWeb.UserAuth do Plug for routes that require sudo mode. """ def require_sudo_mode(conn, _opts) do - if Accounts.sudo_mode?(conn.assigns.current_scope.user, -10) do + if Accounts.sudo_mode?(conn.assigns.current_scope.user, -60 * 24) do conn else conn diff --git a/priv/repo/migrations/20260408174251_rename_beacon_power_to_mw.exs b/priv/repo/migrations/20260408174251_rename_beacon_power_to_mw.exs new file mode 100644 index 00000000..0f140a83 --- /dev/null +++ b/priv/repo/migrations/20260408174251_rename_beacon_power_to_mw.exs @@ -0,0 +1,13 @@ +defmodule Microwaveprop.Repo.Migrations.RenameBeaconPowerToMw do + use Ecto.Migration + + def up do + rename table(:beacons), :power_watts, to: :power_mw + execute "UPDATE beacons SET power_mw = power_mw * 1000" + end + + def down do + execute "UPDATE beacons SET power_mw = power_mw / 1000" + rename table(:beacons), :power_mw, to: :power_watts + end +end diff --git a/test/microwaveprop/beacons_test.exs b/test/microwaveprop/beacons_test.exs index cf8d32b1..e548e0d8 100644 --- a/test/microwaveprop/beacons_test.exs +++ b/test/microwaveprop/beacons_test.exs @@ -13,7 +13,7 @@ defmodule Microwaveprop.BeaconsTest do grid: nil, lat: nil, lon: nil, - power_watts: nil, + power_mw: nil, height_m: nil } @@ -45,7 +45,7 @@ defmodule Microwaveprop.BeaconsTest do assert beacon.callsign == "W5HN" assert beacon.lat == attrs.lat assert beacon.lon == attrs.lon - assert beacon.power_watts == attrs.power_watts + assert beacon.power_mw == attrs.power_mw assert beacon.height_m == attrs.height_m assert beacon.user_id == user.id end @@ -98,11 +98,11 @@ defmodule Microwaveprop.BeaconsTest do user = user_fixture() beacon = beacon_fixture(user) - update_attrs = %{frequency_mhz: 24_192.1, power_watts: 5.0} + update_attrs = %{frequency_mhz: 24_192.1, power_mw: 5.0} assert {:ok, %Beacon{} = beacon} = Beacons.update_beacon(beacon, update_attrs) assert beacon.frequency_mhz == 24_192.1 - assert beacon.power_watts == 5.0 + assert beacon.power_mw == 5.0 end test "with invalid data returns error changeset" do diff --git a/test/microwaveprop_web/controllers/user_settings_controller_test.exs b/test/microwaveprop_web/controllers/user_settings_controller_test.exs index fea1ad4e..22eb96e9 100644 --- a/test/microwaveprop_web/controllers/user_settings_controller_test.exs +++ b/test/microwaveprop_web/controllers/user_settings_controller_test.exs @@ -20,7 +20,7 @@ defmodule MicrowavepropWeb.UserSettingsControllerTest do assert redirected_to(conn) == ~p"/users/log-in" end - @tag token_authenticated_at: DateTime.add(DateTime.utc_now(:second), -11, :minute) + @tag token_authenticated_at: DateTime.add(DateTime.utc_now(:second), -25, :hour) test "redirects if user is not in sudo mode", %{conn: conn} do conn = get(conn, ~p"/users/settings") assert redirected_to(conn) == ~p"/users/log-in" diff --git a/test/microwaveprop_web/live/beacon_live_test.exs b/test/microwaveprop_web/live/beacon_live_test.exs index 3d27dbf8..9cc5ff0c 100644 --- a/test/microwaveprop_web/live/beacon_live_test.exs +++ b/test/microwaveprop_web/live/beacon_live_test.exs @@ -84,7 +84,7 @@ defmodule MicrowavepropWeb.BeaconLiveTest do assert {:ok, _view, html} = form_live - |> form("#beacon-form", beacon: %{power_watts: 25.0}) + |> form("#beacon-form", beacon: %{power_mw: 25_000.0}) |> render_submit() |> follow_redirect(conn, ~p"/beacons") diff --git a/test/microwaveprop_web/user_auth_test.exs b/test/microwaveprop_web/user_auth_test.exs index 1d2f7ba6..1729f20c 100644 --- a/test/microwaveprop_web/user_auth_test.exs +++ b/test/microwaveprop_web/user_auth_test.exs @@ -186,7 +186,7 @@ defmodule MicrowavepropWeb.UserAuthTest do end describe "require_sudo_mode/2" do - test "allows users that have authenticated in the last 10 minutes", %{conn: conn, user: user} do + test "allows users that have authenticated in the last 24 hours", %{conn: conn, user: user} do conn = conn |> fetch_flash() @@ -198,8 +198,8 @@ defmodule MicrowavepropWeb.UserAuthTest do end test "redirects when authentication is too old", %{conn: conn, user: user} do - eleven_minutes_ago = :second |> DateTime.utc_now() |> DateTime.add(-11, :minute) - user = %{user | authenticated_at: eleven_minutes_ago} + too_long_ago = :second |> DateTime.utc_now() |> DateTime.add(-25, :hour) + user = %{user | authenticated_at: too_long_ago} user_token = Accounts.generate_user_session_token(user) {user, token_inserted_at} = Accounts.get_user_by_session_token(user_token) assert DateTime.after?(token_inserted_at, user.authenticated_at) diff --git a/test/support/fixtures/beacons_fixtures.ex b/test/support/fixtures/beacons_fixtures.ex index 131f7f04..a1606815 100644 --- a/test/support/fixtures/beacons_fixtures.ex +++ b/test/support/fixtures/beacons_fixtures.ex @@ -11,7 +11,7 @@ defmodule Microwaveprop.BeaconsFixtures do callsign: "W5HN", lat: 32.897, lon: -97.038, - power_watts: 10.0, + power_mw: 10_000.0, height_m: 30.0 }) end