From c464c6325a9f86f4fdc1fd8b193677831f55bd0f Mon Sep 17 00:00:00 2001 From: tiennm99 Date: Mon, 13 Apr 2026 09:41:06 +0700 Subject: [PATCH] refactor: rename to gitea-delete-orgs and delete orgs instead of leaving Use DELETE /api/v1/orgs/{org} to fully delete organizations rather than just removing the user as a member. --- go-util/README.md | 6 +-- .../main.go | 38 +++---------------- 2 files changed, 9 insertions(+), 35 deletions(-) rename go-util/cmd/{gitea-leave-orgs => gitea-delete-orgs}/main.go (68%) diff --git a/go-util/README.md b/go-util/README.md index 219769a..69dbea4 100644 --- a/go-util/README.md +++ b/go-util/README.md @@ -8,7 +8,7 @@ Each script lives in its own directory under `cmd/`, so multiple `main` packages ``` cmd/ - gitea-leave-orgs/ # Leave all Gitea orgs except a keep-list + gitea-delete-orgs/ # Delete all Gitea orgs except a keep-list ``` ## Usage @@ -17,11 +17,11 @@ cmd/ # Run any script go run ./cmd/ -# Example: leave Gitea orgs +# Example: delete Gitea orgs export GITEA_URL=https://gitea.example.com export GITEA_TOKEN=your-token export GITEA_KEEP_ORGS=org1,org2 -go run ./cmd/gitea-leave-orgs +go run ./cmd/gitea-delete-orgs ``` ## Adding a new script diff --git a/go-util/cmd/gitea-leave-orgs/main.go b/go-util/cmd/gitea-delete-orgs/main.go similarity index 68% rename from go-util/cmd/gitea-leave-orgs/main.go rename to go-util/cmd/gitea-delete-orgs/main.go index 69a4d06..5a52701 100644 --- a/go-util/cmd/gitea-leave-orgs/main.go +++ b/go-util/cmd/gitea-delete-orgs/main.go @@ -46,11 +46,11 @@ func main() { for _, o := range orgs { if keep[o.Username] { - fmt.Printf(" KEEP %s\n", o.Username) + fmt.Printf(" KEEP %s\n", o.Username) continue } - fmt.Printf(" LEAVE %s ... ", o.Username) - if err := leaveOrg(baseURL, token, o.Username); err != nil { + fmt.Printf(" DELETE %s ... ", o.Username) + if err := deleteOrg(baseURL, token, o.Username); err != nil { fmt.Printf("FAILED: %v\n", err) } else { fmt.Println("OK") @@ -85,39 +85,13 @@ func listOrgs(baseURL, token string) ([]org, error) { return allOrgs, nil } -// leaveOrg removes the authenticated user from the given organization. -func leaveOrg(baseURL, token, orgName string) error { - url := fmt.Sprintf("%s/api/v1/orgs/%s/members/me", baseURL, orgName) - - // First try the /members/me endpoint +// deleteOrg deletes the organization entirely via DELETE /api/v1/orgs/{org}. +func deleteOrg(baseURL, token, orgName string) error { + url := fmt.Sprintf("%s/api/v1/orgs/%s", baseURL, orgName) _, err := doRequest(http.MethodDelete, url, token) - if err != nil { - // Fallback: get username and use explicit member removal - username, userErr := getUsername(baseURL, token) - if userErr != nil { - return fmt.Errorf("leave org: %w (also failed to get username: %v)", err, userErr) - } - url = fmt.Sprintf("%s/api/v1/orgs/%s/members/%s", baseURL, orgName, username) - _, err = doRequest(http.MethodDelete, url, token) - } return err } -// getUsername returns the authenticated user's username. -func getUsername(baseURL, token string) (string, error) { - body, err := doRequest(http.MethodGet, baseURL+"/api/v1/user", token) - if err != nil { - return "", err - } - var user struct { - Login string `json:"login"` - } - if err := json.Unmarshal(body, &user); err != nil { - return "", err - } - return user.Login, nil -} - // doRequest executes an HTTP request with token auth and returns the response body. func doRequest(method, url, token string) ([]byte, error) { req, err := http.NewRequest(method, url, nil)