diff --git a/internal/model/member.go b/internal/model/member.go index 099b8db..cf0a406 100644 --- a/internal/model/member.go +++ b/internal/model/member.go @@ -151,25 +151,27 @@ type RoomMember struct { var ErrNoPermission = errors.New("no permission") func (r *RoomMember) HasPermission(permission RoomMemberPermission) bool { - switch r.Status { - case RoomMemberStatusActive: - return r.Permissions.Has(permission) - default: + if r.Role.IsAdmin() { + return true + } + if !r.Role.IsMember() { + return false + } + if r.Status != RoomMemberStatusActive { return false } + return r.Permissions.Has(permission) } func (r *RoomMember) HasAdminPermission(permission RoomAdminPermission) bool { - switch r.Status { - case RoomMemberStatusActive: - if !r.Role.IsAdmin() { - return false - } - if r.Role.IsCreator() { - return true - } - return r.AdminPermissions.Has(permission) - default: + if r.Role.IsCreator() { + return true + } + if !r.Role.IsAdmin() { + return false + } + if r.Status != RoomMemberStatusActive { return false } + return r.AdminPermissions.Has(permission) } diff --git a/internal/op/room.go b/internal/op/room.go index c99a218..ac5414d 100644 --- a/internal/op/room.go +++ b/internal/op/room.go @@ -134,21 +134,30 @@ func (r *Room) HasPermission(userID string, permission model.RoomMemberPermissio return true } - switch permission { - + switch { + case permission.Has(model.PermissionGetMovieList) && !r.Settings.CanGetMovieList, + permission.Has(model.PermissionAddMovie) && !r.Settings.CanAddMovie, + permission.Has(model.PermissionDeleteMovie) && !r.Settings.CanDeleteMovie, + permission.Has(model.PermissionEditMovie) && !r.Settings.CanEditMovie, + permission.Has(model.PermissionSetCurrentMovie) && !r.Settings.CanSetCurrentMovie, + permission.Has(model.PermissionSetCurrentStatus) && !r.Settings.CanSetCurrentStatus, + permission.Has(model.PermissionSendChatMessage) && !r.Settings.CanSendChatMessage: + return false + default: + return rur.Permissions.Has(permission) } - - return rur.HasPermission(permission) } func (r *Room) HasAdminPermission(userID string, permission model.RoomAdminPermission) bool { if r.CreatorID == userID { return true } + rur, err := r.LoadOrCreateRoomMember(userID) if err != nil { return false } + return rur.HasAdminPermission(permission) }