- accounts.ex: replace validate_user_password (if-based) with with-chain;
drop unnecessary try/rescue around Repo.get_by. Extract transaction_unwrap
helper to eliminate 3 copies of the Multi result-unwrap case block.
- packets.ex: deduplicate store_bad_packet by extracting raw_packet_string,
extract_error_type, and extract_error_message into composable helpers.
Normalize find_coordinate_value — collapse 12 clauses into a generic
deep_get/direct_get that handles atom/string keys and nested maps uniformly.
- data_builder.ex: split build_simple_popup into separate data-construction
(build_simple_popup_data) and rendering (render_popup) phases, eliminating
duplicated PopupComponent/Safe/IO pipelines.
- param_utils.ex: unify parse_float_in_range and parse_int_in_range via a
shared parse_in_range that accepts Float.parse/Integer.parse as a function
parameter — functions-as-values pattern.
- Update 9 Hex packages (bandit, credo, finch, phoenix, phoenix_live_view,
plug, req, swoosh, tidewave)
- Load bad_packets data unconditionally in mount/3 so crawlers and link
previews see content instead of an empty page
- Fix Accounts doctests: use concrete values instead of unbound variables,
disable illustrative doctests broken by Elixir 1.20.2 strictness
Users could register duplicate callsigns with different casing (e.g.,
"w1aw" and "W1AW") because the database unique index was case-sensitive.
Additionally, live validation showed false "already taken" errors on
every keystroke.
Changes:
- Add case-insensitive unique index using lower(callsign)
- Skip callsign uniqueness validation during live form changes
- Add test verifying case-insensitive uniqueness enforcement
This commit addresses two major areas:
1. Crash Prevention & Error Handling:
- Added error handling to all database queries to prevent crashes
- Implemented circuit breaker pattern for APRS-IS connection
- Added timeouts to all Redis operations (5 second timeout)
- Fixed unsafe pattern matches that could cause MatchError crashes
- Added try/rescue blocks around background tasks
- Improved socket operation error handling with proper cleanup
- Enhanced packet cleanup worker with comprehensive error handling
2. RF Path Station Markers:
- Fixed issue where digipeater/iGate icons weren't shown when searching for callsigns
- Now loads and displays position markers for all stations in the RF path
- Extracts RF path stations from tracked callsign packets
- Fetches latest position for each digipeater/iGate
- Properly displays complete RF path visualization with station positions
Technical details:
- Added Process.alive? checks before sending messages
- Fixed resource cleanup in terminate functions
- Added proper error handling to File.read operations
- Implemented safe wrapper for ShutdownHandler health checks
- All changes ensure the app continues running even when errors occur
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>