1+ {-# LANGUAGE ApplicativeDo #-}
12{-# LANGUAGE DataKinds #-}
23{-# LANGUAGE RecordWildCards #-}
34
@@ -74,7 +75,7 @@ data NotificationTopic
7475 deriving (Eq , Show , Ord , Enum , Bounded )
7576
7677instance PG. EncodeValue NotificationTopic where
77- encodeValue = HasqlEncoders. enum \ case
78+ encodeValue = HasqlEncoders. enum Nothing " notification_topic " \ case
7879 ProjectBranchUpdated -> " project:branch:updated"
7980 ProjectContributionCreated -> " project:contribution:created"
8081 ProjectContributionStatusUpdated -> " project:contribution:updated"
@@ -85,7 +86,7 @@ instance PG.EncodeValue NotificationTopic where
8586 ProjectReleaseCreated -> " project:release:created"
8687
8788instance PG. DecodeValue NotificationTopic where
88- decodeValue = HasqlDecoders. enum \ case
89+ decodeValue = HasqlDecoders. enum Nothing " notification_topic " \ case
8990 " project:branch:updated" -> Just ProjectBranchUpdated
9091 " project:contribution:created" -> Just ProjectContributionCreated
9192 " project:contribution:updated" -> Just ProjectContributionStatusUpdated
@@ -125,12 +126,12 @@ data NotificationTopicGroup
125126 deriving (Eq , Show , Ord )
126127
127128instance PG. EncodeValue NotificationTopicGroup where
128- encodeValue = HasqlEncoders. enum \ case
129+ encodeValue = HasqlEncoders. enum Nothing " notification_topic_group " \ case
129130 WatchProject -> " watch_project"
130131 AllProjectTopics -> " all_project_topics"
131132
132133instance PG. DecodeValue NotificationTopicGroup where
133- decodeValue = HasqlDecoders. enum \ case
134+ decodeValue = HasqlDecoders. enum Nothing " notification_topic_group " \ case
134135 " watch_project" -> Just WatchProject
135136 " all_project_topics" -> Just AllProjectTopics
136137 _ -> Nothing
@@ -179,13 +180,13 @@ instance Aeson.FromJSON NotificationStatus where
179180 s -> fail $ " Invalid notification status: " <> Text. unpack s
180181
181182instance PG. EncodeValue NotificationStatus where
182- encodeValue = HasqlEncoders. enum \ case
183+ encodeValue = HasqlEncoders. enum Nothing " notification_status " \ case
183184 Unread -> " unread"
184185 Read -> " read"
185186 Archived -> " archived"
186187
187188instance PG. DecodeValue NotificationStatus where
188- decodeValue = HasqlDecoders. enum \ case
189+ decodeValue = HasqlDecoders. enum Nothing " notification_status " \ case
189190 " unread" -> Just Unread
190191 " read" -> Just Read
191192 " archived" -> Just Archived
@@ -395,36 +396,39 @@ instance PG.EncodeValue NotificationEventData where
395396instance Hasql. DecodeRow NotificationEventData where
396397 decodeRow = do
397398 topic <- PG. decodeField
398- Hasql. Jsonb jsonData <- PG. decodeField
399- case topic of
400- ProjectBranchUpdated -> do
401- (project :++ branch) <- parseJsonData jsonData
402- pure $ ProjectBranchUpdatedData project branch
403- ProjectContributionCreated -> do
404- (project :++ contr) <- parseJsonData jsonData
405- pure $ ProjectContributionCreatedData project contr
406- ProjectContributionStatusUpdated -> do
407- (project :++ contr :++ status) <- parseJsonData jsonData
408- pure $ ProjectContributionStatusUpdatedData project contr status
409- ProjectContributionComment -> do
410- (project :++ contr :++ comm) <- parseJsonData jsonData
411- pure $ ProjectContributionCommentData project contr comm
412- ProjectTicketCreated -> do
413- (project :++ ticket) <- parseJsonData jsonData
414- pure $ ProjectTicketCreatedData project ticket
415- ProjectTicketStatusUpdated -> do
416- (project :++ ticket :++ status) <- parseJsonData jsonData
417- pure $ ProjectTicketStatusUpdatedData project ticket status
418- ProjectTicketComment -> do
419- (project :++ ticket :++ comm) <- parseJsonData jsonData
420- pure $ ProjectTicketCommentData project ticket comm
421- ProjectReleaseCreated -> do
422- (project :++ release) <- parseJsonData jsonData
423- pure $ ProjectReleaseCreatedData project release
399+ jsonb <- PG. decodeField
400+ pure $
401+ -- ApplicativeDo isn't very smart, therefore, nested lets.
402+ let Hasql. Jsonb jsonData = jsonb
403+ in case topic of
404+ ProjectBranchUpdated ->
405+ let (project :++ branch) = parseJsonData jsonData
406+ in ProjectBranchUpdatedData project branch
407+ ProjectContributionCreated -> do
408+ let (project :++ contr) = parseJsonData jsonData
409+ in ProjectContributionCreatedData project contr
410+ ProjectContributionStatusUpdated -> do
411+ let (project :++ contr :++ status) = parseJsonData jsonData
412+ in ProjectContributionStatusUpdatedData project contr status
413+ ProjectContributionComment -> do
414+ let (project :++ contr :++ comm) = parseJsonData jsonData
415+ in ProjectContributionCommentData project contr comm
416+ ProjectTicketCreated -> do
417+ let (project :++ ticket) = parseJsonData jsonData
418+ in ProjectTicketCreatedData project ticket
419+ ProjectTicketStatusUpdated -> do
420+ let (project :++ ticket :++ status) = parseJsonData jsonData
421+ in ProjectTicketStatusUpdatedData project ticket status
422+ ProjectTicketComment -> do
423+ let (project :++ ticket :++ comm) = parseJsonData jsonData
424+ in ProjectTicketCommentData project ticket comm
425+ ProjectReleaseCreated -> do
426+ let (project :++ release) = parseJsonData jsonData
427+ in ProjectReleaseCreatedData project release
424428 where
425429 parseJsonData v = case Aeson. fromJSON v of
426- Aeson. Error e -> fail e
427- Aeson. Success a -> pure a
430+ Aeson. Error e -> error e
431+ Aeson. Success a -> a
428432
429433eventTopic :: NotificationEventData -> NotificationTopic
430434eventTopic = \ case
@@ -530,8 +534,10 @@ data NotificationWebhookConfig = NotificationWebhookConfig
530534instance PG. DecodeRow NotificationWebhookConfig where
531535 decodeRow = do
532536 webhookDeliveryId <- PG. decodeField
533- URIParam webhookDeliveryUrl <- PG. decodeField
534- pure $ NotificationWebhookConfig {webhookDeliveryId, webhookDeliveryUrl}
537+ url <- PG. decodeField
538+ pure $
539+ let URIParam webhookDeliveryUrl = url
540+ in NotificationWebhookConfig {webhookDeliveryId, webhookDeliveryUrl}
535541
536542instance Aeson. ToJSON NotificationWebhookConfig where
537543 toJSON NotificationWebhookConfig {webhookDeliveryId, webhookDeliveryUrl} =
@@ -602,16 +608,17 @@ instance PG.DecodeRow (NotificationSubscription NotificationSubscriptionId) wher
602608 subscriptionScopeProject <- PG. decodeField
603609 subscriberUser <- PG. decodeField
604610 subscriberProject <- PG. decodeField
605- let subscriptionOwner = case (subscriberUser, subscriberProject) of
606- (Just uid, Nothing ) -> UserSubscriptionOwner uid
607- (Nothing , Just pid) -> ProjectSubscriptionOwner pid
608- _ -> error " Invalid subscription owner in database"
609611 subscriptionTopics <- Set. fromList <$> PG. decodeField
610612 subscriptionTopicGroups <- Set. fromList <$> PG. decodeField
611613 subscriptionFilter <- PG. decodeField
612614 subscriptionCreatedAt <- PG. decodeField
613615 subscriptionUpdatedAt <- PG. decodeField
614- pure $ NotificationSubscription {subscriptionId, subscriptionScopeUser, subscriptionScopeProject, subscriptionOwner, subscriptionTopics, subscriptionTopicGroups, subscriptionFilter, subscriptionCreatedAt, subscriptionUpdatedAt}
616+ pure $
617+ let subscriptionOwner = case (subscriberUser, subscriberProject) of
618+ (Just uid, Nothing ) -> UserSubscriptionOwner uid
619+ (Nothing , Just pid) -> ProjectSubscriptionOwner pid
620+ _ -> error " Invalid subscription owner in database"
621+ in NotificationSubscription {subscriptionId, subscriptionScopeUser, subscriptionScopeProject, subscriptionOwner, subscriptionTopics, subscriptionTopicGroups, subscriptionFilter, subscriptionCreatedAt, subscriptionUpdatedAt}
615622
616623instance Aeson. ToJSON (NotificationSubscription NotificationSubscriptionId ) where
617624 toJSON NotificationSubscription {subscriptionId, subscriptionScopeUser, subscriptionScopeProject, subscriptionOwner, subscriptionTopics, subscriptionTopicGroups, subscriptionFilter, subscriptionCreatedAt, subscriptionUpdatedAt} =
0 commit comments