Ingen beskrivning
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

subscription_service.go 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. package event
  2. import (
  3. "fmt"
  4. "sync"
  5. "git.x2erp.com/qdy/go-base/ctx"
  6. "git.x2erp.com/qdy/go-base/logger"
  7. "git.x2erp.com/qdy/go-db/factory/mongodb"
  8. )
  9. // SubscriptionService 订阅服务,负责管理事件订阅并记录相关日志
  10. type SubscriptionService struct {
  11. dispatcher *EventDispatcher
  12. mongoFactory *mongodb.MongoDBFactory
  13. }
  14. // NewSubscriptionService 创建新的订阅服务
  15. func NewSubscriptionService(dispatcher *EventDispatcher, mongoFactory *mongodb.MongoDBFactory) *SubscriptionService {
  16. return &SubscriptionService{
  17. dispatcher: dispatcher,
  18. mongoFactory: mongoFactory,
  19. }
  20. }
  21. // SubscribeWithContext 使用上下文信息订阅会话事件
  22. func (s *SubscriptionService) SubscribeWithContext(sessionID string, reqCtx *ctx.RequestContext) (<-chan string, error) {
  23. // 提取用户ID(优先使用reqCtx.UserID,如果为空则使用Username)
  24. userID := reqCtx.UserID
  25. if userID == "" {
  26. userID = reqCtx.Username
  27. }
  28. if userID == "" {
  29. userID = "unknown-user"
  30. }
  31. // 记录详细的调试日志
  32. logger.Debug(fmt.Sprintf("🔔 订阅服务: 开始订阅 sessionID=%s, userID=%s, tenantID=%s, traceID=%s",
  33. sessionID, userID, reqCtx.TenantID, reqCtx.TraceID))
  34. // 调用事件分发器的Subscribe方法
  35. ch, err := s.dispatcher.Subscribe(sessionID, userID)
  36. if err != nil {
  37. logger.Error(fmt.Sprintf("❌ 订阅服务: 订阅失败 sessionID=%s, error=%v", sessionID, err))
  38. return nil, err
  39. }
  40. // 记录成功的订阅信息
  41. logger.Info(fmt.Sprintf("✅ 订阅服务: 订阅成功 sessionID=%s, userID=%s, tenantID=%s",
  42. sessionID, userID, reqCtx.TenantID))
  43. // 这里可以扩展:将订阅信息保存到MongoDB
  44. // 例如:s.saveSubscriptionToDB(sessionID, reqCtx)
  45. // 对于调试,记录MongoDB工厂状态
  46. if s.mongoFactory != nil {
  47. logger.Debug(fmt.Sprintf("🔍 订阅服务: MongoDB工厂可用 sessionID=%s", sessionID))
  48. // 可以测试连接或执行其他操作
  49. } else {
  50. logger.Debug(fmt.Sprintf("⚠️ 订阅服务: MongoDB工厂未配置 sessionID=%s", sessionID))
  51. }
  52. return ch, nil
  53. }
  54. // UnsubscribeWithContext 使用上下文信息取消订阅
  55. func (s *SubscriptionService) UnsubscribeWithContext(sessionID string, ch <-chan string, reqCtx *ctx.RequestContext) {
  56. // 记录取消订阅日志
  57. logger.Debug(fmt.Sprintf("🔔 订阅服务: 取消订阅 sessionID=%s, userID=%s, traceID=%s",
  58. sessionID, reqCtx.UserID, reqCtx.TraceID))
  59. s.dispatcher.Unsubscribe(sessionID, ch)
  60. // 这里可以扩展:更新MongoDB中的订阅状态
  61. // 例如:s.updateSubscriptionStatus(sessionID, "unsubscribed")
  62. logger.Info(fmt.Sprintf("✅ 订阅服务: 已取消订阅 sessionID=%s", sessionID))
  63. }
  64. // RegisterSessionWithContext 使用上下文信息注册会话
  65. func (s *SubscriptionService) RegisterSessionWithContext(sessionID string, reqCtx *ctx.RequestContext) {
  66. userID := reqCtx.UserID
  67. if userID == "" {
  68. userID = reqCtx.Username
  69. }
  70. if userID == "" {
  71. userID = "unknown-user"
  72. }
  73. logger.Debug(fmt.Sprintf("🔔 订阅服务: 注册会话 sessionID=%s, userID=%s, tenantID=%s",
  74. sessionID, userID, reqCtx.TenantID))
  75. s.dispatcher.RegisterSession(sessionID, userID)
  76. // 这里可以扩展:将会话注册信息保存到MongoDB
  77. logger.Info(fmt.Sprintf("✅ 订阅服务: 会话已注册 sessionID=%s", sessionID))
  78. }
  79. // GetSubscriptionStats 获取订阅统计信息(用于调试和监控)
  80. func (s *SubscriptionService) GetSubscriptionStats() map[string]interface{} {
  81. // 这里可以扩展:从MongoDB获取订阅统计
  82. // 目前返回基本信息
  83. stats := map[string]interface{}{
  84. "service": "SubscriptionService",
  85. "status": "active",
  86. "mongoDB": s.mongoFactory != nil,
  87. }
  88. logger.Debug(fmt.Sprintf("📊 订阅服务: 获取统计信息 stats=%+v", stats))
  89. return stats
  90. }
  91. // saveSubscriptionToDB 将订阅信息保存到MongoDB(待扩展)
  92. func (s *SubscriptionService) saveSubscriptionToDB(sessionID string, reqCtx *ctx.RequestContext) {
  93. // 待实现:将订阅信息保存到MongoDB
  94. // 可以记录:sessionID, userID, tenantID, subscriptionTime, status等
  95. logger.Debug(fmt.Sprintf("💾 订阅服务: 待实现 - 保存订阅信息到数据库 sessionID=%s", sessionID))
  96. }
  97. // updateSubscriptionStatus 更新MongoDB中的订阅状态(待扩展)
  98. func (s *SubscriptionService) updateSubscriptionStatus(sessionID string, status string) {
  99. // 待实现:更新订阅状态
  100. logger.Debug(fmt.Sprintf("💾 订阅服务: 待实现 - 更新订阅状态 sessionID=%s, status=%s", sessionID, status))
  101. }
  102. // 单例模式
  103. var (
  104. subscriptionServiceInstance *SubscriptionService
  105. subscriptionServiceOnce sync.Once
  106. )
  107. // InitSubscriptionService 初始化订阅服务单例
  108. func InitSubscriptionService(dispatcher *EventDispatcher, mongoFactory *mongodb.MongoDBFactory) {
  109. subscriptionServiceOnce.Do(func() {
  110. subscriptionServiceInstance = NewSubscriptionService(dispatcher, mongoFactory)
  111. logger.Info("✅ 订阅服务单例已初始化")
  112. })
  113. }
  114. // GetSubscriptionService 获取订阅服务单例
  115. func GetSubscriptionService() *SubscriptionService {
  116. if subscriptionServiceInstance == nil {
  117. logger.Warn("⚠️ 订阅服务单例未初始化,返回nil")
  118. }
  119. return subscriptionServiceInstance
  120. }