diff --git a/CHANGELOG.md b/CHANGELOG.md index dc33563..cdade52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Weather queries now use indexed `has_weather` column - Spatial queries optimized with geography cast index +### Fixed +- PostgreSQL notify trigger now sends all required fields for info page updates +- Info page real-time updates now display all packet details correctly + ## [0.2.0] - 2025-07-26 ### Added diff --git a/docs/improvement-todos.md b/docs/improvement-todos.md index 8d70c68..9c59f3b 100644 --- a/docs/improvement-todos.md +++ b/docs/improvement-todos.md @@ -76,6 +76,16 @@ This document tracks potential improvements identified during the multi-replica - Weather queries: ~2-3ms - Distinct callsign queries: ~4ms +### ✅ Fix PostgreSQL Notification Trigger for Info Page Updates (2025-07-28) +- **Status**: Completed +- **Impact**: High - Fix real-time updates on info pages +- **Implementation**: + - Updated `notify_packets_insert` trigger to send all required fields + - Previously only sent: id, sender, lat, lon, inserted_at + - Now includes: altitude, course, speed, symbol data, device info, PHG data, etc. + - Info page (/info/:callsign) now updates in real-time with complete packet data + - Ensures all UI elements refresh properly when new packets arrive + ### 3. Add Metrics and Monitoring with Prometheus - **Status**: Pending - **Impact**: High - Production visibility diff --git a/priv/repo/migrations/20250728225530_update_notify_packets_insert_with_all_fields.exs b/priv/repo/migrations/20250728225530_update_notify_packets_insert_with_all_fields.exs new file mode 100644 index 0000000..b71870c --- /dev/null +++ b/priv/repo/migrations/20250728225530_update_notify_packets_insert_with_all_fields.exs @@ -0,0 +1,80 @@ +defmodule Aprsme.Repo.Migrations.UpdateNotifyPacketsInsertWithAllFields do + use Ecto.Migration + + def up do + # Drop existing trigger and function + execute "DROP TRIGGER IF EXISTS packets_notify_insert ON packets;" + execute "DROP FUNCTION IF EXISTS notify_packets_insert();" + + # Create updated function that includes all fields needed by the info page + execute """ + CREATE OR REPLACE FUNCTION notify_packets_insert() RETURNS trigger AS $$ + DECLARE + payload TEXT; + BEGIN + payload := json_build_object( + 'id', NEW.id, + 'sender', NEW.sender, + 'lat', NEW.lat, + 'lon', NEW.lon, + 'altitude', NEW.altitude, + 'course', NEW.course, + 'speed', NEW.speed, + 'symbol_table_id', NEW.symbol_table_id, + 'symbol_code', NEW.symbol_code, + 'device_identifier', NEW.device_identifier, + 'path', NEW.path, + 'received_at', NEW.received_at, + 'comment', NEW.comment, + 'raw_packet', NEW.raw_packet, + 'phg_power', NEW.phg_power, + 'phg_height', NEW.phg_height, + 'phg_gain', NEW.phg_gain, + 'phg_directivity', NEW.phg_directivity, + 'inserted_at', NEW.inserted_at + )::text; + PERFORM pg_notify('aprs_packets', payload); + RETURN NEW; + END; + $$ LANGUAGE plpgsql; + """ + + # Recreate trigger + execute """ + CREATE TRIGGER packets_notify_insert + AFTER INSERT ON packets + FOR EACH ROW EXECUTE FUNCTION notify_packets_insert(); + """ + end + + def down do + # Drop updated trigger and function + execute "DROP TRIGGER IF EXISTS packets_notify_insert ON packets;" + execute "DROP FUNCTION IF EXISTS notify_packets_insert();" + + # Restore previous version with minimal fields + execute """ + CREATE OR REPLACE FUNCTION notify_packets_insert() RETURNS trigger AS $$ + DECLARE + payload TEXT; + BEGIN + payload := json_build_object( + 'id', NEW.id, + 'sender', NEW.sender, + 'lat', NEW.lat, + 'lon', NEW.lon, + 'inserted_at', NEW.inserted_at + )::text; + PERFORM pg_notify('aprs_packets', payload); + RETURN NEW; + END; + $$ LANGUAGE plpgsql; + """ + + execute """ + CREATE TRIGGER packets_notify_insert + AFTER INSERT ON packets + FOR EACH ROW EXECUTE FUNCTION notify_packets_insert(); + """ + end +end