From 0f07c2a34f2898cb932f6a0e855f3e4c19b95187 Mon Sep 17 00:00:00 2001 From: zijiren233 Date: Tue, 16 Apr 2024 00:06:14 +0800 Subject: [PATCH] Feat: room member cache --- internal/db/member.go | 10 +++++-- internal/op/room.go | 68 ++++++++++++++++++++++++++++++++----------- 2 files changed, 59 insertions(+), 19 deletions(-) diff --git a/internal/db/member.go b/internal/db/member.go index 15c0f41..143f6b8 100644 --- a/internal/db/member.go +++ b/internal/db/member.go @@ -65,7 +65,10 @@ func RoomApprovePendingMember(roomID, userID string) error { if roomMember.Status != model.RoomMemberStatusPending { return fmt.Errorf("user is not pending") } - err = db.Model(&model.RoomMember{}).Where("room_id = ? AND user_id = ? AND status = ?", roomID, userID, model.RoomMemberStatusPending).Update("status", model.RoomMemberStatusActive).Error + err = db.Model(&model.RoomMember{}). + Where("room_id = ? AND user_id = ? AND status = ?", roomID, userID, model.RoomMemberStatusPending). + Update("status", model.RoomMemberStatusActive). + Error if err != nil && gorm.ErrRecordNotFound != err { return fmt.Errorf("update status failed") } @@ -73,7 +76,10 @@ func RoomApprovePendingMember(roomID, userID string) error { } func RoomBanMember(roomID, userID string) error { - err := db.Model(&model.RoomMember{}).Where("room_id = ? AND user_id = ?", roomID, userID).Update("status", model.RoomMemberStatusBanned).Error + err := db.Model(&model.RoomMember{}). + Where("room_id = ? AND user_id = ?", roomID, userID). + Update("status", model.RoomMemberStatusBanned). + Error return HandleNotFound(err, "room or user") } diff --git a/internal/op/room.go b/internal/op/room.go index e77115c..444d1cb 100644 --- a/internal/op/room.go +++ b/internal/op/room.go @@ -10,6 +10,7 @@ import ( "github.com/synctv-org/synctv/internal/db" "github.com/synctv-org/synctv/internal/model" "github.com/synctv-org/synctv/utils" + "github.com/zijiren233/gencontainer/rwmap" rtmps "github.com/zijiren233/livelib/server" "github.com/zijiren233/stream" "golang.org/x/crypto/bcrypt" @@ -22,6 +23,7 @@ type Room struct { initOnce utils.Once hub *Hub movies movies + members rwmap.RWMap[string, *model.RoomMember] } func (r *Room) lazyInitHub() { @@ -153,6 +155,10 @@ func (r *Room) HasPermission(userID string, permission model.RoomMemberPermissio } func (r *Room) LoadOrCreateRoomMember(userID string) (*model.RoomMember, error) { + member, ok := r.members.Load(userID) + if ok { + return member, nil + } var conf []db.CreateRoomMemberRelationConfig if r.CreatorID == userID { conf = append( @@ -173,18 +179,47 @@ func (r *Room) LoadOrCreateRoomMember(userID string) (*model.RoomMember, error) conf = append(conf, db.WithRoomMemberStatus(model.RoomMemberStatusActive)) } } - return db.FirstOrCreateRoomMemberRelation(r.ID, userID, conf...) + member, err := db.FirstOrCreateRoomMemberRelation(r.ID, userID, conf...) + if err != nil { + return nil, err + } + member, _ = r.members.LoadOrStore(userID, member) + return member, nil +} + +func (r *Room) LoadRoomMember(userID string) (*model.RoomMember, error) { + member, ok := r.members.Load(userID) + if ok { + return member, nil + } + member, err := db.GetRoomMemberRelation(r.ID, userID) + if err != nil { + return nil, err + } + member, _ = r.members.LoadOrStore(userID, member) + return member, nil } func (r *Room) GetRoomMemberPermission(userID string) (model.RoomMemberPermission, error) { - if r.CreatorID == userID { + if r.IsCreator(userID) { return model.AllPermissions, nil } - ur, err := db.GetRoomMemberRelation(r.ID, userID) + member, err := r.LoadRoomMember(userID) if err != nil { - return 0, err + return model.NoPermission, err } - return ur.Permissions, nil + return member.Permissions, nil +} + +func (r *Room) GetRoomAdminPermission(userID string) (model.RoomAdminPermission, error) { + if r.IsCreator(userID) { + return model.AllAdminPermissions, nil + } + member, err := r.LoadRoomMember(userID) + if err != nil { + return model.NoAdminPermission, err + } + return member.AdminPermissions, nil } func (r *Room) NeedPassword() bool { @@ -208,18 +243,6 @@ func (r *Room) SetPassword(password string) error { return db.SetRoomHashedPassword(r.ID, hashedPassword) } -func (r *Room) SetUserPermission(userID string, permission model.RoomMemberPermission) error { - return db.SetMemberPermissions(r.ID, userID, permission) -} - -func (r *Room) AddUserPermission(userID string, permission model.RoomMemberPermission) error { - return db.AddMemberPermissions(r.ID, userID, permission) -} - -func (r *Room) RemoveUserPermission(userID string, permission model.RoomMemberPermission) error { - return db.RemoveMemberPermissions(r.ID, userID, permission) -} - func (r *Room) GetMoviesCount() int { return r.movies.Len() } @@ -347,26 +370,32 @@ func (r *Room) ResetMemberPermissions(userID string) error { } func (r *Room) SetMemberPermissions(userID string, permissions model.RoomMemberPermission) error { + defer r.members.Delete(userID) return db.SetMemberPermissions(r.ID, userID, permissions) } func (r *Room) AddMemberPermissions(userID string, permissions model.RoomMemberPermission) error { + defer r.members.Delete(userID) return db.AddMemberPermissions(r.ID, userID, permissions) } func (r *Room) RemoveMemberPermissions(userID string, permissions model.RoomMemberPermission) error { + defer r.members.Delete(userID) return db.RemoveMemberPermissions(r.ID, userID, permissions) } func (r *Room) ApprovePendingMember(userID string) error { + defer r.members.Delete(userID) return db.RoomApprovePendingMember(r.ID, userID) } func (r *Room) BanMember(userID string) error { + defer r.members.Delete(userID) return db.RoomBanMember(r.ID, userID) } func (r *Room) UnbanMember(userID string) error { + defer r.members.Delete(userID) return db.RoomUnbanMember(r.ID, userID) } @@ -375,21 +404,26 @@ func (r *Room) ResetAdminPermissions(userID string) error { } func (r *Room) SetAdminPermissions(userID string, permissions model.RoomAdminPermission) error { + defer r.members.Delete(userID) return db.RoomSetAdminPermissions(r.ID, userID, permissions) } func (r *Room) AddAdminPermissions(userID string, permissions model.RoomAdminPermission) error { + defer r.members.Delete(userID) return db.RoomSetAdminPermissions(r.ID, userID, permissions) } func (r *Room) RemoveAdminPermissions(userID string, permissions model.RoomAdminPermission) error { + defer r.members.Delete(userID) return db.RoomSetAdminPermissions(r.ID, userID, 0) } func (r *Room) SetAdmin(userID string, permissions model.RoomAdminPermission) error { + defer r.members.Delete(userID) return db.RoomSetAdmin(r.ID, userID, permissions) } func (r *Room) SetMember(userID string, permissions model.RoomMemberPermission) error { + defer r.members.Delete(userID) return db.RoomSetMember(r.ID, userID, permissions) }