Skip to content

Commit

Permalink
fix: safe delete room member when delete creator member record
Browse files Browse the repository at this point in the history
  • Loading branch information
zijiren233 committed Oct 12, 2024
1 parent 83a03d0 commit bfff86d
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 13 deletions.
34 changes: 21 additions & 13 deletions internal/db/member.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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) {
Expand All @@ -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 {
Expand All @@ -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 {
Expand All @@ -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) {
Expand Down
1 change: 1 addition & 0 deletions internal/model/member.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit bfff86d

Please sign in to comment.