| |
|
|
| package openmeter |
|
|
| import ( |
| "context" |
| "fmt" |
| "iter" |
| "net/http" |
| "net/url" |
| ) |
|
|
| type AddonsService struct { |
| client *Client |
| } |
|
|
| type AddonFilter struct { |
| ID *StringExactFilter |
| Key *StringFilter |
| Name *StringFilter |
| Status *StringExactFilter |
| Currency *StringExactFilter |
| } |
|
|
| type AddonListParams struct { |
| Page *PageParams |
| Sort *Sort |
| Filter *AddonFilter |
| } |
|
|
| func (p AddonListParams) values() url.Values { |
| q := url.Values{} |
|
|
| addPageParams(q, p.Page) |
|
|
| addSort(q, "sort", p.Sort) |
|
|
| if p.Filter != nil { |
| addStringExactFilter(q, "filter[id]", p.Filter.ID) |
| addStringFilter(q, "filter[key]", p.Filter.Key) |
| addStringFilter(q, "filter[name]", p.Filter.Name) |
| addStringExactFilter(q, "filter[status]", p.Filter.Status) |
| addStringExactFilter(q, "filter[currency]", p.Filter.Currency) |
| } |
|
|
| return q |
| } |
|
|
| |
| func (s *AddonsService) List(ctx context.Context, params AddonListParams) (*AddonPagePaginatedResponse, error) { |
| path := "/openmeter/addons" |
|
|
| req, err := s.client.newRequestWithContentType(ctx, http.MethodGet, path, params.values(), nil, "", "application/json") |
| if err != nil { |
| return nil, err |
| } |
|
|
| var out AddonPagePaginatedResponse |
| if err := s.client.doJSON(req, &out); err != nil { |
| return nil, err |
| } |
|
|
| return &out, nil |
| } |
|
|
| |
| func (s *AddonsService) ListAll(ctx context.Context, params AddonListParams) iter.Seq2[Addon, error] { |
| return paginate(params.Page, func(page, size int) ([]Addon, int, error) { |
| pageParams := params |
| pageParams.Page = &PageParams{Size: Int(size), Number: Int(page)} |
|
|
| resp, err := s.List(ctx, pageParams) |
| if err != nil { |
| return nil, 0, err |
| } |
|
|
| return resp.Data, resp.Meta.Page.Total, nil |
| }) |
| } |
|
|
| |
| func (s *AddonsService) Create(ctx context.Context, request CreateAddonRequest) (*Addon, error) { |
| path := "/openmeter/addons" |
|
|
| req, err := s.client.newRequestWithContentType(ctx, http.MethodPost, path, nil, request, "application/json", "application/json") |
| if err != nil { |
| return nil, err |
| } |
|
|
| var out Addon |
| if err := s.client.doJSON(req, &out); err != nil { |
| return nil, err |
| } |
|
|
| return &out, nil |
| } |
|
|
| |
| func (s *AddonsService) Update(ctx context.Context, addonID string, request UpsertAddonRequest) (*Addon, error) { |
| if addonID == "" { |
| return nil, fmt.Errorf("openmeter: %s must not be empty: %w", "addonID", ErrEmptyID) |
| } |
|
|
| path := "/openmeter/addons/{addonId}" |
|
|
| path = replacePathParam(path, "addonId", addonID) |
|
|
| req, err := s.client.newRequestWithContentType(ctx, http.MethodPut, path, nil, request, "application/json", "application/json") |
| if err != nil { |
| return nil, err |
| } |
|
|
| var out Addon |
| if err := s.client.doJSON(req, &out); err != nil { |
| return nil, err |
| } |
|
|
| return &out, nil |
| } |
|
|
| |
| func (s *AddonsService) Get(ctx context.Context, addonID string) (*Addon, error) { |
| if addonID == "" { |
| return nil, fmt.Errorf("openmeter: %s must not be empty: %w", "addonID", ErrEmptyID) |
| } |
|
|
| path := "/openmeter/addons/{addonId}" |
|
|
| path = replacePathParam(path, "addonId", addonID) |
|
|
| req, err := s.client.newRequestWithContentType(ctx, http.MethodGet, path, nil, nil, "", "application/json") |
| if err != nil { |
| return nil, err |
| } |
|
|
| var out Addon |
| if err := s.client.doJSON(req, &out); err != nil { |
| return nil, err |
| } |
|
|
| return &out, nil |
| } |
|
|
| |
| func (s *AddonsService) Delete(ctx context.Context, addonID string) error { |
| if addonID == "" { |
| return fmt.Errorf("openmeter: %s must not be empty: %w", "addonID", ErrEmptyID) |
| } |
|
|
| path := "/openmeter/addons/{addonId}" |
|
|
| path = replacePathParam(path, "addonId", addonID) |
|
|
| req, err := s.client.newRequestWithContentType(ctx, http.MethodDelete, path, nil, nil, "", "") |
| if err != nil { |
| return err |
| } |
|
|
| _, err = s.client.doRaw(req) |
| return err |
| } |
|
|
| |
| func (s *AddonsService) Archive(ctx context.Context, addonID string) (*Addon, error) { |
| if addonID == "" { |
| return nil, fmt.Errorf("openmeter: %s must not be empty: %w", "addonID", ErrEmptyID) |
| } |
|
|
| path := "/openmeter/addons/{addonId}/archive" |
|
|
| path = replacePathParam(path, "addonId", addonID) |
|
|
| req, err := s.client.newRequestWithContentType(ctx, http.MethodPost, path, nil, nil, "", "application/json") |
| if err != nil { |
| return nil, err |
| } |
|
|
| var out Addon |
| if err := s.client.doJSON(req, &out); err != nil { |
| return nil, err |
| } |
|
|
| return &out, nil |
| } |
|
|
| |
| func (s *AddonsService) Publish(ctx context.Context, addonID string) (*Addon, error) { |
| if addonID == "" { |
| return nil, fmt.Errorf("openmeter: %s must not be empty: %w", "addonID", ErrEmptyID) |
| } |
|
|
| path := "/openmeter/addons/{addonId}/publish" |
|
|
| path = replacePathParam(path, "addonId", addonID) |
|
|
| req, err := s.client.newRequestWithContentType(ctx, http.MethodPost, path, nil, nil, "", "application/json") |
| if err != nil { |
| return nil, err |
| } |
|
|
| var out Addon |
| if err := s.client.doJSON(req, &out); err != nil { |
| return nil, err |
| } |
|
|
| return &out, nil |
| } |
|
|