@@ -167,7 +167,6 @@ func (s *service) ProcessFetchedTools(serverID int64, fetchedTools []models.Fetc
167167 }
168168
169169 s .logger .Info ().Int ("fetched" , len (fetchedTools )).Int ("added" , addedCount ).Int ("updated" , updatedCount ).Int64 ("serverID" , serverID ).Msg ("Processed fetched tools" )
170- s .bus .Publish (events .NewToolsUpdatedEvent (serverID , len (fetchedTools ))) // Existing event
171170 return addedCount , updatedCount , nil
172171}
173172
@@ -180,9 +179,9 @@ func (s *service) UpdateMCPServerStatus(id int64, state models.ConnectionState,
180179 return fmt .Errorf ("failed to update server status: %w" , err )
181180 }
182181
183- // Publish the status change event
184- s .bus .Publish (events .NewServerStatusChangedEvent (id , state , errStr ))
185- s .logger .Debug ().Int64 ("id" , id ).Str ("state" , string (state )).Msg ("Updated server status and published ServerStatusChangedEvent " )
182+ // Publish the status change event - REMOVED - ConnectionManager publishes this now.
183+ // s.bus.Publish(events.NewServerStatusChangedEvent(id, state, errStr))
184+ s .logger .Debug ().Int64 ("id" , id ).Str ("state" , string (state )).Msg ("Updated server status in DB (event published by ConnectionManager) " )
186185
187186 // Fetching the updated server is no longer strictly necessary just for publishing the event
188187 // updatedServer, getErr := s.db.GetServerByID(id)
@@ -229,3 +228,122 @@ func (s *service) UpdateMCPServer(id int64, name, url string) (*models.MCPServer
229228 // s.bus.Publish(events.NewServerUpdatedEvent(*updatedServer)) // TODO: Define and use a ServerUpdatedEvent
230229 return updatedServer , nil
231230}
231+
232+ // --- Event Handlers ---
233+
234+ // HandleServerStatusChanged processes ServerStatusChangedEvent received from the event bus.
235+ func (s * service ) HandleServerStatusChanged (event events.Event ) {
236+ statusEvent , ok := event .(* events.ServerStatusChangedEvent )
237+ if ! ok {
238+ s .logger .Error ().Str ("eventType" , string (event .Type ())).Msg ("Received event of unexpected type in HandleServerStatusChanged" )
239+ return
240+ }
241+
242+ // Need to find the server ID from the URL if ID is 0 (publisher might not know it)
243+ serverID := statusEvent .ServerID
244+ if serverID == 0 {
245+ server , err := s .db .GetServerByURL (statusEvent .ServerURL )
246+ if err != nil {
247+ s .logger .Error ().Err (err ).Str ("url" , statusEvent .ServerURL ).Msg ("Error finding server by URL for status update event" )
248+ return
249+ }
250+ if server == nil {
251+ s .logger .Warn ().Str ("url" , statusEvent .ServerURL ).Msg ("Received status update event for unknown server URL" )
252+ return
253+ }
254+ serverID = server .ID
255+ s .logger .Debug ().Int64 ("serverID" , serverID ).Str ("url" , statusEvent .ServerURL ).Msg ("Mapped server URL to ID for status update event" )
256+ }
257+
258+ s .logger .Info ().
259+ Int64 ("serverID" , serverID ).
260+ Str ("url" , statusEvent .ServerURL ).
261+ Str ("newState" , string (statusEvent .NewState )).
262+ Msg ("Handling ServerStatusChanged event" )
263+
264+ // Call the existing DB update method
265+ err := s .db .UpdateServerStatus (serverID , statusEvent .NewState , statusEvent .LastError , time .Now ())
266+ if err != nil {
267+ s .logger .Error ().Err (err ).Int64 ("serverID" , serverID ).Msg ("Failed to update DB from ServerStatusChangedEvent" )
268+ // Note: We don't re-publish the event here to avoid loops.
269+ }
270+ }
271+
272+ // HandleToolsUpdated processes ToolsUpdatedEvent received from the event bus.
273+ func (s * service ) HandleToolsUpdated (event events.Event ) {
274+ toolsEvent , ok := event .(* events.ToolsUpdatedEvent )
275+ if ! ok {
276+ s .logger .Error ().Str ("eventType" , string (event .Type ())).Msg ("Received event of unexpected type in HandleToolsUpdated" )
277+ return
278+ }
279+
280+ // Need to find the server ID from the URL if ID is 0
281+ serverID := toolsEvent .ServerID
282+ if serverID == 0 {
283+ server , err := s .db .GetServerByURL (toolsEvent .ServerURL )
284+ if err != nil {
285+ s .logger .Error ().Err (err ).Str ("url" , toolsEvent .ServerURL ).Msg ("Error finding server by URL for tools update event" )
286+ return
287+ }
288+ if server == nil {
289+ s .logger .Warn ().Str ("url" , toolsEvent .ServerURL ).Msg ("Received tools update event for unknown server URL" )
290+ return
291+ }
292+ serverID = server .ID
293+ s .logger .Debug ().Int64 ("serverID" , serverID ).Str ("url" , toolsEvent .ServerURL ).Msg ("Mapped server URL to ID for tools update event" )
294+ }
295+
296+ s .logger .Info ().
297+ Int64 ("serverID" , serverID ).
298+ Str ("url" , toolsEvent .ServerURL ).
299+ Int ("toolCount" , len (toolsEvent .Tools )).
300+ Msg ("Handling ToolsUpdated event" )
301+
302+ // Process each tool using the DB upsert method
303+ addedCount := 0
304+ updatedCount := 0
305+ hadError := false
306+ for _ , tool := range toolsEvent .Tools {
307+ // Ensure the SourceServerID is set correctly, as the event might have had 0
308+ tool .SourceServerID = serverID
309+
310+ wasAdded , upsertErr := s .db .UpsertTool (tool )
311+ if upsertErr != nil {
312+ s .logger .Error ().Err (upsertErr ).Str ("externalID" , tool .ExternalID ).Int64 ("serverID" , serverID ).Msg ("Error upserting tool from ToolsUpdatedEvent" )
313+ hadError = true
314+ continue // Continue processing other tools
315+ }
316+ if wasAdded {
317+ addedCount ++
318+ } else {
319+ updatedCount ++
320+ }
321+ }
322+
323+ if hadError {
324+ s .logger .Warn ().Int64 ("serverID" , serverID ).Msg ("Encountered errors while processing tools from ToolsUpdatedEvent" )
325+ }
326+
327+ s .logger .Info ().
328+ Int64 ("serverID" , serverID ).
329+ Int ("added" , addedCount ).
330+ Int ("updated" , updatedCount ).
331+ Msg ("Finished processing ToolsUpdatedEvent" )
332+
333+ // TODO: Potentially publish another event like 'ToolsProcessed' if other components
334+ // need to know the DB update is complete (e.g., to trigger MCP server tool refresh).
335+ }
336+
337+ // RegisterEventHandlers registers the necessary event handlers for the backend service.
338+ // It performs a type assertion to access the unexported handler methods.
339+ func RegisterEventHandlers (bus events.Bus , serviceInterface Service , logger log.Logger ) {
340+ serviceImpl , ok := serviceInterface .(* service ) // Type assertion to concrete *service
341+ if ! ok {
342+ logger .Fatal ().Msg ("Backend service provided to RegisterEventHandlers is not of expected type *service" )
343+ return // Or panic
344+ }
345+
346+ logger .Info ().Msg ("Registering backend service event handlers..." )
347+ bus .Subscribe (events .ServerStatusChanged , serviceImpl .HandleServerStatusChanged )
348+ bus .Subscribe (events .ToolsUpdated , serviceImpl .HandleToolsUpdated )
349+ }
0 commit comments