설명 없음
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.

mapping.go 5.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. package menu
  2. import (
  3. "context"
  4. "errors"
  5. "time"
  6. "git.x2erp.com/qdy/go-base/logger"
  7. "git.x2erp.com/qdy/go-db/factory/mongodb"
  8. "go.mongodb.org/mongo-driver/bson"
  9. "go.mongodb.org/mongo-driver/bson/primitive"
  10. )
  11. // SessionMenuMapping 会话-菜单映射结构
  12. type SessionMenuMapping struct {
  13. ID primitive.ObjectID `bson:"_id,omitempty" json:"id,omitempty"`
  14. SessionID string `bson:"session_id" json:"session_id"` // 会话ID
  15. MenuItemID string `bson:"menu_item_id" json:"menu_item_id"` // 菜单项ID
  16. UserID string `bson:"user_id" json:"user_id"` // 用户ID
  17. TenantID string `bson:"tenant_id" json:"tenant_id"` // 租户ID
  18. CreatedAt time.Time `bson:"created_at" json:"created_at"` // 创建时间
  19. }
  20. // CollectionName 返回MongoDB集合名称
  21. func (SessionMenuMapping) CollectionName() string {
  22. return "session_menu_mappings"
  23. }
  24. // MappingService 会话-菜单映射服务
  25. type MappingService struct {
  26. mongoFactory *mongodb.MongoDBFactory
  27. }
  28. // NewMappingService 创建新的映射服务
  29. func NewMappingService(factory *mongodb.MongoDBFactory) *MappingService {
  30. return &MappingService{mongoFactory: factory}
  31. }
  32. // CreateMapping 创建会话-菜单映射
  33. func (s *MappingService) CreateMapping(ctx context.Context, sessionID, menuItemID, userID, tenantID string) error {
  34. mapping := SessionMenuMapping{
  35. SessionID: sessionID,
  36. MenuItemID: menuItemID,
  37. UserID: userID,
  38. TenantID: tenantID,
  39. CreatedAt: time.Now(),
  40. }
  41. _, success := s.mongoFactory.InsertOneWithResult(SessionMenuMapping{}.CollectionName(), mapping)
  42. if !success {
  43. logger.Error("创建会话-菜单映射失败", "session_id", sessionID, "menu_item_id", menuItemID)
  44. return errors.New("failed to create session-menu mapping")
  45. }
  46. logger.Debug("创建会话-菜单映射成功", "session_id", sessionID, "menu_item_id", menuItemID)
  47. return nil
  48. }
  49. // GetMenuItemBySessionID 根据会话ID获取菜单项ID
  50. func (s *MappingService) GetMenuItemBySessionID(ctx context.Context, sessionID string) (string, error) {
  51. filter := bson.M{"session_id": sessionID}
  52. var mapping SessionMenuMapping
  53. err := s.mongoFactory.FindOne(SessionMenuMapping{}.CollectionName(), filter, &mapping)
  54. if err != nil {
  55. if err.Error() == "mongo: no documents in result" {
  56. return "", nil // 未找到映射,返回空字符串
  57. }
  58. logger.Error("根据会话ID查询菜单项失败", "session_id", sessionID, "error", err)
  59. return "", err
  60. }
  61. return mapping.MenuItemID, nil
  62. }
  63. // GetSessionIDsByMenuItemID 根据菜单项ID获取会话ID列表
  64. func (s *MappingService) GetSessionIDsByMenuItemID(ctx context.Context, menuItemID, userID string) ([]string, error) {
  65. filter := bson.M{"menu_item_id": menuItemID, "user_id": userID}
  66. var mappings []SessionMenuMapping
  67. err := s.mongoFactory.Find(SessionMenuMapping{}.CollectionName(), filter, &mappings)
  68. if err != nil {
  69. logger.Error("根据菜单项ID查询会话ID失败", "menu_item_id", menuItemID, "error", err)
  70. return nil, err
  71. }
  72. sessionIDs := make([]string, 0, len(mappings))
  73. for _, mapping := range mappings {
  74. sessionIDs = append(sessionIDs, mapping.SessionID)
  75. }
  76. return sessionIDs, nil
  77. }
  78. // GetMappingsByUser 获取用户的所有会话-菜单映射
  79. func (s *MappingService) GetMappingsByUser(ctx context.Context, userID string) (map[string]string, error) {
  80. filter := bson.M{"user_id": userID}
  81. var mappings []SessionMenuMapping
  82. err := s.mongoFactory.Find(SessionMenuMapping{}.CollectionName(), filter, &mappings)
  83. if err != nil {
  84. logger.Error("查询用户会话-菜单映射失败", "user_id", userID, "error", err)
  85. return nil, err
  86. }
  87. result := make(map[string]string)
  88. for _, mapping := range mappings {
  89. result[mapping.SessionID] = mapping.MenuItemID
  90. }
  91. return result, nil
  92. }
  93. // DeleteMappingBySessionID 根据会话ID删除映射
  94. func (s *MappingService) DeleteMappingBySessionID(ctx context.Context, sessionID string) error {
  95. filter := bson.M{"session_id": sessionID}
  96. success, deletedCount := s.mongoFactory.DeleteOne(SessionMenuMapping{}.CollectionName(), filter)
  97. if !success {
  98. logger.Error("根据会话ID删除映射失败", "session_id", sessionID)
  99. return errors.New("failed to delete session-menu mapping")
  100. }
  101. logger.Debug("删除会话-菜单映射成功", "session_id", sessionID, "deleted_count", deletedCount)
  102. return nil
  103. }
  104. // EnsureIndexes 确保集合索引
  105. func (s *MappingService) EnsureIndexes(ctx context.Context) error {
  106. // 创建会话ID唯一索引
  107. sessionIDIndexKeys := bson.D{{Key: "session_id", Value: 1}}
  108. sessionIDSuccess := s.mongoFactory.CreateIndex(SessionMenuMapping{}.CollectionName(), sessionIDIndexKeys)
  109. if !sessionIDSuccess {
  110. logger.Error("创建会话ID索引失败")
  111. return errors.New("failed to create session_id index")
  112. }
  113. // 创建复合索引:菜单项ID + 用户ID
  114. menuItemUserIndexKeys := bson.D{
  115. {Key: "menu_item_id", Value: 1},
  116. {Key: "user_id", Value: 1},
  117. }
  118. menuItemUserSuccess := s.mongoFactory.CreateIndex(SessionMenuMapping{}.CollectionName(), menuItemUserIndexKeys)
  119. if !menuItemUserSuccess {
  120. logger.Error("创建菜单项用户复合索引失败")
  121. return errors.New("failed to create menu_item_id-user_id index")
  122. }
  123. logger.Debug("会话-菜单映射索引创建成功")
  124. return nil
  125. }