Fix: cascade delete user

pull/134/head
zijiren233 11 months ago
parent 97c81edc7c
commit c535cd4296

@ -30,7 +30,7 @@ func InitDatabase(ctx context.Context) (err error) {
TranslateError: true, TranslateError: true,
Logger: newDBLogger(), Logger: newDBLogger(),
PrepareStmt: true, PrepareStmt: true,
DisableForeignKeyConstraintWhenMigrating: true, DisableForeignKeyConstraintWhenMigrating: false,
IgnoreRelationshipsWhenMigrating: true, IgnoreRelationshipsWhenMigrating: true,
}) })
d, err := gorm.Open(dialector, opts...) d, err := gorm.Open(dialector, opts...)

@ -7,6 +7,7 @@ import (
"github.com/zijiren233/stream" "github.com/zijiren233/stream"
"golang.org/x/crypto/bcrypt" "golang.org/x/crypto/bcrypt"
"gorm.io/gorm" "gorm.io/gorm"
"gorm.io/gorm/clause"
) )
type CreateRoomConfig func(r *model.Room) type CreateRoomConfig func(r *model.Room)
@ -20,7 +21,7 @@ func WithSetting(setting model.RoomSettings) CreateRoomConfig {
func WithCreator(creator *model.User) CreateRoomConfig { func WithCreator(creator *model.User) CreateRoomConfig {
return func(r *model.Room) { return func(r *model.Room) {
r.CreatorID = creator.ID r.CreatorID = creator.ID
r.GroupUserRelations = []model.RoomUserRelation{ r.GroupUserRelations = []*model.RoomUserRelation{
{ {
UserID: creator.ID, UserID: creator.ID,
Status: model.RoomUserStatusActive, 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) { return func(r *model.Room) {
r.GroupUserRelations = append(r.GroupUserRelations, relations...) r.GroupUserRelations = append(r.GroupUserRelations, relations...)
} }
@ -92,7 +93,7 @@ func SaveRoomSettings(roomID string, setting model.RoomSettings) error {
} }
func DeleteRoomByID(roomID string) 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") return HandleNotFound(err, "room")
} }

@ -40,7 +40,7 @@ func DeleteSettingItem(item *model.Setting) error {
} }
func DeleteSettingItemByName(name string) 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) { func GetSettingItemValue(name string) (string, error) {

@ -15,7 +15,7 @@ type dbVersion struct {
Upgrade func(*gorm.DB) error Upgrade func(*gorm.DB) error
} }
const CurrentVersion = "0.0.5" const CurrentVersion = "0.0.6"
var models = []any{ var models = []any{
new(model.Setting), new(model.Setting),
@ -56,6 +56,9 @@ var dbVersions = map[string]dbVersion{
NextVersion: "0.0.5", NextVersion: "0.0.5",
}, },
"0.0.5": { "0.0.5": {
NextVersion: "0.0.6",
},
"0.0.6": {
NextVersion: "", NextVersion: "",
}, },
} }

@ -296,15 +296,16 @@ func UnbanUserByID(userID string) error {
} }
func DeleteUserByID(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") return HandleNotFound(err, "user")
} }
func LoadAndDeleteUserByID(userID string, columns ...clause.Column) (*model.User, error) { func LoadAndDeleteUserByID(userID string, columns ...clause.Column) (*model.User, error) {
u := &model.User{} u := &model.User{ID: userID}
if db.Unscoped(). if db.Unscoped().
Clauses(clause.Returning{Columns: columns}). Clauses(clause.Returning{Columns: columns}).
Delete(u, userID). Select(clause.Associations).
Delete(u).
RowsAffected == 0 { RowsAffected == 0 {
return u, errors.New("user not found") return u, errors.New("user not found")
} }

@ -39,8 +39,8 @@ type Room struct {
Settings RoomSettings `gorm:"embedded;embeddedPrefix:settings_"` Settings RoomSettings `gorm:"embedded;embeddedPrefix:settings_"`
CreatorID string `gorm:"index;type:char(32)"` CreatorID string `gorm:"index;type:char(32)"`
HashedPassword []byte HashedPassword []byte
GroupUserRelations []RoomUserRelation `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"` Movies []*Movie `gorm:"foreignKey:RoomID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"`
} }
func (r *Room) BeforeCreate(tx *gorm.DB) error { func (r *Room) BeforeCreate(tx *gorm.DB) error {

@ -50,8 +50,8 @@ type User struct {
Email string `gorm:"type:varchar(128);uniqueIndex:,where:email <> ''"` Email string `gorm:"type:varchar(128);uniqueIndex:,where:email <> ''"`
Role Role `gorm:"not null;default:2"` Role Role `gorm:"not null;default:2"`
RoomUserRelations []*RoomUserRelation `gorm:"foreignKey:UserID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"` RoomUserRelations []*RoomUserRelation `gorm:"foreignKey:UserID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"`
Rooms []Room `gorm:"foreignKey:CreatorID;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"` Movies []*Movie `gorm:"foreignKey:CreatorID;constraint:OnUpdate:CASCADE,OnDelete:SET NULL"`
BilibiliVendor *BilibiliVendor `gorm:"foreignKey:UserID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"` BilibiliVendor *BilibiliVendor `gorm:"foreignKey:UserID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"`
AlistVendor []*AlistVendor `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"` EmbyVendor []*EmbyVendor `gorm:"foreignKey:UserID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"`

Loading…
Cancel
Save