Feat: logout user auto del room

pull/21/head
zijiren233 2 years ago
parent 79c05699a2
commit 92fdbc31be

@ -19,7 +19,7 @@ func WithSetting(setting model.Setting) CreateRoomConfig {
func WithCreator(creator *model.User) CreateRoomConfig {
return func(r *model.Room) {
r.Creator = *creator
r.CreatorID = creator.ID
r.GroupUserRelations = []model.RoomUserRelation{
{
UserID: creator.ID,
@ -174,3 +174,12 @@ func GetAllRoomsAndCreator() ([]*model.Room, error) {
}
return rooms, err
}
func GetAllRoomsByUserID(userID uint) ([]*model.Room, error) {
rooms := []*model.Room{}
err := db.Where("creator_id = ?", userID).Find(&rooms).Error
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
return rooms, nil
}
return rooms, err
}

@ -85,7 +85,10 @@ func DeleteUserByID(userID uint) error {
func LoadAndDeleteUserByID(userID uint, columns ...clause.Column) (*model.User, error) {
u := &model.User{}
err := db.Unscoped().Clauses(clause.Returning{Columns: columns}).Delete(u, userID).Error
err := db.Unscoped().
Clauses(clause.Returning{Columns: columns}).
Delete(u, userID).
Error
if errors.Is(err, gorm.ErrRecordNotFound) {
return u, errors.New("user not found")
}

@ -6,16 +6,15 @@ import (
type Movie struct {
gorm.Model
Position uint `gorm:"not null"`
RoomID uint `gorm:"not null;index"`
Room Room `gorm:"foreignKey:RoomID"`
Position uint `gorm:"not null"`
RoomID uint `gorm:"not null;index"`
CreatorID uint `gorm:"not null;index" json:"creatorId"`
MovieInfo
}
type MovieInfo struct {
BaseMovieInfo
PullKey string `json:"pullKey"`
CreatorID uint `gorm:"not null;index" json:"creatorId"`
PullKey string `json:"pullKey"`
}
type BaseMovieInfo struct {

@ -11,7 +11,6 @@ type Room struct {
Name string `gorm:"not null;uniqueIndex"`
Setting
CreatorID uint `gorm:"index"`
Creator User `gorm:"foreignKey:CreatorID;constraint:OnUpdate:CASCADE,OnDelete:SET NULL"`
HashedPassword []byte
GroupUserRelations []RoomUserRelation `gorm:"foreignKey:RoomID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"`
Movies []Movie `gorm:"foreignKey:RoomID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"`

@ -12,6 +12,7 @@ const (
RoleBanned Role = iota
RoleUser
RoleAdmin
RoleRoot
)
type User struct {
@ -20,6 +21,7 @@ type User struct {
Role Role `gorm:"not null"`
HashedPassword []byte
GroupUserRelations []RoomUserRelation `gorm:"foreignKey:UserID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"`
Rooms []Room `gorm:"foreignKey:CreatorID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"`
Movies []Movie `gorm:"foreignKey:CreatorID;constraint:OnUpdate:CASCADE,OnDelete:SET NULL"`
}

@ -100,7 +100,7 @@ func (c *Current) Proto() *pb.Current {
},
PullKey: c.Movie.PullKey,
CreatedAt: c.Movie.CreatedAt.UnixMilli(),
Creator: GetUserName(c.Movie.MovieInfo.CreatorID),
Creator: GetUserName(c.Movie.CreatorID),
},
Status: &pb.Status{
Seek: c.Status.Seek,

@ -256,24 +256,26 @@ func (r *Room) initMovie(movie *model.Movie) error {
return nil
}
func (r *Room) AddMovie(m model.MovieInfo) error {
func (r *Room) AddMovie(m model.Movie) error {
err := r.LazyInit()
if err != nil {
return err
}
movie := &model.Movie{
RoomID: r.ID,
Position: uint(time.Now().UnixMilli()),
MovieInfo: m,
}
m.Position = uint(time.Now().UnixMilli())
m.RoomID = r.ID
err = r.initMovie(movie)
err = r.initMovie(&m)
if err != nil {
return err
}
return CreateMovie(movie)
err = CreateMovie(&m)
if err != nil {
r.terminateMovie(&m)
}
return err
}
func (r *Room) HasPermission(user *model.User, permission model.Permission) bool {

@ -54,6 +54,15 @@ func DeleteRoom(room *Room) error {
return db.DeleteRoomByID(room.ID)
}
func DeleteRoomByID(id uint) error {
r, ok := roomCache.LoadAndDelete(id)
if ok {
r.close()
}
return db.DeleteRoomByID(r.ID)
}
func GetRoomByID(id uint) (*Room, error) {
r2, ok := roomCache.Load(id)
if ok {

@ -28,10 +28,10 @@ func (u *User) CreateRoom(name, password string, conf ...db.CreateRoomConfig) (*
return db.CreateRoom(name, password, append(conf, db.WithCreator(&u.User))...)
}
func (u *User) NewMovie(movie model.BaseMovieInfo) model.MovieInfo {
return model.MovieInfo{
BaseMovieInfo: movie,
CreatorID: u.ID,
func (u *User) NewMovie(movie model.MovieInfo) model.Movie {
return model.Movie{
MovieInfo: movie,
CreatorID: u.ID,
}
}

@ -9,7 +9,6 @@ import (
"github.com/synctv-org/synctv/internal/model"
"github.com/zijiren233/stream"
"golang.org/x/crypto/bcrypt"
"gorm.io/gorm/clause"
)
var userCache gcache.Cache
@ -42,7 +41,7 @@ func GetUserByUsername(username string) (*User, error) {
u2 := &User{
User: *u,
version: 1,
version: crc32.ChecksumIEEE(u.HashedPassword),
}
return u2, userCache.SetWithExpire(u.ID, u2, time.Hour)
@ -80,24 +79,22 @@ func SetUserPassword(userID uint, password string) error {
}
func DeleteUserByID(userID uint) error {
u, err := db.LoadAndDeleteUserByID(userID, clause.Column{
Name: "id",
})
rs, err := db.GetAllRoomsByUserID(userID)
if err != nil {
return err
}
userCache.Remove(u.ID)
return nil
}
func DeleteUserByUsername(username string) error {
u, err := db.LoadAndDeleteUserByUsername(username, clause.Column{
Name: "id",
})
err = db.DeleteUserByID(userID)
if err != nil {
return err
}
userCache.Remove(u.ID)
userCache.Remove(userID)
for _, r := range rs {
r2, loaded := roomCache.LoadAndDelete(r.ID)
if loaded {
r2.close()
}
}
return nil
}

@ -110,6 +110,8 @@ func Init(e *gin.Engine) {
user.POST("/signup", SignupUser)
needAuthUser.POST("/logout", LogoutUser)
needAuthUser.GET("/me", Me)
needAuthUser.POST("/pwd", SetUserPassword)

@ -141,7 +141,9 @@ func PushMovie(ctx *gin.Context) {
return
}
mi := user.NewMovie(dbModel.BaseMovieInfo(req))
mi := user.NewMovie(dbModel.MovieInfo{
BaseMovieInfo: dbModel.BaseMovieInfo(req),
})
err := room.AddMovie(mi)
if err != nil {

@ -94,3 +94,15 @@ func SignupUser(ctx *gin.Context) {
"token": token,
}))
}
func LogoutUser(ctx *gin.Context) {
user := ctx.MustGet("user").(*op.User)
err := op.DeleteUserByID(user.ID)
if err != nil {
ctx.AbortWithStatusJSON(http.StatusInternalServerError, model.NewApiErrorResp(err))
return
}
ctx.Status(http.StatusNoContent)
}

Loading…
Cancel
Save