fix(api): unblock production build
Some checks failed
Build and Deploy / build-push-deploy (push) Failing after 8m21s

This commit is contained in:
2026-06-14 14:42:11 +02:00
parent 84ee797e4f
commit a2d0dddddd
6 changed files with 51 additions and 40 deletions

View File

@@ -17,7 +17,7 @@ instance Controller ApiV2AnnotationsController where
action ApiV2IndexAnnotationsAction = do action ApiV2IndexAnnotationsAction = do
case requestMethod ?request of case requestMethod ?request of
"GET" -> listAnnotations "GET" -> listAnnotations
"POST" -> createAnnotation "POST" -> createApiAnnotation
_ -> respondWithStatus 405 $ object ["error" .= ("Method not allowed" :: Text)] _ -> respondWithStatus 405 $ object ["error" .= ("Method not allowed" :: Text)]
action ApiV2ShowAnnotationAction { annotationId } = do action ApiV2ShowAnnotationAction { annotationId } = do
@@ -26,7 +26,7 @@ instance Controller ApiV2AnnotationsController where
renderJson (annotationToJson ann) renderJson (annotationToJson ann)
-- POST /api/v2/annotations -- POST /api/v2/annotations
action ApiV2CreateAnnotationAction = createAnnotation action ApiV2CreateAnnotationAction = createApiAnnotation
listAnnotations :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Request) => IO () listAnnotations :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Request) => IO ()
listAnnotations = do listAnnotations = do
@@ -46,8 +46,8 @@ listAnnotations = do
anns <- q2 |> limit perPage |> offset off |> fetch anns <- q2 |> limit perPage |> offset off |> fetch
renderJson $ paginatedResponse (map annotationToJson anns) page perPage total renderJson $ paginatedResponse (map annotationToJson anns) page perPage total
createAnnotation :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Request) => IO () createApiAnnotation :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Request) => IO ()
createAnnotation = do createApiAnnotation = do
_consumer <- requireApiConsumer _consumer <- requireApiConsumer
let widgetIdText = paramOrNothing @Text "widgetId" let widgetIdText = paramOrNothing @Text "widgetId"
category = paramOrNothing @Text "category" category = paramOrNothing @Text "category"

View File

@@ -20,7 +20,7 @@ instance Controller ApiV2ApiConsumersController where
action ApiV2IndexApiConsumersAction = do action ApiV2IndexApiConsumersAction = do
case requestMethod ?request of case requestMethod ?request of
"GET" -> listApiConsumers "GET" -> listApiConsumers
"POST" -> createApiConsumer "POST" -> createApiConsumerRecord
_ -> respondWithStatus 405 $ object ["error" .= ("Method not allowed" :: Text)] _ -> respondWithStatus 405 $ object ["error" .= ("Method not allowed" :: Text)]
action ApiV2ShowApiConsumerAction { apiConsumerId } = do action ApiV2ShowApiConsumerAction { apiConsumerId } = do
@@ -28,7 +28,7 @@ instance Controller ApiV2ApiConsumersController where
apiConsumer <- fetch apiConsumerId apiConsumer <- fetch apiConsumerId
renderJson (apiConsumerToJson apiConsumer) renderJson (apiConsumerToJson apiConsumer)
action ApiV2CreateApiConsumerAction = createApiConsumer action ApiV2CreateApiConsumerAction = createApiConsumerRecord
action ApiV2CreateApiConsumerKeyAction { apiConsumerId } = do action ApiV2CreateApiConsumerKeyAction { apiConsumerId } = do
when (requestMethod ?request /= "POST") do when (requestMethod ?request /= "POST") do
@@ -48,8 +48,8 @@ listApiConsumers = do
|> fetch |> fetch
renderJson $ paginatedResponse (map apiConsumerToJson consumers) page perPage total renderJson $ paginatedResponse (map apiConsumerToJson consumers) page perPage total
createApiConsumer :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Request) => IO () createApiConsumerRecord :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Request) => IO ()
createApiConsumer = do createApiConsumerRecord = do
_consumer <- requireApiConsumer _consumer <- requireApiConsumer
let name = paramOrNothing @Text "name" let name = paramOrNothing @Text "name"
description = paramOrNothing @Text "description" description = paramOrNothing @Text "description"

View File

@@ -16,6 +16,7 @@ import Data.String (fromString)
import qualified Data.Aeson.Key as K import qualified Data.Aeson.Key as K
import qualified Data.Aeson.KeyMap as KM import qualified Data.Aeson.KeyMap as KM
import qualified Data.ByteString as BS import qualified Data.ByteString as BS
import qualified Data.Text.Encoding as TE
import qualified Data.UUID as UUID import qualified Data.UUID as UUID
import qualified Data.Vector as V import qualified Data.Vector as V
import Database.PostgreSQL.Simple (Only(..)) import Database.PostgreSQL.Simple (Only(..))
@@ -103,13 +104,17 @@ createManifest = do
[ "error" .= ("Hub already has a capability manifest" :: Text) [ "error" .= ("Hub already has a capability manifest" :: Text)
, "code" .= ("manifest_already_exists" :: Text) , "code" .= ("manifest_already_exists" :: Text)
] ]
declaredWidgetTypes <- textArrayFieldFromRequestOrEmpty "declaredWidgetTypes"
declaredEventTypes <- textArrayFieldFromRequestOrEmpty "declaredEventTypes"
declaredAnnotationCategories <- textArrayFieldFromRequestOrEmpty "declaredAnnotationCategories"
declaredPolicyScopes <- textArrayFieldFromRequestOrEmpty "declaredPolicyScopes"
manifest <- newRecord @HubCapabilityManifest manifest <- newRecord @HubCapabilityManifest
|> set #hubId hubId |> set #hubId hubId
|> set #manifestVersion manifestVersion |> set #manifestVersion manifestVersion
|> set #declaredWidgetTypes (toJSON (textArrayFieldFromRequestOrEmpty "declaredWidgetTypes")) |> set #declaredWidgetTypes (toJSON declaredWidgetTypes)
|> set #declaredEventTypes (toJSON (textArrayFieldFromRequestOrEmpty "declaredEventTypes")) |> set #declaredEventTypes (toJSON declaredEventTypes)
|> set #declaredAnnotationCategories (toJSON (textArrayFieldFromRequestOrEmpty "declaredAnnotationCategories")) |> set #declaredAnnotationCategories (toJSON declaredAnnotationCategories)
|> set #declaredPolicyScopes (toJSON (textArrayFieldFromRequestOrEmpty "declaredPolicyScopes")) |> set #declaredPolicyScopes (toJSON declaredPolicyScopes)
|> set #capabilityDescription capabilityDescription |> set #capabilityDescription capabilityDescription
|> set #contact contact |> set #contact contact
|> set #status "draft" |> set #status "draft"
@@ -126,13 +131,17 @@ updateManifest manifestId = do
, "code" .= ("manifest_read_only" :: Text) , "code" .= ("manifest_read_only" :: Text)
] ]
maybeDeclaredWidgetTypes <- textArrayFieldFromRequest "declaredWidgetTypes"
maybeDeclaredEventTypes <- textArrayFieldFromRequest "declaredEventTypes"
maybeDeclaredAnnotationCategories <- textArrayFieldFromRequest "declaredAnnotationCategories"
maybeDeclaredPolicyScopes <- textArrayFieldFromRequest "declaredPolicyScopes"
let manifestVersion = fromMaybe manifest.manifestVersion (nonEmptyText =<< paramOrNothing @Text "manifestVersion") let manifestVersion = fromMaybe manifest.manifestVersion (nonEmptyText =<< paramOrNothing @Text "manifestVersion")
capabilityDescription = fromMaybe manifest.capabilityDescription (Just <$> paramOrNothing @Text "capabilityDescription") capabilityDescription = fromMaybe manifest.capabilityDescription (Just <$> paramOrNothing @Text "capabilityDescription")
contact = fromMaybe manifest.contact (Just <$> paramOrNothing @Text "contact") contact = fromMaybe manifest.contact (Just <$> paramOrNothing @Text "contact")
declaredWidgetTypes = maybe manifest.declaredWidgetTypes toJSON (textArrayFieldFromRequest "declaredWidgetTypes") declaredWidgetTypes = maybe manifest.declaredWidgetTypes toJSON maybeDeclaredWidgetTypes
declaredEventTypes = maybe manifest.declaredEventTypes toJSON (textArrayFieldFromRequest "declaredEventTypes") declaredEventTypes = maybe manifest.declaredEventTypes toJSON maybeDeclaredEventTypes
declaredAnnotationCategories = maybe manifest.declaredAnnotationCategories toJSON (textArrayFieldFromRequest "declaredAnnotationCategories") declaredAnnotationCategories = maybe manifest.declaredAnnotationCategories toJSON maybeDeclaredAnnotationCategories
declaredPolicyScopes = maybe manifest.declaredPolicyScopes toJSON (textArrayFieldFromRequest "declaredPolicyScopes") declaredPolicyScopes = maybe manifest.declaredPolicyScopes toJSON maybeDeclaredPolicyScopes
manifest <- manifest manifest <- manifest
|> set #manifestVersion manifestVersion |> set #manifestVersion manifestVersion
@@ -204,18 +213,19 @@ manifestToJson manifest = object
, "updatedAt" .= manifest.updatedAt , "updatedAt" .= manifest.updatedAt
] ]
textArrayFieldFromRequestOrEmpty :: (?context :: ControllerContext, ?request :: Request) => Text -> [Text] textArrayFieldFromRequestOrEmpty :: (?context :: ControllerContext, ?request :: Request) => Text -> IO [Text]
textArrayFieldFromRequestOrEmpty fieldName = textArrayFieldFromRequestOrEmpty fieldName =
fromMaybe [] (textArrayFieldFromRequest fieldName) fromMaybe [] <$> textArrayFieldFromRequest fieldName
textArrayFieldFromRequest :: (?context :: ControllerContext, ?request :: Request) => Text -> Maybe [Text] textArrayFieldFromRequest :: (?context :: ControllerContext, ?request :: Request) => Text -> IO (Maybe [Text])
textArrayFieldFromRequest fieldName = textArrayFieldFromRequest fieldName =
case getHeader "Content-Type" of case getHeader "Content-Type" of
Just contentType | "application/json" `BS.isPrefixOf` contentType -> Just contentType | "application/json" `BS.isPrefixOf` contentType -> do
textArrayFieldFromJsonBody fieldName requestBodyJSON body <- requestBodyJSON
pure $ textArrayFieldFromJsonBody fieldName body
_ -> _ ->
let values = paramList @Text fieldName let values = paramList @Text (TE.encodeUtf8 fieldName)
in if null values then Nothing else Just values in pure $ if null values then Nothing else Just values
textArrayFieldFromJsonBody :: Text -> Value -> Maybe [Text] textArrayFieldFromJsonBody :: Text -> Value -> Maybe [Text]
textArrayFieldFromJsonBody fieldName (Object body) = textArrayFieldFromJsonBody fieldName (Object body) =

View File

@@ -15,7 +15,7 @@ instance Controller ApiV2HubsController where
action ApiV2IndexHubsAction = do action ApiV2IndexHubsAction = do
case requestMethod ?request of case requestMethod ?request of
"GET" -> listHubs "GET" -> listHubs
"POST" -> createHub "POST" -> createApiHub
_ -> respondWithStatus 405 $ object ["error" .= ("Method not allowed" :: Text)] _ -> respondWithStatus 405 $ object ["error" .= ("Method not allowed" :: Text)]
action ApiV2ShowHubAction { hubId } = do action ApiV2ShowHubAction { hubId } = do
@@ -23,7 +23,7 @@ instance Controller ApiV2HubsController where
hub <- fetch hubId hub <- fetch hubId
renderJson (hubToJson hub) renderJson (hubToJson hub)
action ApiV2CreateHubAction = createHub action ApiV2CreateHubAction = createApiHub
listHubs :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Request) => IO () listHubs :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Request) => IO ()
listHubs = do listHubs = do
@@ -38,8 +38,8 @@ listHubs = do
|> fetch |> fetch
renderJson $ paginatedResponse (map hubToJson hubs) page perPage total renderJson $ paginatedResponse (map hubToJson hubs) page perPage total
createHub :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Request) => IO () createApiHub :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Request) => IO ()
createHub = do createApiHub = do
_consumer <- requireApiConsumer _consumer <- requireApiConsumer
let slug = paramOrNothing @Text "slug" let slug = paramOrNothing @Text "slug"
name = paramOrNothing @Text "name" name = paramOrNothing @Text "name"

View File

@@ -27,7 +27,7 @@ instance Controller ApiV2InteractionEventsController where
action ApiV2IndexInteractionEventsAction = do action ApiV2IndexInteractionEventsAction = do
case requestMethod ?request of case requestMethod ?request of
"GET" -> listInteractionEvents "GET" -> listInteractionEvents
"POST" -> createInteractionEvent "POST" -> createApiInteractionEvent
_ -> respondWithStatus 405 $ object ["error" .= ("Method not allowed" :: Text)] _ -> respondWithStatus 405 $ object ["error" .= ("Method not allowed" :: Text)]
action ApiV2ShowInteractionEventAction { interactionEventId } = do action ApiV2ShowInteractionEventAction { interactionEventId } = do
@@ -36,7 +36,7 @@ instance Controller ApiV2InteractionEventsController where
renderJson (eventToJson event) renderJson (eventToJson event)
-- POST /api/v2/interaction-events -- POST /api/v2/interaction-events
action ApiV2CreateInteractionEventAction = createInteractionEvent action ApiV2CreateInteractionEventAction = createApiInteractionEvent
listInteractionEvents :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Request) => IO () listInteractionEvents :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Request) => IO ()
listInteractionEvents = do listInteractionEvents = do
@@ -57,13 +57,13 @@ listInteractionEvents = do
events <- q2 |> limit perPage |> offset off |> fetch events <- q2 |> limit perPage |> offset off |> fetch
renderJson $ paginatedResponse (map eventToJson events) page perPage total renderJson $ paginatedResponse (map eventToJson events) page perPage total
createInteractionEvent :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Request) => IO () createApiInteractionEvent :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Request) => IO ()
createInteractionEvent = do createApiInteractionEvent = do
consumer <- requireApiConsumer consumer <- requireApiConsumer
metadata <- metadataFromRequest
let widgetIdText = paramOrNothing @Text "widgetId" let widgetIdText = paramOrNothing @Text "widgetId"
eventType = paramOrNothing @Text "eventType" eventType = paramOrNothing @Text "eventType"
viewContext = paramOrNothing @Text "viewContext" viewContext = paramOrNothing @Text "viewContext"
metadata = metadataFromRequest
let missing = catMaybes let missing = catMaybes
[ if isNothing widgetIdText then Just ("widgetId" :: Text) else Nothing [ if isNothing widgetIdText then Just ("widgetId" :: Text) else Nothing
@@ -155,13 +155,14 @@ manifestAllowsEvent eventType declaredEventTypes =
metadataParamOrEmpty :: Maybe A.Value -> A.Value metadataParamOrEmpty :: Maybe A.Value -> A.Value
metadataParamOrEmpty = fromMaybe (object []) metadataParamOrEmpty = fromMaybe (object [])
metadataFromRequest :: (?context :: ControllerContext) => A.Value metadataFromRequest :: (?context :: ControllerContext, ?request :: Request) => IO A.Value
metadataFromRequest = metadataFromRequest =
case getHeader "Content-Type" of case getHeader "Content-Type" of
Just contentType | "application/json" `BS.isPrefixOf` contentType -> Just contentType | "application/json" `BS.isPrefixOf` contentType -> do
metadataParamOrEmpty (metadataFromJsonBody requestBodyJSON) body <- requestBodyJSON
pure $ metadataParamOrEmpty (metadataFromJsonBody body)
_ -> _ ->
metadataParamOrEmpty (metadataFromText =<< paramOrNothing @Text "metadata") pure $ metadataParamOrEmpty (metadataFromText =<< paramOrNothing @Text "metadata")
metadataFromJsonBody :: A.Value -> Maybe A.Value metadataFromJsonBody :: A.Value -> Maybe A.Value
metadataFromJsonBody (Object body) = KM.lookup "metadata" body metadataFromJsonBody (Object body) = KM.lookup "metadata" body

View File

@@ -17,7 +17,7 @@ instance Controller ApiV2WidgetsController where
action ApiV2IndexWidgetsAction = do action ApiV2IndexWidgetsAction = do
case requestMethod ?request of case requestMethod ?request of
"GET" -> listWidgets "GET" -> listWidgets
"POST" -> createWidget "POST" -> createApiWidget
_ -> respondWithStatus 405 $ object ["error" .= ("Method not allowed" :: Text)] _ -> respondWithStatus 405 $ object ["error" .= ("Method not allowed" :: Text)]
action ApiV2ShowWidgetAction { widgetId } = do action ApiV2ShowWidgetAction { widgetId } = do
@@ -25,7 +25,7 @@ instance Controller ApiV2WidgetsController where
widget <- fetch widgetId widget <- fetch widgetId
renderJson (widgetToJson widget) renderJson (widgetToJson widget)
action ApiV2CreateWidgetAction = createWidget action ApiV2CreateWidgetAction = createApiWidget
listWidgets :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Request) => IO () listWidgets :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Request) => IO ()
listWidgets = do listWidgets = do
@@ -40,8 +40,8 @@ listWidgets = do
|> fetch |> fetch
renderJson $ paginatedResponse (map widgetToJson widgets) page perPage total renderJson $ paginatedResponse (map widgetToJson widgets) page perPage total
createWidget :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Request) => IO () createApiWidget :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Request) => IO ()
createWidget = do createApiWidget = do
_consumer <- requireApiConsumer _consumer <- requireApiConsumer
let hubIdText = paramOrNothing @Text "hubId" let hubIdText = paramOrNothing @Text "hubId"
name = paramOrNothing @Text "name" name = paramOrNothing @Text "name"