mirror of
https://github.com/tiennm99/MTTools.git
synced 2026-08-17 01:21:56 +00:00
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.
This commit is contained in:
+3
-3
@@ -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/<script-name>
|
||||
|
||||
# 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
|
||||
|
||||
@@ -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)
|
||||
Reference in New Issue
Block a user