Fix API count decoding
Some checks failed
Build and Deploy / build-push-deploy (push) Has been cancelled

This commit is contained in:
2026-06-15 15:49:03 +02:00
parent 5c13de1b8f
commit 5101eb5c73
3 changed files with 35 additions and 6 deletions

View File

@@ -27,7 +27,7 @@ checkRateLimitAndLog ::
checkRateLimitAndLog consumer endpoint method = do checkRateLimitAndLog consumer endpoint method = do
-- Check rate limit: requests in last 60 seconds -- Check rate limit: requests in last 60 seconds
rows1 <- sqlQuery rows1 <- sqlQuery
"SELECT COUNT(*) FROM api_request_log \ "SELECT COUNT(*)::int FROM api_request_log \
\WHERE api_consumer_id = ? AND requested_at >= NOW() - INTERVAL '60 seconds'" \WHERE api_consumer_id = ? AND requested_at >= NOW() - INTERVAL '60 seconds'"
(Only consumer.id) (Only consumer.id)
let reqCount = case rows1 of let reqCount = case rows1 of
@@ -43,7 +43,7 @@ checkRateLimitAndLog consumer endpoint method = do
-- Check daily quota -- Check daily quota
rows2 <- sqlQuery rows2 <- sqlQuery
"SELECT COUNT(*) FROM api_request_log \ "SELECT COUNT(*)::int FROM api_request_log \
\WHERE api_consumer_id = ? AND requested_at >= ? - INTERVAL '1 day'" \WHERE api_consumer_id = ? AND requested_at >= ? - INTERVAL '1 day'"
(consumer.id, consumer.quotaResetsAt) (consumer.id, consumer.quotaResetsAt)
let quotaUsed = case rows2 of let quotaUsed = case rows2 of

View File

@@ -12,7 +12,7 @@ validateWidgetType ::
Text -> IO (Either Text ()) Text -> IO (Either Text ())
validateWidgetType name = do validateWidgetType name = do
rows <- sqlQuery rows <- sqlQuery
"SELECT COUNT(*) FROM widget_type_registry WHERE name = ? AND status = 'active'" "SELECT COUNT(*)::int FROM widget_type_registry WHERE name = ? AND status = 'active'"
(Only name) (Only name)
case rows of case rows of
[Only (n :: Int)] | n > 0 -> pure (Right ()) [Only (n :: Int)] | n > 0 -> pure (Right ())
@@ -24,7 +24,7 @@ validateEventType ::
Text -> IO (Either Text ()) Text -> IO (Either Text ())
validateEventType name = do validateEventType name = do
rows <- sqlQuery rows <- sqlQuery
"SELECT COUNT(*) FROM event_type_registry WHERE name = ? AND status = 'active'" "SELECT COUNT(*)::int FROM event_type_registry WHERE name = ? AND status = 'active'"
(Only name) (Only name)
case rows of case rows of
[Only (n :: Int)] | n > 0 -> pure (Right ()) [Only (n :: Int)] | n > 0 -> pure (Right ())
@@ -36,7 +36,7 @@ validateAnnotationCategory ::
Text -> IO (Either Text ()) Text -> IO (Either Text ())
validateAnnotationCategory name = do validateAnnotationCategory name = do
rows <- sqlQuery rows <- sqlQuery
"SELECT COUNT(*) FROM annotation_category_registry WHERE name = ? AND status = 'active'" "SELECT COUNT(*)::int FROM annotation_category_registry WHERE name = ? AND status = 'active'"
(Only name) (Only name)
case rows of case rows of
[Only (n :: Int)] | n > 0 -> pure (Right ()) [Only (n :: Int)] | n > 0 -> pure (Right ())
@@ -48,7 +48,7 @@ validatePolicyScope ::
Text -> IO (Either Text ()) Text -> IO (Either Text ())
validatePolicyScope name = do validatePolicyScope name = do
rows <- sqlQuery rows <- sqlQuery
"SELECT COUNT(*) FROM policy_scope_registry WHERE name = ? AND status = 'active'" "SELECT COUNT(*)::int FROM policy_scope_registry WHERE name = ? AND status = 'active'"
(Only name) (Only name)
case rows of case rows of
[Only (n :: Int)] | n > 0 -> pure (Right ()) [Only (n :: Int)] | n > 0 -> pure (Right ())

View File

@@ -0,0 +1,29 @@
---
id: ADHOC-2026-06-15
type: workplan
title: "Ad hoc Inter-Hub production fixes"
domain: custodian
repo: inter-hub
status: active
owner: codex
created: "2026-06-15"
updated: "2026-06-15"
---
# Ad hoc Inter-Hub production fixes
## Fix COUNT decode failures in v2 bootstrap endpoints
```task
id: ADHOC-2026-06-15-T01
status: progress
priority: high
```
Production Ops Hub bootstrap exposed a PostgreSQL/Haskell type mismatch in
the v2 API helpers. `COUNT(*)` returns `bigint`, while the helper code decoded
the result as `Int`, causing `UnexpectedColumnTypeStatementError` in widget
type validation and API request log rate-limit checks.
Fix the count queries so widget creation and authenticated hub-registry reads
work through the documented v2 bootstrap API.