Make sure there's an admin user or team per list/namespace when deleting it

This commit is contained in:
kolaente 2021-08-09 16:20:27 +02:00
parent 549b9338ab
commit 9e4a3f3f9e
Signed by: konrad
GPG Key ID: F40E70337AB24C9B
1 changed files with 112 additions and 9 deletions

View File

@ -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
}