Files
sub2api-cn-relay-manager/internal/host/sub2api/list_resources.go

98 lines
2.7 KiB
Go
Raw Normal View History

package sub2api
import (
"context"
"encoding/json"
"fmt"
"strings"
)
func (c *Client) ListManagedResources(ctx context.Context, req ListManagedResourcesRequest) (ManagedResourceSnapshot, error) {
groups, err := c.listNamedResources(ctx, "/api/v1/admin/groups", req.GroupName)
if err != nil {
return ManagedResourceSnapshot{}, fmt.Errorf("list groups: %w", err)
}
channels, err := c.listNamedResources(ctx, "/api/v1/admin/channels", req.ChannelName)
if err != nil {
return ManagedResourceSnapshot{}, fmt.Errorf("list channels: %w", err)
}
plans, err := c.listNamedResources(ctx, "/api/v1/admin/payment/plans", req.PlanName)
if err != nil {
return ManagedResourceSnapshot{}, fmt.Errorf("list plans: %w", err)
}
accounts, err := c.listNamedResources(ctx, "/api/v1/admin/accounts", "")
if err != nil {
return ManagedResourceSnapshot{}, fmt.Errorf("list accounts: %w", err)
}
return ManagedResourceSnapshot{
Groups: groups,
Channels: channels,
Plans: plans,
Accounts: filterNamedResourcesByPrefix(accounts, req.AccountNamePrefix),
}, nil
}
func (c *Client) listNamedResources(ctx context.Context, path, expectedName string) ([]NamedResource, error) {
statusCode, _, body, err := c.perform(ctx, "GET", path, nil)
if err != nil {
return nil, err
}
if statusCode < 200 || statusCode >= 300 {
return nil, newHTTPError("GET", path, statusCode, body)
}
resources, err := decodeNamedResources(body)
if err != nil {
return nil, fmt.Errorf("decode %s response: %w", path, err)
}
return filterNamedResourcesByName(resources, expectedName), nil
}
func decodeNamedResources(body []byte) ([]NamedResource, error) {
var resources []NamedResource
if err := decodeEnvelopeObject(body, &resources); err == nil {
return resources, nil
}
var wrapper struct {
Data struct {
Items []NamedResource `json:"items"`
} `json:"data"`
}
if err := json.Unmarshal(body, &wrapper); err != nil {
return nil, err
}
return wrapper.Data.Items, nil
}
func filterNamedResourcesByName(resources []NamedResource, expectedName string) []NamedResource {
expectedName = strings.TrimSpace(expectedName)
if expectedName == "" {
return resources
}
filtered := make([]NamedResource, 0, len(resources))
for _, resource := range resources {
if strings.TrimSpace(resource.Name) == expectedName {
filtered = append(filtered, resource)
}
}
return filtered
}
func filterNamedResourcesByPrefix(resources []NamedResource, prefix string) []NamedResource {
prefix = strings.TrimSpace(prefix)
if prefix == "" {
return resources
}
filtered := make([]NamedResource, 0, len(resources))
for _, resource := range resources {
if strings.HasPrefix(strings.TrimSpace(resource.Name), prefix) {
filtered = append(filtered, resource)
}
}
return filtered
}