inter-hub-haskell/Web/Controller/InteractionEvents.hs

56 lines
2.1 KiB
Haskell
Raw Normal View History

module Web.Controller.InteractionEvents where
import Web.Types
import Generated.Types
import IHP.Prelude
import IHP.ControllerPrelude
import Data.Aeson (object, (.=))
import qualified Data.Text as T
-- Valid canonical event types
validEventTypes :: [Text]
validEventTypes =
[ "viewed", "clicked", "submitted", "abandoned", "retried", "failed"
, "commented", "flagged_confusing", "flagged_helpful"
, "blocked_by_policy", "escalated"
, "accepted_recommendation", "rejected_recommendation"
]
instance Controller InteractionEventsController where
action CreateInteractionEventAction { widgetId } = do
eventType <- param @Text "event_type"
unless (eventType `elem` validEventTypes) do
respondJson (object ["error" .= ("unknown event_type" :: Text), "valid" .= validEventTypes])
-- IHP stops here; the above respondJson sends 200 but we need 422
-- Use renderWithStatus for proper 422:
setStatus 422
respondJson (object ["error" .= ("unknown event_type" :: Text)])
mUser <- currentUserOrNothing
let actorId = fmap (.id) mUser
actorType = maybe "anonymous" (const "user") mUser
actorTypeParam <- paramOrDefault @Text actorType "actor_type"
viewContextRef <- paramOrNothing @Text "view_context_ref"
metadataRaw <- paramOrDefault @Text "{}" "metadata"
let metadata = case readMay @Value (cs metadataRaw) of
Just v -> v
Nothing -> object []
event <- newRecord @InteractionEvent
|> set #widgetId widgetId
|> set #eventType eventType
|> set #actorId (fmap (Id . unId) actorId)
|> set #actorType actorTypeParam
|> set #viewContextRef viewContextRef
|> set #metadata metadata
|> createRecord
respondJson (object
[ "id" .= event.id
, "widget_id" .= event.widgetId
, "event_type" .= event.eventType
, "occurred_at".= event.occurredAt
])