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.
synctv/internal/model/room.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,
}
}