From 6c8beb133073ebb3b6d8bb16e852b29dbc23f133 Mon Sep 17 00:00:00 2001 From: sinner Date: Wed, 8 Apr 2026 13:47:51 -0400 Subject: feat: add admin edit command for updating account properties --- internal/client/admin.go | 23 ++++++++++++++++++++++ internal/formatter/admin.go | 47 +++++++++++++++++++++++++++++++++++++++++++++ internal/models/admin.go | 7 +++++-- 3 files changed, 75 insertions(+), 2 deletions(-) (limited to 'internal') diff --git a/internal/client/admin.go b/internal/client/admin.go index bf8c5ce..c776b7c 100644 --- a/internal/client/admin.go +++ b/internal/client/admin.go @@ -123,6 +123,29 @@ func (c *Client) ToggleAccount(apiKey string, enable bool) (*models.AdminRespons return &response, nil } +func (c *Client) UpdateAccount(apiKey string, req *models.AccountUpdateRequest) (*models.AdminResponse, error) { + path := fmt.Sprintf("/admin/accounts/%s", url.PathEscape(apiKey)) + data, err := c.Patch(path, req) + if err != nil { + return nil, err + } + + var account models.Account + if err := json.Unmarshal(data, &account); err == nil && account.APIKey != "" { + return &models.AdminResponse{ + Success: true, + Account: &account, + }, nil + } + + var response models.AdminResponse + if err := json.Unmarshal(data, &response); err != nil { + return nil, fmt.Errorf("failed to parse admin response: %w", err) + } + + return &response, nil +} + func (c *Client) GetAccountStats() (*models.AccountStatsResponse, error) { data, err := c.Get("/me", nil) if err != nil { diff --git a/internal/formatter/admin.go b/internal/formatter/admin.go index 12ffcd0..16b8041 100644 --- a/internal/formatter/admin.go +++ b/internal/formatter/admin.go @@ -122,6 +122,53 @@ func FormatAccountCreated(account *models.Account, message string, asJSON bool) return sb.String(), nil } +func FormatAccountUpdated(account *models.Account, message string, asJSON bool) (string, error) { + if asJSON { + response := map[string]interface{}{ + "account": account, + "message": message, + } + err := PrintColorizedJSON(response) + if err != nil { + return "", fmt.Errorf("failed to marshal JSON: %w", err) + } + return "", nil + } + + var sb strings.Builder + sb.WriteString(fmt.Sprintf("\n%s\n\n", Bold(Green("✓ Account updated successfully!")))) + + if account != nil && account.Name != "" { + sb.WriteString(fmt.Sprintf("%s %s\n", Cyan("Name:"), Bold(account.Name))) + } else { + sb.WriteString(fmt.Sprintf("%s %s\n", Cyan("Message:"), message)) + } + + if account != nil { + sb.WriteString(fmt.Sprintf("%s %s\n", Cyan("API Key:"), Dim(account.APIKey))) + + if account.Unlimited { + sb.WriteString(fmt.Sprintf("%s %s\n", Cyan("Credits:"), Green("Unlimited"))) + } else { + sb.WriteString(fmt.Sprintf("%s %s\n", Cyan("Credits:"), FormatCredits(int64(account.Credits)))) + } + + premiumStr := Gray("No") + if account.IsPremium { + premiumStr = Magenta("Yes") + } + sb.WriteString(fmt.Sprintf("%s %s\n", Cyan("Premium:"), premiumStr)) + + statusStr := Green("Active") + if account.Disabled { + statusStr = Red("Disabled") + } + sb.WriteString(fmt.Sprintf("%s %s\n", Cyan("Status:"), statusStr)) + } + + return sb.String(), nil +} + func FormatAccountDeleted(message string, asJSON bool) (string, error) { if asJSON { response := map[string]string{"message": message} diff --git a/internal/models/admin.go b/internal/models/admin.go index ee551f3..7d774a8 100644 --- a/internal/models/admin.go +++ b/internal/models/admin.go @@ -21,8 +21,11 @@ type AccountCreateRequest struct { } type AccountUpdateRequest struct { - Credits int `json:"credits,omitempty"` - Disabled bool `json:"disabled"` + Name *string `json:"name,omitempty"` + Credits *int `json:"credits,omitempty"` + Unlimited *bool `json:"unlimited,omitempty"` + IsPremium *bool `json:"is_premium,omitempty"` + Disabled *bool `json:"disabled,omitempty"` } type AddCreditsRequest struct { -- cgit v1.2.3