1+ using System . Text ;
2+ using System . Text . Json ;
3+ using System . Text . Json . Nodes ;
4+ using Api . Store ;
15using Domain . Messages ;
26using Streaming . Connections ;
37using Streaming . Protocol ;
@@ -9,17 +13,20 @@ public class DataChangeNotifier : IDataChangeNotifier
913{
1014 private readonly IConnectionManager _connectionManager ;
1115 private readonly IDataSyncService _dataSyncService ;
16+ private readonly IAgentStore _agentStore ;
1217 private readonly Dictionary < string , IMessageConsumer > _dataChangeHandlers ;
1318 private readonly ILogger < DataChangeNotifier > _logger ;
1419
1520 public DataChangeNotifier (
1621 IConnectionManager connectionManager ,
1722 IDataSyncService dataSyncService ,
23+ IAgentStore agentStore ,
1824 IEnumerable < IMessageConsumer > messageHandlers ,
1925 ILogger < DataChangeNotifier > logger )
2026 {
2127 _connectionManager = connectionManager ;
2228 _dataSyncService = dataSyncService ;
29+ _agentStore = agentStore ;
2330 _dataChangeHandlers = messageHandlers . ToDictionary ( x => x . Topic , x => x ) ;
2431 _logger = logger ;
2532 }
@@ -60,27 +67,86 @@ async Task NotifyConnectionAsync(Connection connection)
6067 }
6168 }
6269
63- public async Task NotifyAsync ( DataChangeMessage [ ] dataChanges )
70+ public async Task NotifyAsync ( DataChangeMessage dataChange )
6471 {
65- if ( dataChanges . Length == 0 )
72+ if ( ! _dataChangeHandlers . TryGetValue ( dataChange . Topic , out var handler ) )
6673 {
74+ _logger . LogWarning ( "No data change handler found for topic {Topic}." , dataChange . Topic ) ;
6775 return ;
6876 }
6977
70- foreach ( var dataChange in dataChanges )
78+ try
7179 {
72- if ( ! _dataChangeHandlers . TryGetValue ( dataChange . Topic , out var handler ) )
73- {
74- _logger . LogWarning ( "No data change handler found for topic {Topic}." , dataChange . Topic ) ;
75- continue ;
76- }
77-
7880 await handler . HandleAsync ( dataChange . Message , CancellationToken . None ) ;
7981
8082 _logger . LogInformation (
81- "Handled data change message for topic {Topic} (Item Id: {Id})" ,
83+ "Notified data change for topic {Topic} (Item Id: {Id})" ,
8284 dataChange . Topic , dataChange . Id
8385 ) ;
8486 }
87+ catch ( Exception ex )
88+ {
89+ _logger . LogError (
90+ ex ,
91+ "Exception occurred while notifying data change for topic {Topic} (Item Id: {Id})" ,
92+ dataChange . Topic ,
93+ dataChange . Id
94+ ) ;
95+ }
96+ }
97+
98+ public async Task NotifyAsync ( StoreItem item )
99+ {
100+ var dataChange = await ItemToDataChangeAsync ( ) ;
101+ if ( dataChange != null )
102+ {
103+ await NotifyAsync ( dataChange ) ;
104+ }
105+
106+ return ;
107+
108+ async ValueTask < DataChangeMessage ? > ItemToDataChangeAsync ( )
109+ {
110+ if ( item . Type == StoreItemType . Flag )
111+ {
112+ var flagChange = new DataChangeMessage (
113+ Topics . FeatureFlagChange ,
114+ item . Id ,
115+ Encoding . UTF8 . GetString ( item . JsonBytes )
116+ ) ;
117+
118+ return flagChange ;
119+ }
120+
121+ if ( item . Type == StoreItemType . Segment )
122+ {
123+ using var segment = JsonDocument . Parse ( item . JsonBytes ) ;
124+
125+ var envId = segment . RootElement . GetProperty ( "envId" ) . GetGuid ( ) ;
126+ var affectedIds = await _agentStore . GetFlagReferencesAsync ( envId , item . Id ) ;
127+
128+ JsonObject payload = new ( )
129+ {
130+ [ "segment" ] = JsonSerializer . SerializeToNode ( segment ) ,
131+ [ "affectedFlagIds" ] = JsonSerializer . SerializeToNode ( affectedIds )
132+ } ;
133+
134+ var segmentChange = new DataChangeMessage (
135+ Topics . SegmentChange ,
136+ item . Id ,
137+ JsonSerializer . Serialize ( payload )
138+ ) ;
139+
140+ return segmentChange ;
141+ }
142+
143+ _logger . LogWarning (
144+ "Unsupported StoreItem type {Type} for item Id {Id}, skipping data change notification for it." ,
145+ item . Type ,
146+ item . Id
147+ ) ;
148+
149+ return null ;
150+ }
85151 }
86152}
0 commit comments