Make sure there's an admin user or team per list/namespace when deleting it
This commit is contained in:
parent
549b9338ab
commit
9e4a3f3f9e
|
@ -96,19 +96,18 @@ func deleteUser(s *xorm.Session, u *user.User) (err error) {
|
|||
continue
|
||||
}
|
||||
|
||||
// Check if this namespace is shared
|
||||
sharedUser, err := s.Where("namespace_id = ?", n.ID).Exist(&NamespaceUser{})
|
||||
hadUsers, err := ensureNamespaceAdminUser(s, &n.Namespace)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if sharedUser {
|
||||
if hadUsers {
|
||||
continue
|
||||
}
|
||||
sharedTeam, err := s.Where("namespace_id = ?", n.ID).Exist(&TeamNamespace{})
|
||||
hadTeams, err := ensureNamespaceAdminTeam(s, &n.Namespace)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if sharedTeam {
|
||||
if hadTeams {
|
||||
continue
|
||||
}
|
||||
|
||||
|
@ -128,18 +127,18 @@ func deleteUser(s *xorm.Session, u *user.User) (err error) {
|
|||
continue
|
||||
}
|
||||
|
||||
sharedUser, err := s.Where("list_id = ?", l.ID).Exist(&ListUser{})
|
||||
hadUsers, err := ensureListAdminUser(s, l)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if sharedUser {
|
||||
if hadUsers {
|
||||
continue
|
||||
}
|
||||
sharedTeam, err := s.Where("list_id = ?", l.ID).Exist(&TeamList{})
|
||||
hadTeams, err := ensureListAdminTeam(s, l)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if sharedTeam {
|
||||
if hadTeams {
|
||||
continue
|
||||
}
|
||||
|
||||
|
@ -164,3 +163,107 @@ func deleteUser(s *xorm.Session, u *user.User) (err error) {
|
|||
_, err = s.Where("id = ?", u.ID).Delete(u)
|
||||
return
|
||||
}
|
||||
|
||||
func ensureNamespaceAdminUser(s *xorm.Session, n *Namespace) (hadUsers bool, err error) {
|
||||
namespaceUsers := []*NamespaceUser{}
|
||||
err = s.Where("namespace_id = ?", n.ID).Find(&namespaceUsers)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if len(namespaceUsers) == 0 {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
for _, lu := range namespaceUsers {
|
||||
if lu.Right == RightAdmin {
|
||||
// List already has more than one admin, no need to do anything
|
||||
return true, nil
|
||||
}
|
||||
}
|
||||
|
||||
firstUser := namespaceUsers[0]
|
||||
firstUser.Right = RightAdmin
|
||||
_, err = s.Where("id = ?", firstUser.ID).
|
||||
Cols("right").
|
||||
Update(firstUser)
|
||||
return true, err
|
||||
}
|
||||
|
||||
func ensureNamespaceAdminTeam(s *xorm.Session, n *Namespace) (hadTeams bool, err error) {
|
||||
namespaceTeams := []*TeamNamespace{}
|
||||
err = s.Where("namespace_id = ?", n.ID).Find(&namespaceTeams)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if len(namespaceTeams) == 0 {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
for _, lu := range namespaceTeams {
|
||||
if lu.Right == RightAdmin {
|
||||
// List already has more than one admin, no need to do anything
|
||||
return true, nil
|
||||
}
|
||||
}
|
||||
|
||||
firstTeam := namespaceTeams[0]
|
||||
firstTeam.Right = RightAdmin
|
||||
_, err = s.Where("id = ?", firstTeam.ID).
|
||||
Cols("right").
|
||||
Update(firstTeam)
|
||||
return true, err
|
||||
}
|
||||
|
||||
func ensureListAdminUser(s *xorm.Session, l *List) (hadUsers bool, err error) {
|
||||
listUsers := []*ListUser{}
|
||||
err = s.Where("list_id = ?", l.ID).Find(&listUsers)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if len(listUsers) == 0 {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
for _, lu := range listUsers {
|
||||
if lu.Right == RightAdmin {
|
||||
// List already has more than one admin, no need to do anything
|
||||
return true, nil
|
||||
}
|
||||
}
|
||||
|
||||
firstUser := listUsers[0]
|
||||
firstUser.Right = RightAdmin
|
||||
_, err = s.Where("id = ?", firstUser.ID).
|
||||
Cols("right").
|
||||
Update(firstUser)
|
||||
return true, err
|
||||
}
|
||||
|
||||
func ensureListAdminTeam(s *xorm.Session, l *List) (hadTeams bool, err error) {
|
||||
listTeams := []*TeamList{}
|
||||
err = s.Where("list_id = ?", l.ID).Find(&listTeams)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if len(listTeams) == 0 {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
for _, lu := range listTeams {
|
||||
if lu.Right == RightAdmin {
|
||||
// List already has more than one admin, no need to do anything
|
||||
return true, nil
|
||||
}
|
||||
}
|
||||
|
||||
firstTeam := listTeams[0]
|
||||
firstTeam.Right = RightAdmin
|
||||
_, err = s.Where("id = ?", firstTeam.ID).
|
||||
Cols("right").
|
||||
Update(firstTeam)
|
||||
return true, err
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue