mirror of https://github.com/synctv-org/synctv
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
3.7 KiB
Go
111 lines
3.7 KiB
Go
package model
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/synctv-org/synctv/utils"
|
|
"github.com/zijiren233/stream"
|
|
"golang.org/x/crypto/bcrypt"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type RoomStatus uint8
|
|
|
|
const (
|
|
RoomStatusBanned RoomStatus = 1
|
|
RoomStatusPending RoomStatus = 2
|
|
RoomStatusActive RoomStatus = 3
|
|
)
|
|
|
|
func (r RoomStatus) String() string {
|
|
switch r {
|
|
case RoomStatusBanned:
|
|
return "banned"
|
|
case RoomStatusPending:
|
|
return "pending"
|
|
case RoomStatusActive:
|
|
return "active"
|
|
default:
|
|
return "unknown"
|
|
}
|
|
}
|
|
|
|
type Room struct {
|
|
ID string `gorm:"primaryKey;type:char(32)" json:"id"`
|
|
CreatedAt time.Time
|
|
UpdatedAt time.Time
|
|
Settings *RoomSettings `gorm:"foreignKey:ID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE" json:"settings"`
|
|
Name string `gorm:"not null;uniqueIndex;type:varchar(32)"`
|
|
CreatorID string `gorm:"index;type:char(32)"`
|
|
HashedPassword []byte
|
|
RoomMembers []*RoomMember `gorm:"foreignKey:RoomID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"`
|
|
Movies []*Movie `gorm:"foreignKey:RoomID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"`
|
|
Status RoomStatus `gorm:"not null;default:2"`
|
|
Current *Current `gorm:"serializer:fastjson"`
|
|
}
|
|
|
|
func (r *Room) BeforeCreate(tx *gorm.DB) error {
|
|
if r.ID == "" {
|
|
r.ID = utils.SortUUID()
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (r *Room) NeedPassword() bool {
|
|
return len(r.HashedPassword) != 0
|
|
}
|
|
|
|
func (r *Room) CheckPassword(password string) bool {
|
|
return !r.NeedPassword() || bcrypt.CompareHashAndPassword(r.HashedPassword, stream.StringToBytes(password)) == nil
|
|
}
|
|
|
|
func (r *Room) IsBanned() bool {
|
|
return r.Status == RoomStatusBanned
|
|
}
|
|
|
|
func (r *Room) IsPending() bool {
|
|
return r.Status == RoomStatusPending
|
|
}
|
|
|
|
func (r *Room) IsActive() bool {
|
|
return r.Status == RoomStatusActive
|
|
}
|
|
|
|
//nolint:tagliatelle
|
|
type RoomSettings struct {
|
|
UpdatedAt time.Time `gorm:"autoUpdateTime" json:"-"`
|
|
ID string `gorm:"primaryKey;type:char(32)" json:"-"`
|
|
UserDefaultPermissions RoomMemberPermission `json:"user_default_permissions"`
|
|
GuestPermissions RoomMemberPermission `json:"guest_permissions"`
|
|
DisableGuest bool `gorm:"default:false" json:"disable_guest"`
|
|
JoinNeedReview bool `gorm:"default:false" json:"join_need_review"`
|
|
DisableJoinNewUser bool `gorm:"default:false" json:"disable_join_new_user"`
|
|
Hidden bool `gorm:"default:false" json:"hidden"`
|
|
CanGetMovieList bool `gorm:"default:true" json:"can_get_movie_list"`
|
|
CanAddMovie bool `gorm:"default:true" json:"can_add_movie"`
|
|
CanDeleteMovie bool `gorm:"default:true" json:"can_delete_movie"`
|
|
CanEditMovie bool `gorm:"default:true" json:"can_edit_movie"`
|
|
CanSetCurrentMovie bool `gorm:"default:true" json:"can_set_current_movie"`
|
|
CanSetCurrentStatus bool `gorm:"default:true" json:"can_set_current_status"`
|
|
CanSendChatMessage bool `gorm:"default:true" json:"can_send_chat_message"`
|
|
}
|
|
|
|
func DefaultRoomSettings() *RoomSettings {
|
|
return &RoomSettings{
|
|
Hidden: false,
|
|
DisableJoinNewUser: false,
|
|
JoinNeedReview: false,
|
|
UserDefaultPermissions: DefaultPermissions,
|
|
DisableGuest: false,
|
|
GuestPermissions: NoPermission,
|
|
|
|
CanGetMovieList: true,
|
|
CanAddMovie: true,
|
|
CanDeleteMovie: true,
|
|
CanEditMovie: true,
|
|
CanSetCurrentMovie: true,
|
|
CanSetCurrentStatus: true,
|
|
CanSendChatMessage: true,
|
|
}
|
|
}
|