@@ -15,6 +15,7 @@ module Share.Notifications.Types
15
15
ContributionData (.. ),
16
16
TicketData (.. ),
17
17
CommentData (.. ),
18
+ StatusUpdateData (.. ),
18
19
NotificationHubEntry (.. ),
19
20
NotificationStatus (.. ),
20
21
DeliveryMethodId (.. ),
@@ -31,6 +32,7 @@ module Share.Notifications.Types
31
32
CommentPayload (.. ),
32
33
ProjectBranchUpdatedPayload (.. ),
33
34
ProjectContributionPayload (.. ),
35
+ StatusUpdatePayload (.. ),
34
36
eventTopic ,
35
37
hydratedEventTopic ,
36
38
eventData_ ,
@@ -62,52 +64,52 @@ import Share.Web.Share.DisplayInfo.Types (UserDisplayInfo)
62
64
data NotificationTopic
63
65
= ProjectBranchUpdated
64
66
| ProjectContributionCreated
65
- | ProjectContributionUpdated
67
+ | ProjectContributionStatusUpdated
66
68
| ProjectContributionComment
67
69
| ProjectTicketCreated
68
- | ProjectTicketUpdated
70
+ | ProjectTicketStatusUpdated
69
71
| ProjectTicketComment
70
72
deriving (Eq , Show , Ord )
71
73
72
74
instance PG. EncodeValue NotificationTopic where
73
75
encodeValue = HasqlEncoders. enum \ case
74
76
ProjectBranchUpdated -> " project:branch:updated"
75
77
ProjectContributionCreated -> " project:contribution:created"
76
- ProjectContributionUpdated -> " project:contribution:updated"
78
+ ProjectContributionStatusUpdated -> " project:contribution:updated"
77
79
ProjectContributionComment -> " project:contribution:comment"
78
80
ProjectTicketCreated -> " project:ticket:created"
79
- ProjectTicketUpdated -> " project:ticket:updated"
81
+ ProjectTicketStatusUpdated -> " project:ticket:updated"
80
82
ProjectTicketComment -> " project:ticket:comment"
81
83
82
84
instance PG. DecodeValue NotificationTopic where
83
85
decodeValue = HasqlDecoders. enum \ case
84
86
" project:branch:updated" -> Just ProjectBranchUpdated
85
87
" project:contribution:created" -> Just ProjectContributionCreated
86
- " project:contribution:updated" -> Just ProjectContributionUpdated
88
+ " project:contribution:updated" -> Just ProjectContributionStatusUpdated
87
89
" project:contribution:comment" -> Just ProjectContributionComment
88
90
" project:ticket:created" -> Just ProjectTicketCreated
89
- " project:ticket:updated" -> Just ProjectTicketUpdated
91
+ " project:ticket:updated" -> Just ProjectTicketStatusUpdated
90
92
" project:ticket:comment" -> Just ProjectTicketComment
91
93
_ -> Nothing
92
94
93
95
instance Aeson. ToJSON NotificationTopic where
94
96
toJSON = \ case
95
97
ProjectBranchUpdated -> " project:branch:updated"
96
98
ProjectContributionCreated -> " project:contribution:created"
97
- ProjectContributionUpdated -> " project:contribution:updated"
99
+ ProjectContributionStatusUpdated -> " project:contribution:updated"
98
100
ProjectContributionComment -> " project:contribution:comment"
99
101
ProjectTicketCreated -> " project:ticket:created"
100
- ProjectTicketUpdated -> " project:ticket:updated"
102
+ ProjectTicketStatusUpdated -> " project:ticket:updated"
101
103
ProjectTicketComment -> " project:ticket:comment"
102
104
103
105
instance Aeson. FromJSON NotificationTopic where
104
106
parseJSON = Aeson. withText " NotificationTopic" \ case
105
107
" project:branch:updated" -> pure ProjectBranchUpdated
106
108
" project:contribution:created" -> pure ProjectContributionCreated
107
- " project:contribution:updated" -> pure ProjectContributionUpdated
109
+ " project:contribution:updated" -> pure ProjectContributionStatusUpdated
108
110
" project:contribution:comment" -> pure ProjectContributionComment
109
111
" project:ticket:created" -> pure ProjectTicketCreated
110
- " project:ticket:updated" -> pure ProjectTicketUpdated
112
+ " project:ticket:updated" -> pure ProjectTicketStatusUpdated
111
113
" project:ticket:comment" -> pure ProjectTicketComment
112
114
s -> fail $ " Invalid notification topic: " <> Text. unpack s
113
115
@@ -290,15 +292,35 @@ instance Aeson.FromJSON ContributionData where
290
292
contributorUserId <- o .: " contributorUserId"
291
293
pure ContributionData {contributionId, fromBranchId, toBranchId, contributorUserId}
292
294
295
+ data StatusUpdateData status
296
+ = StatusUpdateData
297
+ { oldStatus :: status ,
298
+ newStatus :: status
299
+ }
300
+ deriving (Eq , Show )
301
+
302
+ instance (ToJSON status ) => ToJSON (StatusUpdateData status ) where
303
+ toJSON StatusUpdateData {oldStatus, newStatus} =
304
+ Aeson. object
305
+ [ " oldStatus" .= oldStatus,
306
+ " newStatus" .= newStatus
307
+ ]
308
+
309
+ instance (FromJSON status ) => FromJSON (StatusUpdateData status ) where
310
+ parseJSON = Aeson. withObject " StatusUpdateData" \ o -> do
311
+ oldStatus <- o .: " oldStatus"
312
+ newStatus <- o .: " newStatus"
313
+ pure StatusUpdateData {oldStatus, newStatus}
314
+
293
315
-- The bare-bones Notification Event Data that's actually stored in the database.
294
316
-- It holds unhydrated IDs.
295
317
data NotificationEventData
296
318
= ProjectBranchUpdatedData ProjectData BranchData
297
319
| ProjectContributionCreatedData ProjectData ContributionData
298
- | ProjectContributionUpdatedData ProjectData ContributionData
320
+ | ProjectContributionStatusUpdatedData ProjectData ContributionData ( StatusUpdateData ContributionStatus )
299
321
| ProjectContributionCommentData ProjectData ContributionData CommentData
300
322
| ProjectTicketCreatedData ProjectData TicketData
301
- | ProjectTicketUpdatedData ProjectData TicketData
323
+ | ProjectTicketStatusUpdatedData ProjectData TicketData ( StatusUpdateData TicketStatus )
302
324
| ProjectTicketCommentData ProjectData TicketData CommentData
303
325
deriving stock (Eq , Show )
304
326
@@ -313,10 +335,10 @@ instance Aeson.ToJSON NotificationEventData where
313
335
body = case ned of
314
336
ProjectBranchUpdatedData project branch -> Aeson. toJSON (project :++ branch)
315
337
ProjectContributionCreatedData project c -> Aeson. toJSON (project :++ c)
316
- ProjectContributionUpdatedData project contr -> Aeson. toJSON (project :++ contr)
338
+ ProjectContributionStatusUpdatedData project contr status -> Aeson. toJSON (project :++ contr :++ status )
317
339
ProjectContributionCommentData project contr comm -> Aeson. toJSON (project :++ contr :++ comm)
318
340
ProjectTicketCreatedData project ticket -> Aeson. toJSON (project :++ ticket)
319
- ProjectTicketUpdatedData project ticket -> Aeson. toJSON (project :++ ticket)
341
+ ProjectTicketStatusUpdatedData project ticket status -> Aeson. toJSON (project :++ ticket :++ status )
320
342
ProjectTicketCommentData project ticket comm -> Aeson. toJSON (project :++ ticket :++ comm)
321
343
322
344
instance PG. EncodeValue NotificationEventData where
@@ -325,10 +347,10 @@ instance PG.EncodeValue NotificationEventData where
325
347
& contramap \ case
326
348
ProjectBranchUpdatedData project branch -> Aeson. toJSON (project :++ branch)
327
349
ProjectContributionCreatedData project contr -> Aeson. toJSON (project :++ contr)
328
- ProjectContributionUpdatedData project contr -> Aeson. toJSON (project :++ contr)
350
+ ProjectContributionStatusUpdatedData project contr status -> Aeson. toJSON (project :++ contr :++ status )
329
351
ProjectContributionCommentData project contr comm -> Aeson. toJSON (project :++ contr :++ comm)
330
352
ProjectTicketCreatedData project ticket -> Aeson. toJSON (project :++ ticket)
331
- ProjectTicketUpdatedData project ticket -> Aeson. toJSON (project :++ ticket)
353
+ ProjectTicketStatusUpdatedData project ticket status -> Aeson. toJSON (project :++ ticket :++ status )
332
354
ProjectTicketCommentData project ticket comm -> Aeson. toJSON (project :++ ticket :++ comm)
333
355
334
356
instance Hasql. DecodeRow NotificationEventData where
@@ -342,18 +364,18 @@ instance Hasql.DecodeRow NotificationEventData where
342
364
ProjectContributionCreated -> do
343
365
(project :++ contr) <- parseJsonData jsonData
344
366
pure $ ProjectContributionCreatedData project contr
345
- ProjectContributionUpdated -> do
346
- (project :++ contr) <- parseJsonData jsonData
347
- pure $ ProjectContributionUpdatedData project contr
367
+ ProjectContributionStatusUpdated -> do
368
+ (project :++ contr :++ status ) <- parseJsonData jsonData
369
+ pure $ ProjectContributionStatusUpdatedData project contr status
348
370
ProjectContributionComment -> do
349
371
(project :++ contr :++ comm) <- parseJsonData jsonData
350
372
pure $ ProjectContributionCommentData project contr comm
351
373
ProjectTicketCreated -> do
352
374
(project :++ ticket) <- parseJsonData jsonData
353
375
pure $ ProjectTicketCreatedData project ticket
354
- ProjectTicketUpdated -> do
355
- (project :++ ticket) <- parseJsonData jsonData
356
- pure $ ProjectTicketUpdatedData project ticket
376
+ ProjectTicketStatusUpdated -> do
377
+ (project :++ ticket :++ status ) <- parseJsonData jsonData
378
+ pure $ ProjectTicketStatusUpdatedData project ticket status
357
379
ProjectTicketComment -> do
358
380
(project :++ ticket :++ comm) <- parseJsonData jsonData
359
381
pure $ ProjectTicketCommentData project ticket comm
@@ -366,10 +388,10 @@ eventTopic :: NotificationEventData -> NotificationTopic
366
388
eventTopic = \ case
367
389
ProjectBranchUpdatedData {} -> ProjectBranchUpdated
368
390
ProjectContributionCreatedData {} -> ProjectContributionCreated
369
- ProjectContributionUpdatedData {} -> ProjectContributionUpdated
391
+ ProjectContributionStatusUpdatedData {} -> ProjectContributionStatusUpdated
370
392
ProjectContributionCommentData {} -> ProjectContributionComment
371
393
ProjectTicketCreatedData {} -> ProjectTicketCreated
372
- ProjectTicketUpdatedData {} -> ProjectTicketUpdated
394
+ ProjectTicketStatusUpdatedData {} -> ProjectTicketStatusUpdated
373
395
ProjectTicketCommentData {} -> ProjectTicketComment
374
396
375
397
-- | Description of a notifiable event.
@@ -754,6 +776,26 @@ instance FromJSON ProjectContributionPayload where
754
776
contributionInfo <- o .: " contribution"
755
777
pure ProjectContributionPayload {projectInfo, contributionInfo}
756
778
779
+ data StatusUpdatePayload status
780
+ = StatusUpdatePayload
781
+ { oldStatus :: status ,
782
+ newStatus :: status
783
+ }
784
+ deriving (Eq , Show )
785
+
786
+ instance (ToJSON status ) => ToJSON (StatusUpdatePayload status ) where
787
+ toJSON StatusUpdatePayload {oldStatus, newStatus} =
788
+ Aeson. object
789
+ [ " oldStatus" .= oldStatus,
790
+ " newStatus" .= newStatus
791
+ ]
792
+
793
+ instance (FromJSON status ) => FromJSON (StatusUpdatePayload status ) where
794
+ parseJSON = Aeson. withObject " StatusUpdatedPayload" \ o -> do
795
+ oldStatus <- o .: " oldStatus"
796
+ newStatus <- o .: " newStatus"
797
+ pure StatusUpdatePayload {oldStatus, newStatus}
798
+
757
799
data HydratedEvent = HydratedEvent
758
800
{ hydratedEventPayload :: HydratedEventPayload ,
759
801
hydratedEventLink :: URI
@@ -766,10 +808,10 @@ instance ToJSON HydratedEvent where
766
808
payload = case hydratedEventPayload of
767
809
HydratedProjectBranchUpdatedPayload p -> Aeson. toJSON p
768
810
HydratedProjectContributionCreatedPayload p -> Aeson. toJSON p
769
- HydratedProjectContributionUpdatedPayload p -> Aeson. toJSON p
811
+ HydratedProjectContributionStatusUpdatedPayload p status -> Aeson. toJSON (p :++ status)
770
812
HydratedProjectContributionCommentPayload p comm -> Aeson. toJSON (p :++ comm)
771
813
HydratedProjectTicketCreatedPayload p -> Aeson. toJSON p
772
- HydratedProjectTicketUpdatedPayload p -> Aeson. toJSON p
814
+ HydratedProjectTicketStatusUpdatedPayload p status -> Aeson. toJSON (p :++ status)
773
815
HydratedProjectTicketCommentPayload p comm -> Aeson. toJSON (p :++ comm)
774
816
in Aeson. object
775
817
[ " payload" .= payload,
@@ -784,12 +826,16 @@ instance FromJSON HydratedEvent where
784
826
hydratedEventPayload <- case kind of
785
827
ProjectBranchUpdated -> HydratedProjectBranchUpdatedPayload <$> o .: " payload"
786
828
ProjectContributionCreated -> HydratedProjectContributionCreatedPayload <$> o .: " payload"
787
- ProjectContributionUpdated -> HydratedProjectContributionUpdatedPayload <$> o .: " payload"
829
+ ProjectContributionStatusUpdated -> do
830
+ (p :++ status) <- o .: " payload"
831
+ pure $ HydratedProjectContributionStatusUpdatedPayload p status
788
832
ProjectContributionComment -> do
789
833
(p :++ comm) <- o .: " payload"
790
834
pure $ HydratedProjectContributionCommentPayload p comm
791
835
ProjectTicketCreated -> HydratedProjectTicketCreatedPayload <$> o .: " payload"
792
- ProjectTicketUpdated -> HydratedProjectTicketUpdatedPayload <$> o .: " payload"
836
+ ProjectTicketStatusUpdated -> do
837
+ (p :++ status) <- o .: " payload"
838
+ pure $ HydratedProjectTicketStatusUpdatedPayload p status
793
839
ProjectTicketComment -> do
794
840
(p :++ comm) <- o .: " payload"
795
841
pure $ HydratedProjectTicketCommentPayload p comm
@@ -799,19 +845,19 @@ instance FromJSON HydratedEvent where
799
845
data HydratedEventPayload
800
846
= HydratedProjectBranchUpdatedPayload ProjectBranchUpdatedPayload
801
847
| HydratedProjectContributionCreatedPayload ProjectContributionPayload
802
- | HydratedProjectContributionUpdatedPayload ProjectContributionPayload
848
+ | HydratedProjectContributionStatusUpdatedPayload ProjectContributionPayload ( StatusUpdatePayload ContributionStatus )
803
849
| HydratedProjectContributionCommentPayload ProjectContributionPayload CommentPayload
804
850
| HydratedProjectTicketCreatedPayload ProjectTicketPayload
805
- | HydratedProjectTicketUpdatedPayload ProjectTicketPayload
851
+ | HydratedProjectTicketStatusUpdatedPayload ProjectTicketPayload ( StatusUpdatePayload TicketStatus )
806
852
| HydratedProjectTicketCommentPayload ProjectTicketPayload CommentPayload
807
853
deriving stock (Show , Eq )
808
854
809
855
hydratedEventTopic :: HydratedEvent -> NotificationTopic
810
856
hydratedEventTopic (HydratedEvent {hydratedEventPayload}) = case hydratedEventPayload of
811
857
HydratedProjectBranchUpdatedPayload _ -> ProjectBranchUpdated
812
858
HydratedProjectContributionCreatedPayload _ -> ProjectContributionCreated
813
- HydratedProjectContributionUpdatedPayload _ -> ProjectContributionUpdated
859
+ HydratedProjectContributionStatusUpdatedPayload _ _ -> ProjectContributionStatusUpdated
814
860
HydratedProjectContributionCommentPayload _ _ -> ProjectContributionComment
815
861
HydratedProjectTicketCreatedPayload _ -> ProjectTicketCreated
816
- HydratedProjectTicketUpdatedPayload _ -> ProjectTicketUpdated
862
+ HydratedProjectTicketStatusUpdatedPayload _ _ -> ProjectTicketStatusUpdated
817
863
HydratedProjectTicketCommentPayload _ _ -> ProjectTicketComment
0 commit comments