Fix DateTime.to_iso8601 error by handling NaiveDateTime

- Handle both DateTime and NaiveDateTime structs from database
- Convert NaiveDateTime to UTC DateTime before formatting
- Add fallback for string timestamps
- Fixes FunctionClauseError when processing packets
This commit is contained in:
Graham McIntire 2025-07-29 10:57:36 -05:00
parent d389db4c7d
commit 887c35a1c8
No known key found for this signature in database
2 changed files with 22 additions and 8 deletions

View file

@ -195,14 +195,28 @@ defmodule AprsmeWeb.Live.Shared.PacketUtils do
"""
@spec get_timestamp(map()) :: String.t()
def get_timestamp(packet) do
cond do
Map.has_key?(packet, :received_at) && packet.received_at ->
DateTime.to_iso8601(packet.received_at)
received_at = Map.get(packet, :received_at) || Map.get(packet, "received_at")
Map.has_key?(packet, "received_at") && packet["received_at"] ->
DateTime.to_iso8601(packet["received_at"])
case received_at do
nil ->
""
true ->
%DateTime{} = dt ->
DateTime.to_iso8601(dt)
%NaiveDateTime{} = ndt ->
ndt
|> DateTime.from_naive!("Etc/UTC")
|> DateTime.to_iso8601()
timestamp when is_binary(timestamp) ->
# If it's already a string, try to parse and reformat it
case DateTime.from_iso8601(timestamp) do
{:ok, dt, _} -> DateTime.to_iso8601(dt)
_ -> timestamp
end
_ ->
""
end
end

View file

@ -45,7 +45,7 @@ defmodule Aprsme.Repo.Migrations.FixPacketNotifyTrigger do
'rain_24h', NEW.rain_24h,
'rain_midnight', NEW.rain_midnight,
'luminosity', NEW.luminosity,
'snow_24h', NEW.snow_24h,
'snow', NEW.snow,
'has_weather', NEW.has_weather,
'inserted_at', NEW.inserted_at
)::text;
@ -113,7 +113,7 @@ defmodule Aprsme.Repo.Migrations.FixPacketNotifyTrigger do
'rain_24h', NEW.rain_24h,
'rain_midnight', NEW.rain_midnight,
'luminosity', NEW.luminosity,
'snow_24h', NEW.snow_24h,
'snow', NEW.snow,
'has_weather', NEW.has_weather,
'inserted_at', NEW.inserted_at
)::text;