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/server/model/room.go

149 lines
3.5 KiB
Go

package model
import (
"errors"
"regexp"
json "github.com/json-iterator/go"
"github.com/gin-gonic/gin"
)
var (
ErrEmptyRoomId = errors.New("empty room id")
ErrRoomIdTooLong = errors.New("room id too long")
ErrRoomIdHasInvalidChar = errors.New("room id has invalid char")
ErrEmptyPassword = errors.New("empty password")
ErrPasswordTooLong = errors.New("password too long")
ErrPasswordHasInvalidChar = errors.New("password has invalid char")
ErrEmptyUsername = errors.New("empty username")
ErrUsernameTooLong = errors.New("username too long")
ErrUsernameHasInvalidChar = errors.New("username has invalid char")
)
var (
alphaNumReg = regexp.MustCompile(`^[a-zA-Z0-9_\-]+$`)
alphaNumChineseReg = regexp.MustCompile(`^[\p{Han}a-zA-Z0-9_\-]+$`)
)
type CreateRoomReq struct {
RoomId string `json:"roomId"`
Password string `json:"password"`
Username string `json:"username"`
UserPassword string `json:"userPassword"`
Hidden bool `json:"hidden"`
}
func (c *CreateRoomReq) Decode(ctx *gin.Context) error {
return json.NewDecoder(ctx.Request.Body).Decode(c)
}
func (c *CreateRoomReq) Validate() error {
if c.RoomId == "" {
return ErrEmptyRoomId
} else if len(c.RoomId) > 32 {
return ErrRoomIdTooLong
} else if !alphaNumChineseReg.MatchString(c.RoomId) {
return ErrRoomIdHasInvalidChar
}
if c.Password != "" {
if len(c.Password) > 32 {
return ErrPasswordTooLong
} else if !alphaNumReg.MatchString(c.Password) {
return ErrPasswordHasInvalidChar
}
}
if c.Username == "" {
return ErrEmptyUsername
} else if len(c.Username) > 32 {
return ErrUsernameTooLong
} else if !alphaNumChineseReg.MatchString(c.Username) {
return ErrUsernameHasInvalidChar
}
if c.UserPassword == "" {
return ErrEmptyPassword
} else if len(c.UserPassword) > 32 {
return ErrPasswordTooLong
} else if !alphaNumReg.MatchString(c.UserPassword) {
return ErrPasswordHasInvalidChar
}
return nil
}
type RoomListResp struct {
RoomId string `json:"roomId"`
PeopleNum int64 `json:"peopleNum"`
NeedPassword bool `json:"needPassword"`
Creator string `json:"creator"`
CreatedAt int64 `json:"createdAt"`
}
type LoginRoomReq struct {
RoomId string `json:"roomId"`
Password string `json:"password"`
Username string `json:"username"`
UserPassword string `json:"userPassword"`
}
func (l *LoginRoomReq) Decode(ctx *gin.Context) error {
return json.NewDecoder(ctx.Request.Body).Decode(l)
}
func (l *LoginRoomReq) Validate() error {
if l.RoomId == "" {
return ErrEmptyRoomId
}
if l.Username == "" {
return ErrEmptyUsername
}
if l.UserPassword == "" {
return ErrEmptyPassword
}
return nil
}
type SetRoomPasswordReq struct {
Password string `json:"password"`
}
func (s *SetRoomPasswordReq) Decode(ctx *gin.Context) error {
return json.NewDecoder(ctx.Request.Body).Decode(s)
}
func (s *SetRoomPasswordReq) Validate() error {
if len(s.Password) > 32 {
return ErrPasswordTooLong
} else if !alphaNumReg.MatchString(s.Password) {
return ErrPasswordHasInvalidChar
}
return nil
}
type UsernameReq struct {
Username string `json:"username"`
}
func (u *UsernameReq) Decode(ctx *gin.Context) error {
return json.NewDecoder(ctx.Request.Body).Decode(u)
}
func (u *UsernameReq) Validate() error {
if u.Username == "" {
return ErrEmptyUsername
} else if len(u.Username) > 32 {
return ErrUsernameTooLong
} else if !alphaNumChineseReg.MatchString(u.Username) {
return ErrUsernameHasInvalidChar
}
return nil
}