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 ])