123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- package repositories
- import (
- "context"
- "github.com/mitchellh/mapstructure"
- "github.com/rotisserie/eris"
- "gorm.io/gorm"
- "sikey.com/websocket/models"
- )
- var _ SessionRepository = (*sessionRepository)(nil)
- type SessionRepository interface {
- sessionMemberRepository
- sessionMessageRepository
- // GetJoinedSessions 获取加入的 session
- GetJoinedSessions(ctx context.Context, accountId string) ([]models.Session, error)
- }
- type sessionMemberRepository interface {
- // GetSessionMembers 获取 session 下的成员信息
- GetSessionMembers(ctx context.Context, sessionId string) ([]models.SessionMember, error)
- // GetSessionMembersRemoveOneself 获取 session 下的成员信息,排除自己
- GetSessionMembersRemoveOneself(ctx context.Context, sessionId, accountId string) ([]models.SessionMember, error)
- }
- type sessionMessageRepository interface {
- // FindMessageById 根据消息ID查询消息
- FindMessageById(ctx context.Context, msgId string) (*models.SessionMessage, error)
- // CreateMessage 存消息
- CreateMessage(ctx context.Context, message *models.SessionMessage) error
- // UpdateMessage 修改消息内容
- UpdateMessage(ctx context.Context, message *models.SessionMessage) error
- }
- type sessionRepository struct {
- source *gorm.DB
- }
- // FindMessageById implements SessionRepository.
- func (repo *sessionRepository) FindMessageById(ctx context.Context, msgId string) (*models.SessionMessage, error) {
- var err error
- var message models.SessionMessage
- err = repo.source.WithContext(ctx).
- Where(&models.SessionMessage{ID: msgId}).
- First(&message).
- Error
- return &message, err
- }
- // UpdateMessage implements SessionRepository.
- func (repo *sessionRepository) UpdateMessage(ctx context.Context, message *models.SessionMessage) error {
- var messageMap map[string]interface{}
- if err := mapstructure.Decode(message, &messageMap); err != nil {
- return eris.Wrap(err, "mapstructure.Decode error")
- }
- return repo.source.WithContext(ctx).Where(&models.SessionMessage{ID: message.ID}).Updates(messageMap).Error
- }
- // CreateMessage implements SessionRepository.
- func (repo *sessionRepository) CreateMessage(ctx context.Context, message *models.SessionMessage) error {
- return repo.source.WithContext(ctx).Create(message).Error
- }
- // GetSessionMembersRemoveOneself implements SessionRepository.
- func (repo *sessionRepository) GetSessionMembersRemoveOneself(ctx context.Context, sessionId string, accountId string) ([]models.SessionMember, error) {
- var err error
- var members []models.SessionMember
- err = repo.source.WithContext(ctx).
- Where(&models.SessionMember{SessionId: sessionId}).
- Not(&models.SessionMember{RefId: accountId}).
- Group("ref_id").
- Find(&members).Error
- switch {
- case err == nil:
- return members, nil
- case eris.Is(err, gorm.ErrRecordNotFound):
- return make([]models.SessionMember, 0), nil
- default:
- return nil, err
- }
- }
- // GetSessionMembers implements SessionRepository.
- func (repo *sessionRepository) GetSessionMembers(ctx context.Context, sessionId string) ([]models.SessionMember, error) {
- var err error
- var members []models.SessionMember
- err = repo.source.WithContext(ctx).Where(&models.SessionMember{SessionId: sessionId}).Find(&members).Error
- switch {
- case err == nil:
- return members, nil
- case eris.Is(err, gorm.ErrRecordNotFound):
- return make([]models.SessionMember, 0), nil
- default:
- return nil, err
- }
- }
- // GetJoinedSessions implements SessionRepository.
- func (repo *sessionRepository) GetJoinedSessions(ctx context.Context, accountId string) ([]models.Session, error) {
- var err error
- var sessions []models.Session
- err = repo.source.WithContext(ctx).Where("id in (?)", repo.source.
- WithContext(ctx).
- Select("session_id").
- Where(&models.SessionMember{RefId: accountId}).Table("tb_session_member")).Find(&sessions).Error
- switch {
- case err == nil:
- return sessions, nil
- case eris.Is(err, gorm.ErrRecordNotFound):
- return make([]models.Session, 0), nil
- default:
- return nil, err
- }
- }
- func NewSessionRepository(source *gorm.DB) SessionRepository {
- return &sessionRepository{source: source}
- }
|