generated from coulomb/repo-seed
Fix API count decoding
Some checks failed
Build and Deploy / build-push-deploy (push) Has been cancelled
Some checks failed
Build and Deploy / build-push-deploy (push) Has been cancelled
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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 ())
|
||||||
|
|||||||
29
workplans/ADHOC-2026-06-15.md
Normal file
29
workplans/ADHOC-2026-06-15.md
Normal 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.
|
||||||
Reference in New Issue
Block a user