From bfff86d4efbbd553ee3b56d4946642c4c4e6686b Mon Sep 17 00:00:00 2001 From: zijiren233 Date: Sat, 12 Oct 2024 23:14:45 +0800 Subject: [PATCH] fix: safe delete room member when delete creator member record --- internal/db/member.go | 34 +++++++++++++++++++++------------- internal/model/member.go | 1 + 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/internal/db/member.go b/internal/db/member.go index 5f780e0..4fdd836 100644 --- a/internal/db/member.go +++ b/internal/db/member.go @@ -51,7 +51,7 @@ func FirstOrCreateRoomMemberRelation(roomID, userID string, conf ...CreateRoomMe func GetRoomMember(roomID, userID string) (*model.RoomMember, error) { roomMemberRelation := &model.RoomMember{} err := db.Where("room_id = ? AND user_id = ?", roomID, userID).First(roomMemberRelation).Error - return roomMemberRelation, HandleNotFound(err, "room or user") + return roomMemberRelation, HandleNotFound(err, "room or member") } func RoomApprovePendingMember(roomID, userID string) error { @@ -66,32 +66,40 @@ func RoomBanMember(roomID, userID string) error { result := db.Model(&model.RoomMember{}). Where("room_id = ? AND user_id = ?", roomID, userID). Update("status", model.RoomMemberStatusBanned) - return HandleUpdateResult(result, "room or user") + return HandleUpdateResult(result, "room or member") } func RoomUnbanMember(roomID, userID string) error { result := db.Model(&model.RoomMember{}).Where("room_id = ? AND user_id = ?", roomID, userID).Update("status", model.RoomMemberStatusActive) - return HandleUpdateResult(result, "room or user") + return HandleUpdateResult(result, "room or member") } func DeleteRoomMember(roomID, userID string) error { - result := db.Where("room_id = ? AND user_id = ?", roomID, userID).Delete(&model.RoomMember{}) - return HandleUpdateResult(result, "room or user") + result := db. + Where("NOT EXISTS (?)", + db.Table("rooms"). + Select("1"). + Where("rooms.id = room_members.room_id AND rooms.creator_id = room_members.user_id"), + ). + Where("room_id = ? AND user_id = ?", roomID, userID). + Delete(&model.RoomMember{}) + + return HandleUpdateResult(result, "room or member") } func SetMemberPermissions(roomID string, userID string, permission model.RoomMemberPermission) error { result := db.Model(&model.RoomMember{}).Where("room_id = ? AND user_id = ?", roomID, userID).Update("permissions", permission) - return HandleUpdateResult(result, "room or user") + return HandleUpdateResult(result, "room or member") } func AddMemberPermissions(roomID string, userID string, permission model.RoomMemberPermission) error { result := db.Model(&model.RoomMember{}).Where("room_id = ? AND user_id = ?", roomID, userID).Update("permissions", db.Raw("permissions | ?", permission)) - return HandleUpdateResult(result, "room or user") + return HandleUpdateResult(result, "room or member") } func RemoveMemberPermissions(roomID string, userID string, permission model.RoomMemberPermission) error { result := db.Model(&model.RoomMember{}).Where("room_id = ? AND user_id = ?", roomID, userID).Update("permissions", db.Raw("permissions & ?", ^permission)) - return HandleUpdateResult(result, "room or user") + return HandleUpdateResult(result, "room or member") } // func GetAllRoomMembersRelationCount(roomID string, scopes ...func(*gorm.DB) *gorm.DB) (int64, error) { @@ -102,17 +110,17 @@ func RemoveMemberPermissions(roomID string, userID string, permission model.Room func RoomSetAdminPermissions(roomID, userID string, permissions model.RoomAdminPermission) error { result := db.Model(&model.RoomMember{}).Where("room_id = ? AND user_id = ?", roomID, userID).Update("admin_permissions", permissions) - return HandleUpdateResult(result, "room or user") + return HandleUpdateResult(result, "room or member") } func RoomAddAdminPermissions(roomID, userID string, permissions model.RoomAdminPermission) error { result := db.Model(&model.RoomMember{}).Where("room_id = ? AND user_id = ?", roomID, userID).Update("admin_permissions", db.Raw("admin_permissions | ?", permissions)) - return HandleUpdateResult(result, "room or user") + return HandleUpdateResult(result, "room or member") } func RoomRemoveAdminPermissions(roomID, userID string, permissions model.RoomAdminPermission) error { result := db.Model(&model.RoomMember{}).Where("room_id = ? AND user_id = ?", roomID, userID).Update("admin_permissions", db.Raw("admin_permissions & ?", ^permissions)) - return HandleUpdateResult(result, "room or user") + return HandleUpdateResult(result, "room or member") } func RoomSetAdmin(roomID, userID string, permissions model.RoomAdminPermission) error { @@ -121,7 +129,7 @@ func RoomSetAdmin(roomID, userID string, permissions model.RoomAdminPermission) "permissions": model.AllPermissions, "admin_permissions": permissions, }) - return HandleUpdateResult(result, "room or user") + return HandleUpdateResult(result, "room or member") } func RoomSetMember(roomID, userID string, permissions model.RoomMemberPermission) error { @@ -130,7 +138,7 @@ func RoomSetMember(roomID, userID string, permissions model.RoomMemberPermission "permissions": permissions, "admin_permissions": model.NoAdminPermission, }) - return HandleUpdateResult(result, "room or user") + return HandleUpdateResult(result, "room or member") } func GetRoomMembers(roomID string, scopes ...func(*gorm.DB) *gorm.DB) ([]*model.RoomMember, error) { diff --git a/internal/model/member.go b/internal/model/member.go index d5801d4..2fb2a5a 100644 --- a/internal/model/member.go +++ b/internal/model/member.go @@ -142,6 +142,7 @@ type RoomMember struct { UpdatedAt time.Time UserID string `gorm:"primarykey;type:char(32)"` RoomID string `gorm:"primarykey;type:char(32)"` + Room *Room `gorm:"foreignKey:RoomID;references:ID"` Status RoomMemberStatus `gorm:"not null;default:2"` Role RoomMemberRole `gorm:"not null;default:1"` Permissions RoomMemberPermission