From c535cd429646ef3a7ed0313464cbb208a0e5a7d7 Mon Sep 17 00:00:00 2001 From: zijiren233 Date: Thu, 11 Apr 2024 23:34:16 +0800 Subject: [PATCH] Fix: cascade delete user --- internal/bootstrap/db.go | 2 +- internal/db/room.go | 7 ++++--- internal/db/setting.go | 2 +- internal/db/update.go | 5 ++++- internal/db/user.go | 7 ++++--- internal/model/room.go | 4 ++-- internal/model/user.go | 4 ++-- 7 files changed, 18 insertions(+), 13 deletions(-) diff --git a/internal/bootstrap/db.go b/internal/bootstrap/db.go index 46f7de9..e29975d 100644 --- a/internal/bootstrap/db.go +++ b/internal/bootstrap/db.go @@ -30,7 +30,7 @@ func InitDatabase(ctx context.Context) (err error) { TranslateError: true, Logger: newDBLogger(), PrepareStmt: true, - DisableForeignKeyConstraintWhenMigrating: true, + DisableForeignKeyConstraintWhenMigrating: false, IgnoreRelationshipsWhenMigrating: true, }) d, err := gorm.Open(dialector, opts...) diff --git a/internal/db/room.go b/internal/db/room.go index 3fd3818..e481a6a 100644 --- a/internal/db/room.go +++ b/internal/db/room.go @@ -7,6 +7,7 @@ import ( "github.com/zijiren233/stream" "golang.org/x/crypto/bcrypt" "gorm.io/gorm" + "gorm.io/gorm/clause" ) type CreateRoomConfig func(r *model.Room) @@ -20,7 +21,7 @@ func WithSetting(setting model.RoomSettings) CreateRoomConfig { func WithCreator(creator *model.User) CreateRoomConfig { return func(r *model.Room) { r.CreatorID = creator.ID - r.GroupUserRelations = []model.RoomUserRelation{ + r.GroupUserRelations = []*model.RoomUserRelation{ { UserID: creator.ID, Status: model.RoomUserStatusActive, @@ -30,7 +31,7 @@ func WithCreator(creator *model.User) CreateRoomConfig { } } -func WithRelations(relations []model.RoomUserRelation) CreateRoomConfig { +func WithRelations(relations []*model.RoomUserRelation) CreateRoomConfig { return func(r *model.Room) { r.GroupUserRelations = append(r.GroupUserRelations, relations...) } @@ -92,7 +93,7 @@ func SaveRoomSettings(roomID string, setting model.RoomSettings) error { } func DeleteRoomByID(roomID string) error { - err := db.Unscoped().Where("id = ?", roomID).Delete(&model.Room{}).Error + err := db.Unscoped().Select(clause.Associations).Delete(&model.Room{ID: roomID}).Error return HandleNotFound(err, "room") } diff --git a/internal/db/setting.go b/internal/db/setting.go index 4363652..6bf5edf 100644 --- a/internal/db/setting.go +++ b/internal/db/setting.go @@ -40,7 +40,7 @@ func DeleteSettingItem(item *model.Setting) error { } func DeleteSettingItemByName(name string) error { - return db.Where("name = ?", name).Delete(&model.Setting{}).Error + return db.Delete(&model.Setting{Name: name}).Error } func GetSettingItemValue(name string) (string, error) { diff --git a/internal/db/update.go b/internal/db/update.go index 36057b2..3a9e89f 100644 --- a/internal/db/update.go +++ b/internal/db/update.go @@ -15,7 +15,7 @@ type dbVersion struct { Upgrade func(*gorm.DB) error } -const CurrentVersion = "0.0.5" +const CurrentVersion = "0.0.6" var models = []any{ new(model.Setting), @@ -56,6 +56,9 @@ var dbVersions = map[string]dbVersion{ NextVersion: "0.0.5", }, "0.0.5": { + NextVersion: "0.0.6", + }, + "0.0.6": { NextVersion: "", }, } diff --git a/internal/db/user.go b/internal/db/user.go index 531bad1..783b91c 100644 --- a/internal/db/user.go +++ b/internal/db/user.go @@ -296,15 +296,16 @@ func UnbanUserByID(userID string) error { } func DeleteUserByID(userID string) error { - err := db.Unscoped().Where("id = ?", userID).Delete(&model.User{}).Error + err := db.Unscoped().Select(clause.Associations).Delete(&model.User{ID: userID}).Error return HandleNotFound(err, "user") } func LoadAndDeleteUserByID(userID string, columns ...clause.Column) (*model.User, error) { - u := &model.User{} + u := &model.User{ID: userID} if db.Unscoped(). Clauses(clause.Returning{Columns: columns}). - Delete(u, userID). + Select(clause.Associations). + Delete(u). RowsAffected == 0 { return u, errors.New("user not found") } diff --git a/internal/model/room.go b/internal/model/room.go index b98fef8..7fca671 100644 --- a/internal/model/room.go +++ b/internal/model/room.go @@ -39,8 +39,8 @@ type Room struct { Settings RoomSettings `gorm:"embedded;embeddedPrefix:settings_"` CreatorID string `gorm:"index;type:char(32)"` HashedPassword []byte - GroupUserRelations []RoomUserRelation `gorm:"foreignKey:RoomID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"` - Movies []Movie `gorm:"foreignKey:RoomID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"` + GroupUserRelations []*RoomUserRelation `gorm:"foreignKey:RoomID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"` + Movies []*Movie `gorm:"foreignKey:RoomID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"` } func (r *Room) BeforeCreate(tx *gorm.DB) error { diff --git a/internal/model/user.go b/internal/model/user.go index 7e75670..b062547 100644 --- a/internal/model/user.go +++ b/internal/model/user.go @@ -50,8 +50,8 @@ type User struct { Email string `gorm:"type:varchar(128);uniqueIndex:,where:email <> ''"` Role Role `gorm:"not null;default:2"` RoomUserRelations []*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"` + Rooms []*Room `gorm:"foreignKey:CreatorID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"` + Movies []*Movie `gorm:"foreignKey:CreatorID;constraint:OnUpdate:CASCADE,OnDelete:SET NULL"` BilibiliVendor *BilibiliVendor `gorm:"foreignKey:UserID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"` AlistVendor []*AlistVendor `gorm:"foreignKey:UserID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"` EmbyVendor []*EmbyVendor `gorm:"foreignKey:UserID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"`