session_repositroy.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package repositories
  2. import (
  3. "context"
  4. "github.com/mitchellh/mapstructure"
  5. "github.com/rotisserie/eris"
  6. "gorm.io/gorm"
  7. "sikey.com/websocket/models"
  8. )
  9. var _ SessionRepository = (*sessionRepository)(nil)
  10. type SessionRepository interface {
  11. sessionMemberRepository
  12. sessionMessageRepository
  13. // GetJoinedSessions 获取加入的 session
  14. GetJoinedSessions(ctx context.Context, accountId string) ([]models.Session, error)
  15. }
  16. type sessionMemberRepository interface {
  17. // GetSessionMembers 获取 session 下的成员信息
  18. GetSessionMembers(ctx context.Context, sessionId string) ([]models.SessionMember, error)
  19. // GetSessionMembersRemoveOneself 获取 session 下的成员信息,排除自己
  20. GetSessionMembersRemoveOneself(ctx context.Context, sessionId, accountId string) ([]models.SessionMember, error)
  21. }
  22. type sessionMessageRepository interface {
  23. // FindMessageById 根据消息ID查询消息
  24. FindMessageById(ctx context.Context, msgId string) (*models.SessionMessage, error)
  25. // CreateMessage 存消息
  26. CreateMessage(ctx context.Context, message *models.SessionMessage) error
  27. // UpdateMessage 修改消息内容
  28. UpdateMessage(ctx context.Context, message *models.SessionMessage) error
  29. }
  30. type sessionRepository struct {
  31. source *gorm.DB
  32. }
  33. // FindMessageById implements SessionRepository.
  34. func (repo *sessionRepository) FindMessageById(ctx context.Context, msgId string) (*models.SessionMessage, error) {
  35. var err error
  36. var message models.SessionMessage
  37. err = repo.source.WithContext(ctx).
  38. Where(&models.SessionMessage{ID: msgId}).
  39. First(&message).
  40. Error
  41. return &message, err
  42. }
  43. // UpdateMessage implements SessionRepository.
  44. func (repo *sessionRepository) UpdateMessage(ctx context.Context, message *models.SessionMessage) error {
  45. var messageMap map[string]interface{}
  46. if err := mapstructure.Decode(message, &messageMap); err != nil {
  47. return eris.Wrap(err, "mapstructure.Decode error")
  48. }
  49. return repo.source.WithContext(ctx).Where(&models.SessionMessage{ID: message.ID}).Updates(messageMap).Error
  50. }
  51. // CreateMessage implements SessionRepository.
  52. func (repo *sessionRepository) CreateMessage(ctx context.Context, message *models.SessionMessage) error {
  53. return repo.source.WithContext(ctx).Create(message).Error
  54. }
  55. // GetSessionMembersRemoveOneself implements SessionRepository.
  56. func (repo *sessionRepository) GetSessionMembersRemoveOneself(ctx context.Context, sessionId string, accountId string) ([]models.SessionMember, error) {
  57. var err error
  58. var members []models.SessionMember
  59. err = repo.source.WithContext(ctx).
  60. Where(&models.SessionMember{SessionId: sessionId}).
  61. Not(&models.SessionMember{RefId: accountId}).
  62. Group("ref_id").
  63. Find(&members).Error
  64. switch {
  65. case err == nil:
  66. return members, nil
  67. case eris.Is(err, gorm.ErrRecordNotFound):
  68. return make([]models.SessionMember, 0), nil
  69. default:
  70. return nil, err
  71. }
  72. }
  73. // GetSessionMembers implements SessionRepository.
  74. func (repo *sessionRepository) GetSessionMembers(ctx context.Context, sessionId string) ([]models.SessionMember, error) {
  75. var err error
  76. var members []models.SessionMember
  77. err = repo.source.WithContext(ctx).Where(&models.SessionMember{SessionId: sessionId}).Find(&members).Error
  78. switch {
  79. case err == nil:
  80. return members, nil
  81. case eris.Is(err, gorm.ErrRecordNotFound):
  82. return make([]models.SessionMember, 0), nil
  83. default:
  84. return nil, err
  85. }
  86. }
  87. // GetJoinedSessions implements SessionRepository.
  88. func (repo *sessionRepository) GetJoinedSessions(ctx context.Context, accountId string) ([]models.Session, error) {
  89. var err error
  90. var sessions []models.Session
  91. err = repo.source.WithContext(ctx).Where("id in (?)", repo.source.
  92. WithContext(ctx).
  93. Select("session_id").
  94. Where(&models.SessionMember{RefId: accountId}).Table("tb_session_member")).Find(&sessions).Error
  95. switch {
  96. case err == nil:
  97. return sessions, nil
  98. case eris.Is(err, gorm.ErrRecordNotFound):
  99. return make([]models.Session, 0), nil
  100. default:
  101. return nil, err
  102. }
  103. }
  104. func NewSessionRepository(source *gorm.DB) SessionRepository {
  105. return &sessionRepository{source: source}
  106. }