From f182a5a955b83a588f66ffd1e2b1ea8ed096c750 Mon Sep 17 00:00:00 2001 From: zijiren233 Date: Wed, 18 Oct 2023 23:14:18 +0800 Subject: [PATCH] Feat: update db model can auto update and delete --- internal/db/room.go | 2 +- internal/db/user.go | 8 ++++---- internal/model/movie.go | 2 +- internal/model/room.go | 8 ++++---- internal/model/user.go | 3 ++- 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/internal/db/room.go b/internal/db/room.go index 2644932d..cfc18a46 100644 --- a/internal/db/room.go +++ b/internal/db/room.go @@ -99,7 +99,7 @@ func HasPermission(roomID uint, userID uint, permission model.Permission) (bool, } func DeleteRoomByID(roomID uint) error { - err := db.Where("id = ?", roomID).Delete(&model.Room{}).Error + err := db.Unscoped().Delete(&model.Room{}, roomID).Error if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { return errors.New("room not found") } diff --git a/internal/db/user.go b/internal/db/user.go index 5c1ef716..d0689009 100644 --- a/internal/db/user.go +++ b/internal/db/user.go @@ -64,7 +64,7 @@ func GetUsersByRoomID(roomID uint) ([]model.User, error) { } func DeleteUserByID(userID uint) error { - err := db.Where("id = ?", userID).Delete(&model.User{}).Error + err := db.Unscoped().Delete(&model.User{}, userID).Error if errors.Is(err, gorm.ErrRecordNotFound) { return errors.New("user not found") } @@ -73,7 +73,7 @@ func DeleteUserByID(userID uint) error { func LoadAndDeleteUserByID(userID uint, columns ...clause.Column) (*model.User, error) { u := &model.User{} - err := db.Clauses(clause.Returning{Columns: columns}).Where("id = ?", userID).Delete(u).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") } @@ -81,7 +81,7 @@ func LoadAndDeleteUserByID(userID uint, columns ...clause.Column) (*model.User, } func DeleteUserByUsername(username string) error { - err := db.Where("username = ?", username).Delete(&model.User{}).Error + err := db.Unscoped().Where("username = ?", username).Delete(&model.User{}).Error if errors.Is(err, gorm.ErrRecordNotFound) { return errors.New("user not found") } @@ -90,7 +90,7 @@ func DeleteUserByUsername(username string) error { func LoadAndDeleteUserByUsername(username string, columns ...clause.Column) (*model.User, error) { u := &model.User{} - err := db.Clauses(clause.Returning{Columns: columns}).Where("username = ?", username).Delete(u).Error + err := db.Unscoped().Clauses(clause.Returning{Columns: columns}).Where("username = ?", username).Delete(u).Error if errors.Is(err, gorm.ErrRecordNotFound) { return u, errors.New("user not found") } diff --git a/internal/model/movie.go b/internal/model/movie.go index b0ccb2a3..36170937 100644 --- a/internal/model/movie.go +++ b/internal/model/movie.go @@ -6,6 +6,7 @@ type Movie struct { gorm.Model Position uint `gorm:"not null"` RoomID uint `gorm:"not null;index"` + Room Room `gorm:"foreignKey:RoomID"` MovieInfo `gorm:"embedded"` } @@ -13,7 +14,6 @@ type MovieInfo struct { BaseMovieInfo `gorm:"embedded"` PullKey string `gorm:"varchar(128)" json:"pullKey"` CreatorID uint `gorm:"not null;index" json:"creatorId"` - Creator User `gorm:"foreignKey:CreatorID" json:"creator"` } type BaseMovieInfo struct { diff --git a/internal/model/room.go b/internal/model/room.go index 5da6b32e..635af208 100644 --- a/internal/model/room.go +++ b/internal/model/room.go @@ -10,11 +10,11 @@ type Room struct { gorm.Model Name string `gorm:"not null;uniqueIndex;varchar(32)"` Setting - CreatorID uint `gorm:"not null;index"` - Creator User `gorm:"foreignKey:CreatorID"` + CreatorID uint `gorm:"index"` + Creator User `gorm:"foreignKey:CreatorID;constraint:OnUpdate:CASCADE,OnDelete:SET NULL"` HashedPassword []byte - GroupUserRelations []RoomUserRelation `gorm:"foreignKey:RoomID"` - Movies []Movie `gorm:"foreignKey:RoomID"` + GroupUserRelations []RoomUserRelation `gorm:"foreignKey:RoomID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"` + Movies []Movie `gorm:"foreignKey:RoomID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"` } func (r *Room) CheckPassword(password string) bool { diff --git a/internal/model/user.go b/internal/model/user.go index 6fdb5e84..70bdbc63 100644 --- a/internal/model/user.go +++ b/internal/model/user.go @@ -10,7 +10,8 @@ type User struct { gorm.Model Username string `gorm:"not null;uniqueIndex;varchar(32)"` HashedPassword []byte - GroupUserRelations []RoomUserRelation `gorm:"foreignKey:UserID"` + GroupUserRelations []RoomUserRelation `gorm:"foreignKey:UserID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"` + Movies []Movie `gorm:"foreignKey:CreatorID;constraint:OnUpdate:CASCADE,OnDelete:SET NULL"` } func (u *User) CheckPassword(password string) bool {