diff --git a/lib/aprsme/cluster/leader_election.ex b/lib/aprsme/cluster/leader_election.ex index c303091..3b94689 100644 --- a/lib/aprsme/cluster/leader_election.ex +++ b/lib/aprsme/cluster/leader_election.ex @@ -71,16 +71,16 @@ defmodule Aprsme.Cluster.LeaderElection do else connected_nodes = Node.list() - if length(connected_nodes) > 0 do - Logger.info("Cluster formed with #{length(connected_nodes)} other nodes: #{inspect(connected_nodes)}") - Logger.info("Proceeding with leader election") - Process.send_after(self(), :attempt_election, 100) - {:noreply, %{state | election_forced: true}} - else + if connected_nodes == [] do Logger.debug("Cluster not yet formed - waiting...") # Check again in 2 seconds Process.send_after(self(), :check_cluster_and_elect, 2_000) {:noreply, state} + else + Logger.info("Cluster formed with #{length(connected_nodes)} other nodes: #{inspect(connected_nodes)}") + Logger.info("Proceeding with leader election") + Process.send_after(self(), :attempt_election, 100) + {:noreply, %{state | election_forced: true}} end end end @@ -91,7 +91,7 @@ defmodule Aprsme.Cluster.LeaderElection do if not state.election_forced and not state.is_leader do connected_nodes = Node.list() - if length(connected_nodes) == 0 do + if connected_nodes == [] do Logger.warning( "Cluster formation timeout reached after #{@max_cluster_wait}ms with no connected nodes. " <> "Proceeding with leader election in single-node mode to ensure APRS-IS connection." diff --git a/lib/aprsme/packet_consumer.ex b/lib/aprsme/packet_consumer.ex index c6c5548..56ee3c6 100644 --- a/lib/aprsme/packet_consumer.ex +++ b/lib/aprsme/packet_consumer.ex @@ -308,7 +308,7 @@ defmodule Aprsme.PacketConsumer do Logger.error("Batch insert failed: #{inspect(error)}") # Log sample packet to help debug field issues - if length(valid_packets) > 0 do + if valid_packets != [] do sample_packet = List.first(valid_packets) Logger.error("Sample packet fields: #{inspect(Map.keys(sample_packet))}") Logger.error("Sample packet data: #{inspect(sample_packet)}") diff --git a/lib/aprsme/packet_producer.ex b/lib/aprsme/packet_producer.ex index f8ce11c..6f566b7 100644 --- a/lib/aprsme/packet_producer.ex +++ b/lib/aprsme/packet_producer.ex @@ -45,7 +45,7 @@ defmodule Aprsme.PacketProducer do end end - defp dispatch_events(buffer, demand) when demand > 0 and length(buffer) > 0 do + defp dispatch_events(buffer, demand) when demand > 0 and buffer != [] do {events, remaining} = Enum.split(buffer, demand) {events, remaining, demand - length(events)} end diff --git a/lib/aprsme_web/channels/mobile_channel.ex b/lib/aprsme_web/channels/mobile_channel.ex index 9dc15fb..74a971b 100644 --- a/lib/aprsme_web/channels/mobile_channel.ex +++ b/lib/aprsme_web/channels/mobile_channel.ex @@ -52,6 +52,8 @@ defmodule AprsmeWeb.MobileChannel do """ use AprsmeWeb, :channel + alias AprsmeWeb.MapLive.MapHelpers + require Logger @impl true @@ -277,7 +279,7 @@ defmodule AprsmeWeb.MobileChannel do defp build_mobile_packet(packet) do # Extract coordinates - {lat, lon, _data_extended} = AprsmeWeb.MapLive.MapHelpers.get_coordinates(packet) + {lat, lon, _data_extended} = MapHelpers.get_coordinates(packet) # Build minimal packet data for mobile %{ @@ -465,7 +467,7 @@ defmodule AprsmeWeb.MobileChannel do Logger.info("Loaded #{length(packets)} historical packets for callsign #{callsign}") # Send historical packets to client - if length(packets) > 0 do + if packets != [] do Enum.each(packets, fn packet -> packet_data = build_mobile_packet(packet) push(socket, "packet", packet_data) diff --git a/lib/aprsme_web/controllers/page_controller.ex b/lib/aprsme_web/controllers/page_controller.ex index 67ec5f3..c0ece15 100644 --- a/lib/aprsme_web/controllers/page_controller.ex +++ b/lib/aprsme_web/controllers/page_controller.ex @@ -2,6 +2,8 @@ defmodule AprsmeWeb.PageController do @moduledoc false use AprsmeWeb, :controller + alias Aprsme.Cluster.LeaderElection + def home(conn, _params) do render(conn, :home) end @@ -80,7 +82,7 @@ defmodule AprsmeWeb.PageController do def status_json(conn, _params) do # Get cluster-wide APRS-IS connection status - aprs_status = Aprsme.Cluster.LeaderElection.get_cluster_aprs_status() + aprs_status = LeaderElection.get_cluster_aprs_status() # Get application version version = :aprsme |> Application.spec(:vsn) |> List.to_string() diff --git a/lib/aprsme_web/live/map_live/data_builder.ex b/lib/aprsme_web/live/map_live/data_builder.ex index a914e7f..17ff459 100644 --- a/lib/aprsme_web/live/map_live/data_builder.ex +++ b/lib/aprsme_web/live/map_live/data_builder.ex @@ -139,7 +139,7 @@ defmodule AprsmeWeb.MapLive.DataBuilder do defp valid_coordinates?(_, _), do: false - defp is_finite(n) when is_float(n), do: n != :infinity and n != :neg_infinity and n == n + defp is_finite(n) when is_float(n), do: n != :infinity and n != :neg_infinity defp is_finite(n) when is_integer(n), do: true @doc """ diff --git a/lib/aprsme_web/live/map_live/historical_loader.ex b/lib/aprsme_web/live/map_live/historical_loader.ex index 5268731..fbbec32 100644 --- a/lib/aprsme_web/live/map_live/historical_loader.ex +++ b/lib/aprsme_web/live/map_live/historical_loader.ex @@ -6,8 +6,10 @@ defmodule AprsmeWeb.MapLive.HistoricalLoader do import Phoenix.Component, only: [assign: 3] alias Aprsme.Packets + alias AprsmeWeb.Live.Shared.CoordinateUtils alias AprsmeWeb.Live.Shared.PacketUtils, as: SharedPacketUtils alias AprsmeWeb.MapLive.DataBuilder + alias AprsmeWeb.MapLive.RfPath alias Phoenix.LiveView alias Phoenix.LiveView.Socket @@ -219,7 +221,7 @@ defmodule AprsmeWeb.MapLive.HistoricalLoader do # Filter out packets with invalid coordinates before processing valid_packets = Enum.filter(historical_packets, fn packet -> - {lat, lon, _} = AprsmeWeb.Live.Shared.CoordinateUtils.get_coordinates(packet) + {lat, lon, _} = CoordinateUtils.get_coordinates(packet) is_number(lat) and is_number(lon) and lat >= -90 and lat <= 90 and lon >= -180 and lon <= 180 and @@ -416,7 +418,7 @@ defmodule AprsmeWeb.MapLive.HistoricalLoader do packets |> Enum.flat_map(fn packet -> path = Map.get(packet, :path, "") - AprsmeWeb.MapLive.RfPath.parse_rf_path(path) + RfPath.parse_rf_path(path) end) |> Enum.uniq() |> Enum.reject(&(&1 == "")) @@ -431,6 +433,6 @@ defmodule AprsmeWeb.MapLive.HistoricalLoader do socket end - defp is_finite(n) when is_float(n), do: n != :infinity and n != :neg_infinity and n == n + defp is_finite(n) when is_float(n), do: n != :infinity and n != :neg_infinity defp is_finite(n) when is_integer(n), do: true end diff --git a/lib/aprsme_web/live/map_live/index.ex b/lib/aprsme_web/live/map_live/index.ex index 87c17ea..d0e0802 100644 --- a/lib/aprsme_web/live/map_live/index.ex +++ b/lib/aprsme_web/live/map_live/index.ex @@ -428,14 +428,14 @@ defmodule AprsmeWeb.MapLive.Index do # Send event to draw the RF path lines socket = - if length(path_station_positions) > 0 do + if path_station_positions == [] do + socket + else push_event(socket, "draw_rf_path", %{ station_lat: lat_float, station_lng: lng_float, path_stations: path_station_positions }) - else - socket end {:noreply, socket} diff --git a/lib/aprsme_web/user_auth.ex b/lib/aprsme_web/user_auth.ex index 208cc9a..1c953be 100644 --- a/lib/aprsme_web/user_auth.ex +++ b/lib/aprsme_web/user_auth.ex @@ -28,7 +28,7 @@ defmodule AprsmeWeb.UserAuth do disconnected on log out. The line can be safely removed if you are not using LiveView. """ - @spec log_in_user(Plug.Conn.t(), %Aprsme.Accounts.User{}, map()) :: Plug.Conn.t() + @spec log_in_user(Plug.Conn.t(), Aprsme.Accounts.User.t(), map()) :: Plug.Conn.t() def log_in_user(conn, user, params \\ %{}) do token = Accounts.generate_user_session_token(user) user_return_to = get_session(conn, :user_return_to) diff --git a/test/aprsme/packets/clustering_test.exs b/test/aprsme/packets/clustering_test.exs index d95afdd..fa5b932 100644 --- a/test/aprsme/packets/clustering_test.exs +++ b/test/aprsme/packets/clustering_test.exs @@ -24,7 +24,7 @@ defmodule Aprsme.Packets.ClusteringTest do result = Clustering.cluster_packets(packets, 7, %{}) assert {:heat_map, clusters} = result assert is_list(clusters) - assert length(clusters) > 0 + assert clusters != [] end test "returns clustered data when zoom level is 8 or less" do @@ -37,7 +37,7 @@ defmodule Aprsme.Packets.ClusteringTest do result = Clustering.cluster_packets(packets, 7, %{}) assert {:heat_map, clusters} = result assert is_list(clusters) - assert length(clusters) > 0 + assert clusters != [] # Check cluster structure [first_cluster | _] = clusters diff --git a/test/aprsme/packets_test.exs b/test/aprsme/packets_test.exs index 556c9c8..2909dfd 100644 --- a/test/aprsme/packets_test.exs +++ b/test/aprsme/packets_test.exs @@ -339,7 +339,7 @@ defmodule Aprsme.PacketsTest do test "returns stations ordered by distance", %{stations: _stations} do results = Packets.get_nearby_stations(39.0, -98.0) - assert length(results) > 0 + assert results != [] # Results should be ordered by distance [first | _] = results assert first.sender in ["NEAR1", "NEAR2"]