mirror of
https://github.com/volcengine/OpenViking.git
synced 2026-09-30 17:28:07 +08:00
* feat(auth): support seeded API key generation Allow admin key issuance flows to accept an optional seed so clients can derive predictable user API keys when needed, while preserving random generation by default. * fix(go-sdk): preserve explicit empty seed payloads Use pointer seed options so callers can distinguish omitted seeds from explicit empty seeds, matching the Admin API behavior.
119 lines
4.5 KiB
Go
119 lines
4.5 KiB
Go
package openviking
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"net/url"
|
|
)
|
|
|
|
// AdminCreateAccount creates an account with its first admin user.
|
|
func (c *Client) AdminCreateAccount(ctx context.Context, accountID, adminUserID string) (map[string]any, error) {
|
|
return c.AdminCreateAccountWithOptions(ctx, accountID, adminUserID, nil)
|
|
}
|
|
|
|
// AdminCreateAccountWithOptions creates an account with its first admin user.
|
|
func (c *Client) AdminCreateAccountWithOptions(ctx context.Context, accountID, adminUserID string, opts *AdminCreateAccountOptions) (map[string]any, error) {
|
|
payload := map[string]any{
|
|
"account_id": accountID,
|
|
"admin_user_id": adminUserID,
|
|
}
|
|
if opts != nil && opts.UserConfig != nil {
|
|
payload["user_config"] = opts.UserConfig
|
|
}
|
|
if opts != nil && opts.Seed != nil {
|
|
payload["seed"] = *opts.Seed
|
|
}
|
|
var result map[string]any
|
|
err := c.doJSON(ctx, http.MethodPost, "/api/v1/admin/accounts", nil, payload, &result)
|
|
return result, err
|
|
}
|
|
|
|
// AdminListAccounts lists accounts.
|
|
func (c *Client) AdminListAccounts(ctx context.Context) ([]any, error) {
|
|
var result []any
|
|
err := c.doJSON(ctx, http.MethodGet, "/api/v1/admin/accounts", nil, nil, &result)
|
|
return result, err
|
|
}
|
|
|
|
// AdminDeleteAccount deletes an account and all associated users.
|
|
func (c *Client) AdminDeleteAccount(ctx context.Context, accountID string) (map[string]any, error) {
|
|
var result map[string]any
|
|
err := c.doJSON(ctx, http.MethodDelete, "/api/v1/admin/accounts/"+url.PathEscape(accountID), nil, nil, &result)
|
|
return result, err
|
|
}
|
|
|
|
// AdminRegisterUser registers a user in an account.
|
|
func (c *Client) AdminRegisterUser(ctx context.Context, accountID, userID, role string) (map[string]any, error) {
|
|
return c.AdminRegisterUserWithOptions(ctx, accountID, userID, role, nil)
|
|
}
|
|
|
|
// AdminRegisterUserWithOptions registers a user in an account.
|
|
func (c *Client) AdminRegisterUserWithOptions(ctx context.Context, accountID, userID, role string, opts *AdminRegisterUserOptions) (map[string]any, error) {
|
|
if role == "" {
|
|
role = "user"
|
|
}
|
|
payload := map[string]any{
|
|
"user_id": userID,
|
|
"role": role,
|
|
}
|
|
if opts != nil && opts.UserConfig != nil {
|
|
payload["user_config"] = opts.UserConfig
|
|
}
|
|
if opts != nil && opts.Seed != nil {
|
|
payload["seed"] = *opts.Seed
|
|
}
|
|
var result map[string]any
|
|
err := c.doJSON(ctx, http.MethodPost, "/api/v1/admin/accounts/"+url.PathEscape(accountID)+"/users", nil, payload, &result)
|
|
return result, err
|
|
}
|
|
|
|
// AdminListUsers lists users in an account.
|
|
func (c *Client) AdminListUsers(ctx context.Context, accountID string) ([]any, error) {
|
|
var result []any
|
|
err := c.doJSON(ctx, http.MethodGet, "/api/v1/admin/accounts/"+url.PathEscape(accountID)+"/users", nil, nil, &result)
|
|
return result, err
|
|
}
|
|
|
|
// AdminRemoveUser removes a user from an account.
|
|
func (c *Client) AdminRemoveUser(ctx context.Context, accountID, userID string) (map[string]any, error) {
|
|
var result map[string]any
|
|
err := c.doJSON(ctx, http.MethodDelete, "/api/v1/admin/accounts/"+url.PathEscape(accountID)+"/users/"+url.PathEscape(userID), nil, nil, &result)
|
|
return result, err
|
|
}
|
|
|
|
// AdminSetRole changes a user's role.
|
|
func (c *Client) AdminSetRole(ctx context.Context, accountID, userID, role string) (map[string]any, error) {
|
|
var result map[string]any
|
|
err := c.doJSON(ctx, http.MethodPut, "/api/v1/admin/accounts/"+url.PathEscape(accountID)+"/users/"+url.PathEscape(userID)+"/role", nil, map[string]any{
|
|
"role": role,
|
|
}, &result)
|
|
return result, err
|
|
}
|
|
|
|
// AdminRegenerateKey regenerates a user's API key.
|
|
func (c *Client) AdminRegenerateKey(ctx context.Context, accountID, userID string) (map[string]any, error) {
|
|
return c.AdminRegenerateKeyWithOptions(ctx, accountID, userID, nil)
|
|
}
|
|
|
|
// AdminRegenerateKeyWithOptions regenerates a user's API key.
|
|
func (c *Client) AdminRegenerateKeyWithOptions(ctx context.Context, accountID, userID string, opts *AdminRegenerateKeyOptions) (map[string]any, error) {
|
|
var payload map[string]any
|
|
if opts != nil && opts.Seed != nil {
|
|
payload = map[string]any{"seed": *opts.Seed}
|
|
}
|
|
var result map[string]any
|
|
err := c.doJSON(ctx, http.MethodPost, "/api/v1/admin/accounts/"+url.PathEscape(accountID)+"/users/"+url.PathEscape(userID)+"/key", nil, payload, &result)
|
|
return result, err
|
|
}
|
|
|
|
// AdminMigrate starts legacy data migration or cleanup.
|
|
func (c *Client) AdminMigrate(ctx context.Context, opts *AdminMigrateOptions) (map[string]any, error) {
|
|
action := "migrate"
|
|
if opts != nil && opts.Cleanup {
|
|
action = "cleanup"
|
|
}
|
|
var result map[string]any
|
|
err := c.doJSON(ctx, http.MethodPost, "/api/v1/admin/migrate", nil, map[string]any{"action": action}, &result)
|
|
return result, err
|
|
}
|