package event_handlers import ( "context" "fmt" "log/slog" "strings" "code.tczkiot.com/wlw/ai-agent/internal/events" "code.tczkiot.com/wlw/ai-agent/internal/pkg/dto/request" "code.tczkiot.com/wlw/ai-agent/internal/pkg/eventbus" "code.tczkiot.com/wlw/ai-agent/internal/pkg/i18nx" "code.tczkiot.com/wlw/ai-agent/internal/services" ) func init() { eventbus. Register[events.ConversationAssignedEvent](). Subscribe(handleConversationAssignedInAppNotification) } func handleConversationAssignedInAppNotification(ctx context.Context, event events.ConversationAssignedEvent) error { if event.ConversationID <= 0 || event.ToUserID <= 0 { return nil } conversation := services.ConversationService.Get(event.ConversationID) if conversation == nil { return nil } content := i18nx.Getf(i18nx.DefaultLocale, "notification.conversationAssigned.line", conversation.ID) if summary := strings.TrimSpace(services.ConversationService.BuildConversationSummary(conversation)); summary != "" { content = content + "\n" + summary } if reason := strings.TrimSpace(event.Reason); reason != "" { reasonKey := "notification.conversationAssigned.reason" if strings.TrimSpace(event.AssignType) == events.ConversationAssignTypeTransfer { reasonKey = "notification.conversationTransferred.reason" } content = content + "\n" + i18nx.Getf(i18nx.DefaultLocale, reasonKey, reason) } _, err := services.NotificationService.CreateAndPush(request.CreateNotificationRequest{ RecipientUserID: event.ToUserID, Title: conversationAssignedNotifyTitle(event.AssignType), Content: content, NotificationType: "conversation_assigned", BizType: "conversation", BizID: conversation.ID, ActionURL: fmt.Sprintf("/dashboard/conversations?conversation_id=%d", conversation.ID), }) if err != nil { slog.Error("create conversation assigned in-app notification failed", "error", err, "conversationId", event.ConversationID, "toUserId", event.ToUserID) } return nil }