package client import ( "encoding/json" "fmt" "git.db.org.ai/dborg/internal/models" "net/url" ) func (c *Client) ListAccounts() (*models.AdminResponse, error) { data, err := c.Get("/admin/accounts", nil) if err != nil { return nil, err } 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) CreateAccount(req *models.AccountCreateRequest) (*models.AdminResponse, error) { data, err := c.Post("/admin/accounts", 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) DeleteAccount(apiKey string) (*models.AdminResponse, error) { path := fmt.Sprintf("/admin/accounts/%s", url.PathEscape(apiKey)) data, err := c.Delete(path) if err != nil { return nil, err } 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) UpdateCredits(apiKey string, credits int) (*models.AdminResponse, error) { path := fmt.Sprintf("/admin/accounts/%s/credits", url.PathEscape(apiKey)) req := &models.AddCreditsRequest{ Credits: credits, } data, err := c.Post(path, req) if err != nil { return nil, err } 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) SetCredits(apiKey string, credits int) (*models.AdminResponse, error) { path := fmt.Sprintf("/admin/accounts/%s/credits", url.PathEscape(apiKey)) req := &models.SetCreditsRequest{ Credits: credits, } data, err := c.Put(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) ToggleAccount(apiKey string, enable bool) (*models.AdminResponse, error) { path := fmt.Sprintf("/admin/accounts/%s/disable", url.PathEscape(apiKey)) req := &models.DisableAccountRequest{ Disabled: !enable, } data, err := c.Patch(path, req) if err != nil { return nil, err } 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) 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 { return nil, err } var response models.AccountStatsResponse if err := json.Unmarshal(data, &response); err != nil { return nil, fmt.Errorf("failed to parse account stats response: %w", err) } return &response, nil } // GetCreditUsageLogs fetches raw credit_usage_log rows. // accountID=0 means all accounts. func (c *Client) GetCreditUsageLogs(accountID int, limit int) (*models.CreditUsageLogsResponse, error) { params := url.Values{} if accountID > 0 { params.Set("account_id", fmt.Sprintf("%d", accountID)) } if limit > 0 { params.Set("limit", fmt.Sprintf("%d", limit)) } data, err := c.Get("/admin/usage/logs", params) if err != nil { return nil, err } var response models.CreditUsageLogsResponse if err := json.Unmarshal(data, &response); err != nil { return nil, fmt.Errorf("failed to parse usage logs response: %w", err) } return &response, nil } // GetCreditUsageByEndpoint fetches per-endpoint aggregate stats. func (c *Client) GetCreditUsageByEndpoint(from, to string) (*models.CreditUsageByEndpointResponse, error) { params := url.Values{} if from != "" { params.Set("from", from) } if to != "" { params.Set("to", to) } data, err := c.Get("/admin/usage/by-endpoint", params) if err != nil { return nil, err } var response models.CreditUsageByEndpointResponse if err := json.Unmarshal(data, &response); err != nil { return nil, fmt.Errorf("failed to parse usage by-endpoint response: %w", err) } return &response, nil } // GetCreditUsageByAccount fetches per-account per-endpoint aggregate stats. // accountID=0 means all accounts. func (c *Client) GetCreditUsageByAccount(accountID int, from, to string) (*models.CreditUsageByAccountResponse, error) { params := url.Values{} if accountID > 0 { params.Set("account_id", fmt.Sprintf("%d", accountID)) } if from != "" { params.Set("from", from) } if to != "" { params.Set("to", to) } data, err := c.Get("/admin/usage/by-account", params) if err != nil { return nil, err } var response models.CreditUsageByAccountResponse if err := json.Unmarshal(data, &response); err != nil { return nil, fmt.Errorf("failed to parse usage by-account response: %w", err) } return &response, nil }