Opt: clear movie need parentId

pull/154/head
zijiren233 10 months ago
parent 16686c470f
commit 0cf9ce5b07

@ -64,9 +64,9 @@ func LoadAndDeleteMovieByID(roomID, id string, columns []clause.Column) (*model.
return movie, HandleNotFound(err, "room or movie")
}
func DeleteMoviesByRoomID(roomID string) error {
func DeleteMoviesByRoomID(roomID string, scopes ...func(*gorm.DB) *gorm.DB) error {
return db.Transaction(func(tx *gorm.DB) error {
err := tx.Where("room_id = ?", roomID).Delete(&model.Movie{}).Error
err := tx.Where("room_id = ?", roomID).Scopes(scopes...).Delete(&model.Movie{}).Error
if err != nil {
return HandleNotFound(err, "room")
}
@ -74,6 +74,10 @@ func DeleteMoviesByRoomID(roomID string) error {
})
}
func DeleteMoviesByRoomIDAndParentID(roomID string, parentID string) error {
return DeleteMoviesByRoomID(roomID, WithParentMovieID(parentID))
}
func LoadAndDeleteMoviesByRoomID(roomID string, columns ...clause.Column) ([]*model.Movie, error) {
movies := []*model.Movie{}
err := db.Transaction(func(tx *gorm.DB) error {

@ -99,21 +99,20 @@ func (m *movies) Update(movieId string, movie *model.MovieBase) error {
}
func (m *movies) Clear() error {
err := db.DeleteMoviesByRoomID(m.roomID)
if err != nil {
return err
}
return m.Close()
return m.DeleteMovieByParentID("")
}
func (m *movies) Close() error {
m.cache.Range(func(key string, value *Movie) bool {
mm, ok := m.cache.LoadAndDelete(key)
if ok {
_ = mm.Close()
}
return true
})
m.DeleteMovieAndChiledCache("")
return nil
}
func (m *movies) DeleteMovieByParentID(parentID string) error {
err := db.DeleteMoviesByRoomIDAndParentID(m.roomID, parentID)
if err != nil {
return err
}
m.DeleteMovieAndChiledCache("")
return nil
}

@ -340,6 +340,9 @@ func (r *Room) SetPassword(password string) error {
}
func (r *Room) IsParentOf(movieID, parentID string) (bool, error) {
if parentID == "" {
return true, nil
}
return r.movies.IsParentOf(movieID, parentID)
}
@ -383,8 +386,21 @@ func (r *Room) DeleteMoviesByID(ids []string) error {
}
func (r *Room) ClearMovies() error {
_ = r.SetCurrentMovie("", "", false)
return r.movies.Clear()
return r.ClearMoviesByParentID("")
}
func (r *Room) ClearMoviesByParentID(parentID string) error {
cid := r.current.current.Movie.ID
if cid != "" {
ok, err := r.IsParentOf(cid, parentID)
if err != nil {
return fmt.Errorf("check parent failed: %w", err)
}
if ok {
return errors.New("cannot delete current movie's parent")
}
}
return r.movies.DeleteMovieByParentID(parentID)
}
func (r *Room) GetMovieByID(id string) (*Movie, error) {

@ -388,6 +388,23 @@ func (u *User) ClearRoomMovies(room *Room) error {
})
}
func (u *User) ClearRoomMoviesByParentID(room *Room, parentID string) error {
if !u.HasRoomPermission(room, model.PermissionDeleteMovie) {
return model.ErrNoPermission
}
err := room.ClearMoviesByParentID(parentID)
if err != nil {
return err
}
return room.Broadcast(&pb.ElementMessage{
Type: pb.ElementMessageType_MOVIES_CHANGED,
MoviesChanged: &pb.Sender{
Username: u.Username,
Userid: u.ID,
},
})
}
func (u *User) SwapRoomMoviePositions(room *Room, id1, id2 string) error {
if !u.HasRoomPermission(room, model.PermissionEditMovie) {
return model.ErrNoPermission

@ -615,7 +615,13 @@ func ClearMovies(ctx *gin.Context) {
room := ctx.MustGet("room").(*op.RoomEntry).Value()
user := ctx.MustGet("user").(*op.UserEntry).Value()
if err := user.ClearRoomMovies(room); err != nil {
var req model.ClearMoviesReq
if err := model.Decode(ctx, &req); err != nil {
ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err))
return
}
if err := user.ClearRoomMoviesByParentID(room, req.ParentId); err != nil {
if errors.Is(err, dbModel.ErrNoPermission) {
ctx.AbortWithStatusJSON(
http.StatusForbidden,

@ -210,3 +210,18 @@ type CurrentMovieResp struct {
Movie *Movie `json:"movie"`
ExpireId uint64 `json:"expireId"`
}
type ClearMoviesReq struct {
ParentId string `json:"parentId"`
}
func (c *ClearMoviesReq) Decode(ctx *gin.Context) error {
return json.NewDecoder(ctx.Request.Body).Decode(c)
}
func (c *ClearMoviesReq) Validate() error {
if c.ParentId != "" && len(c.ParentId) != 32 {
return fmt.Errorf("parent id length must be empty or 32")
}
return nil
}

Loading…
Cancel
Save