session_repositroy.go 3.9 KB

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