diff options
Diffstat (limited to 'services/org/org.go')
-rw-r--r-- | services/org/org.go | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/services/org/org.go b/services/org/org.go new file mode 100644 index 0000000000..cb1f1eca03 --- /dev/null +++ b/services/org/org.go @@ -0,0 +1,61 @@ +// Copyright 2021 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package org + +import ( + "fmt" + + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/modules/storage" + "code.gitea.io/gitea/modules/util" +) + +// DeleteOrganization completely and permanently deletes everything of organization. +func DeleteOrganization(org *models.User) error { + if !org.IsOrganization() { + return fmt.Errorf("%s is a user not an organization", org.Name) + } + + ctx, commiter, err := db.TxContext() + if err != nil { + return err + } + defer commiter.Close() + + // Check ownership of repository. + count, err := models.GetRepositoryCount(ctx, org) + if err != nil { + return fmt.Errorf("GetRepositoryCount: %v", err) + } else if count > 0 { + return models.ErrUserOwnRepos{UID: org.ID} + } + + if err := models.DeleteOrganization(ctx, org); err != nil { + return fmt.Errorf("DeleteOrganization: %v", err) + } + + if err := commiter.Commit(); err != nil { + return err + } + + // FIXME: system notice + // Note: There are something just cannot be roll back, + // so just keep error logs of those operations. + path := models.UserPath(org.Name) + + if err := util.RemoveAll(path); err != nil { + return fmt.Errorf("Failed to RemoveAll %s: %v", path, err) + } + + if len(org.Avatar) > 0 { + avatarPath := org.CustomAvatarRelativePath() + if err := storage.Avatars.Delete(avatarPath); err != nil { + return fmt.Errorf("Failed to remove %s: %v", avatarPath, err) + } + } + + return nil +} |