import (
"context"
"fmt"
"time"
"github.com/auth0/go-auth0/v2"
"github.com/auth0/go-auth0/v2/management"
)
func getClientWithRetry(api *management.Management, ctx context.Context, clientID string) (*management.Client, error) {
maxRetries := 3
for i := 0; i < maxRetries; i++ {
client, err := api.Client.Read(ctx, clientID)
if err == nil {
return client, nil
}
switch e := err.(type) {
case *management.NotFoundError:
// Client doesn't exist, no point retrying
return nil, fmt.Errorf("client not found: %s", clientID)
case *management.UnauthorizedError:
// Auth failed, no point retrying without new credentials
return nil, fmt.Errorf("authentication failed")
case *management.TooManyRequestsError:
// Rate limited, wait and retry
if i < maxRetries-1 {
waitTime := time.Duration(i+1) * time.Second
fmt.Printf("Rate limited, waiting %v before retry\n", waitTime)
time.Sleep(waitTime)
continue
}
return nil, fmt.Errorf("rate limited after %d retries", maxRetries)
case *management.InternalServerError:
// Server error, might be transient, retry
if i < maxRetries-1 {
fmt.Printf("Server error, retrying (attempt %d/%d)\n", i+1, maxRetries)
time.Sleep(time.Second)
continue
}
return nil, fmt.Errorf("server error after %d retries", maxRetries)
default:
// Unknown error
return nil, fmt.Errorf("unexpected error: %v", err)
}
}
return nil, fmt.Errorf("failed after %d retries", maxRetries)
}