diff --git a/apps/api/src/services/channel_hub.py b/apps/api/src/services/channel_hub.py index 4d61830c..facf0395 100644 --- a/apps/api/src/services/channel_hub.py +++ b/apps/api/src/services/channel_hub.py @@ -523,7 +523,7 @@ async def record_outbound_message( :redaction_version, CAST(:source_envelope AS jsonb), :provider_message_id, :send_status, NOW(), - CASE WHEN :send_status = 'sent' THEN NOW() ELSE NULL END, + CASE WHEN CAST(:send_status AS text) = 'sent' THEN NOW() ELSE NULL END, :triggered_by_state, :waiting_since ) RETURNING message_id diff --git a/apps/api/tests/test_channel_hub_grouped_alert_events.py b/apps/api/tests/test_channel_hub_grouped_alert_events.py index 230b3e75..44e23b4a 100644 --- a/apps/api/tests/test_channel_hub_grouped_alert_events.py +++ b/apps/api/tests/test_channel_hub_grouped_alert_events.py @@ -132,5 +132,5 @@ async def test_record_outbound_message_sets_sent_at_for_sent_messages() -> None: insert_statement = session.statements[-1] assert "sent_at" in insert_statement - assert "CASE WHEN :send_status = 'sent' THEN NOW() ELSE NULL END" in insert_statement + assert "CASE WHEN CAST(:send_status AS text) = 'sent' THEN NOW() ELSE NULL END" in insert_statement assert session.param_sets[-1]["send_status"] == "sent" diff --git a/docs/LOGBOOK.md b/docs/LOGBOOK.md index aceee09d..0a3d5209 100644 --- a/docs/LOGBOOK.md +++ b/docs/LOGBOOK.md @@ -7304,4 +7304,9 @@ python -m py_compile src/services/channel_hub.py src/services/telegram_gateway.p OK ``` +**production smoke 途中補修**: + +- rollback transaction smoke 抓到 asyncpg bind parameter 型別推論問題:`CASE WHEN :send_status = 'sent'` 會被推成 text/varchar ambiguous。 +- 已改成 `CASE WHEN CAST(:send_status AS text) = 'sent' THEN NOW() ELSE NULL END`,避免 outbound mirror 在 production 寫入時失敗。 + **目前整體進度**:約 69%。