2021-11-18 20:42:27 +03:00
// Copyright 2021 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2021-11-18 20:42:27 +03:00
package org
import (
2023-05-21 18:13:47 +03:00
"context"
2021-11-18 20:42:27 +03:00
"fmt"
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/models/db"
2023-05-21 18:13:47 +03:00
org_model "code.gitea.io/gitea/models/organization"
2022-03-30 11:42:47 +03:00
packages_model "code.gitea.io/gitea/models/packages"
2021-12-10 04:27:50 +03:00
repo_model "code.gitea.io/gitea/models/repo"
2021-11-24 12:49:20 +03:00
user_model "code.gitea.io/gitea/models/user"
2021-11-18 20:42:27 +03:00
"code.gitea.io/gitea/modules/storage"
"code.gitea.io/gitea/modules/util"
2023-10-19 16:16:11 +03:00
repo_service "code.gitea.io/gitea/services/repository"
2021-11-18 20:42:27 +03:00
)
// DeleteOrganization completely and permanently deletes everything of organization.
2023-10-19 16:16:11 +03:00
func DeleteOrganization ( ctx context . Context , org * org_model . Organization , purge bool ) error {
2024-04-27 11:03:49 +03:00
ctx , committer , err := db . TxContext ( ctx )
2021-11-18 20:42:27 +03:00
if err != nil {
return err
}
2024-04-27 11:03:49 +03:00
defer committer . Close ( )
2021-11-18 20:42:27 +03:00
2023-10-19 16:16:11 +03:00
if purge {
err := repo_service . DeleteOwnerRepositoriesDirectly ( ctx , org . AsUser ( ) )
if err != nil {
return err
}
}
2021-11-18 20:42:27 +03:00
// Check ownership of repository.
2022-05-20 17:08:52 +03:00
count , err := repo_model . CountRepositories ( ctx , repo_model . CountRepositoryOptions { OwnerID : org . ID } )
2021-11-18 20:42:27 +03:00
if err != nil {
2022-10-24 22:29:17 +03:00
return fmt . Errorf ( "GetRepositoryCount: %w" , err )
2021-11-18 20:42:27 +03:00
} else if count > 0 {
return models . ErrUserOwnRepos { UID : org . ID }
}
2022-03-30 11:42:47 +03:00
// Check ownership of packages.
if ownsPackages , err := packages_model . HasOwnerPackages ( ctx , org . ID ) ; err != nil {
2022-10-24 22:29:17 +03:00
return fmt . Errorf ( "HasOwnerPackages: %w" , err )
2022-03-30 11:42:47 +03:00
} else if ownsPackages {
return models . ErrUserOwnPackages { UID : org . ID }
}
2023-05-21 18:13:47 +03:00
if err := org_model . DeleteOrganization ( ctx , org ) ; err != nil {
2022-10-24 22:29:17 +03:00
return fmt . Errorf ( "DeleteOrganization: %w" , err )
2021-11-18 20:42:27 +03:00
}
2024-04-27 11:03:49 +03:00
if err := committer . Commit ( ) ; err != nil {
2021-11-18 20:42:27 +03:00
return err
}
// FIXME: system notice
// Note: There are something just cannot be roll back,
// so just keep error logs of those operations.
2021-11-24 12:49:20 +03:00
path := user_model . UserPath ( org . Name )
2021-11-18 20:42:27 +03:00
if err := util . RemoveAll ( path ) ; err != nil {
2023-05-21 18:13:47 +03:00
return fmt . Errorf ( "failed to RemoveAll %s: %w" , path , err )
2021-11-18 20:42:27 +03:00
}
if len ( org . Avatar ) > 0 {
avatarPath := org . CustomAvatarRelativePath ( )
if err := storage . Avatars . Delete ( avatarPath ) ; err != nil {
2023-05-21 18:13:47 +03:00
return fmt . Errorf ( "failed to remove %s: %w" , avatarPath , err )
2021-11-18 20:42:27 +03:00
}
}
return nil
}