diff --git a/.stats.yml b/.stats.yml index 224e9c6..43528ff 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,2 +1,2 @@ -configured_endpoints: 27 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/terminal%2Fterminal-967b257f759fb4b78a7b5b5803f8f51fc92d1b42bc3aec78f57dfac2ce599d66.yml +configured_endpoints: 29 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/terminal%2Fterminal-168780e70e1a37038f9208c6e92cb9271ef973ce745a17fb4a148aaa3e2ed2d1.yml diff --git a/api.md b/api.md index 8ca31b5..29d7289 100644 --- a/api.md +++ b/api.md @@ -100,7 +100,7 @@ Response Types: Methods: -- client.Subscription.New(ctx context.Context, body terminal.SubscriptionNewParams) (terminal.SubscriptionNewResponse, error) +- client.Subscription.New(ctx context.Context, body terminal.SubscriptionNewParams) (terminal.SubscriptionNewResponse, error) - client.Subscription.List(ctx context.Context) (terminal.SubscriptionListResponse, error) - client.Subscription.Delete(ctx context.Context, id string) (terminal.SubscriptionDeleteResponse, error) @@ -109,27 +109,35 @@ Methods: Response Types: - terminal.Token +- terminal.TokenNewResponse - terminal.TokenListResponse - terminal.TokenDeleteResponse - terminal.TokenGetResponse Methods: +- client.Token.New(ctx context.Context) (terminal.TokenNewResponse, error) - client.Token.List(ctx context.Context) (terminal.TokenListResponse, error) - client.Token.Delete(ctx context.Context, id string) (terminal.TokenDeleteResponse, error) - client.Token.Get(ctx context.Context, id string) (terminal.TokenGetResponse, error) # App +Params Types: + +- terminal.AppParam + Response Types: - terminal.App +- terminal.AppNewResponse - terminal.AppListResponse - terminal.AppDeleteResponse - terminal.AppGetResponse Methods: +- client.App.New(ctx context.Context, body terminal.AppNewParams) (terminal.AppNewResponse, error) - client.App.List(ctx context.Context) (terminal.AppListResponse, error) - client.App.Delete(ctx context.Context, id string) (terminal.AppDeleteResponse, error) - client.App.Get(ctx context.Context, id string) (terminal.AppGetResponse, error) diff --git a/app.go b/app.go index 1f8713d..ce3b0ef 100644 --- a/app.go +++ b/app.go @@ -9,6 +9,7 @@ import ( "net/http" "github.com/terminaldotshop/terminal-sdk-go/internal/apijson" + "github.com/terminaldotshop/terminal-sdk-go/internal/param" "github.com/terminaldotshop/terminal-sdk-go/internal/requestconfig" "github.com/terminaldotshop/terminal-sdk-go/option" ) @@ -32,6 +33,14 @@ func NewAppService(opts ...option.RequestOption) (r *AppService) { return } +// Create an app. +func (r *AppService) New(ctx context.Context, body AppNewParams, opts ...option.RequestOption) (res *AppNewResponse, err error) { + opts = append(r.Options[:], opts...) + path := "app" + err = requestconfig.ExecuteNewRequest(ctx, http.MethodPost, path, body, &res, opts...) + return +} + // List the current user's registered apps. func (r *AppService) List(ctx context.Context, opts ...option.RequestOption) (res *AppListResponse, err error) { opts = append(r.Options[:], opts...) @@ -92,6 +101,65 @@ func (r appJSON) RawJSON() string { return r.raw } +// A Terminal App used for configuring an OAuth 2.0 client. +type AppParam struct { + // Unique object identifier. The format and length of IDs may change over time. + ID param.Field[string] `json:"id,required"` + // Name of the app. + Name param.Field[string] `json:"name,required"` + // Redirect URI of the app. + RedirectUri param.Field[string] `json:"redirectURI,required"` +} + +func (r AppParam) MarshalJSON() (data []byte, err error) { + return apijson.MarshalRoot(r) +} + +type AppNewResponse struct { + Data AppNewResponseData `json:"data,required"` + JSON appNewResponseJSON `json:"-"` +} + +// appNewResponseJSON contains the JSON metadata for the struct [AppNewResponse] +type appNewResponseJSON struct { + Data apijson.Field + raw string + ExtraFields map[string]apijson.Field +} + +func (r *AppNewResponse) UnmarshalJSON(data []byte) (err error) { + return apijson.UnmarshalRoot(data, r) +} + +func (r appNewResponseJSON) RawJSON() string { + return r.raw +} + +type AppNewResponseData struct { + // OAuth 2.0 client ID. + ID string `json:"id,required"` + // OAuth 2.0 client secret. + Secret string `json:"secret,required"` + JSON appNewResponseDataJSON `json:"-"` +} + +// appNewResponseDataJSON contains the JSON metadata for the struct +// [AppNewResponseData] +type appNewResponseDataJSON struct { + ID apijson.Field + Secret apijson.Field + raw string + ExtraFields map[string]apijson.Field +} + +func (r *AppNewResponseData) UnmarshalJSON(data []byte) (err error) { + return apijson.UnmarshalRoot(data, r) +} + +func (r appNewResponseDataJSON) RawJSON() string { + return r.raw +} + type AppListResponse struct { // List of apps. Data []App `json:"data,required"` @@ -168,3 +236,12 @@ func (r *AppGetResponse) UnmarshalJSON(data []byte) (err error) { func (r appGetResponseJSON) RawJSON() string { return r.raw } + +type AppNewParams struct { + // A Terminal App used for configuring an OAuth 2.0 client. + App AppParam `json:"app,required"` +} + +func (r AppNewParams) MarshalJSON() (data []byte, err error) { + return apijson.MarshalRoot(r.App) +} diff --git a/app_test.go b/app_test.go index 351d709..9d8b282 100644 --- a/app_test.go +++ b/app_test.go @@ -13,6 +13,34 @@ import ( "github.com/terminaldotshop/terminal-sdk-go/option" ) +func TestAppNew(t *testing.T) { + baseURL := "http://localhost:4010" + if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok { + baseURL = envURL + } + if !testutil.CheckTestServer(t, baseURL) { + return + } + client := terminal.NewClient( + option.WithBaseURL(baseURL), + option.WithBearerToken("My Bearer Token"), + ) + _, err := client.App.New(context.TODO(), terminal.AppNewParams{ + App: terminal.AppParam{ + ID: terminal.F("cli_XXXXXXXXXXXXXXXXXXXXXXXXX"), + Name: terminal.F("Example App"), + RedirectUri: terminal.F("https://example.com/callback"), + }, + }) + if err != nil { + var apierr *terminal.Error + if errors.As(err, &apierr) { + t.Log(string(apierr.DumpRequest(true))) + } + t.Fatalf("err should be nil: %s", err.Error()) + } +} + func TestAppList(t *testing.T) { baseURL := "http://localhost:4010" if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok { diff --git a/subscription.go b/subscription.go index eb94d6b..6e9b189 100644 --- a/subscription.go +++ b/subscription.go @@ -37,7 +37,7 @@ func NewSubscriptionService(opts ...option.RequestOption) (r *SubscriptionServic func (r *SubscriptionService) New(ctx context.Context, body SubscriptionNewParams, opts ...option.RequestOption) (res *SubscriptionNewResponse, err error) { opts = append(r.Options[:], opts...) path := "subscription" - err = requestconfig.ExecuteNewRequest(ctx, http.MethodPut, path, body, &res, opts...) + err = requestconfig.ExecuteNewRequest(ctx, http.MethodPost, path, body, &res, opts...) return } diff --git a/token.go b/token.go index 1568ddc..868fde0 100644 --- a/token.go +++ b/token.go @@ -32,6 +32,14 @@ func NewTokenService(opts ...option.RequestOption) (r *TokenService) { return } +// Create a personal access token. +func (r *TokenService) New(ctx context.Context, opts ...option.RequestOption) (res *TokenNewResponse, err error) { + opts = append(r.Options[:], opts...) + path := "token" + err = requestconfig.ExecuteNewRequest(ctx, http.MethodPost, path, nil, &res, opts...) + return +} + // List the current user's personal access tokens. func (r *TokenService) List(ctx context.Context, opts ...option.RequestOption) (res *TokenListResponse, err error) { opts = append(r.Options[:], opts...) @@ -115,6 +123,53 @@ func (r tokenTimeJSON) RawJSON() string { return r.raw } +type TokenNewResponse struct { + Data TokenNewResponseData `json:"data,required"` + JSON tokenNewResponseJSON `json:"-"` +} + +// tokenNewResponseJSON contains the JSON metadata for the struct +// [TokenNewResponse] +type tokenNewResponseJSON struct { + Data apijson.Field + raw string + ExtraFields map[string]apijson.Field +} + +func (r *TokenNewResponse) UnmarshalJSON(data []byte) (err error) { + return apijson.UnmarshalRoot(data, r) +} + +func (r tokenNewResponseJSON) RawJSON() string { + return r.raw +} + +type TokenNewResponseData struct { + // Personal token ID. + ID string `json:"id,required"` + // Personal access token. Include this in the Authorization header + // (`Bearer `) when accessing the Terminal API. + Token string `json:"token,required"` + JSON tokenNewResponseDataJSON `json:"-"` +} + +// tokenNewResponseDataJSON contains the JSON metadata for the struct +// [TokenNewResponseData] +type tokenNewResponseDataJSON struct { + ID apijson.Field + Token apijson.Field + raw string + ExtraFields map[string]apijson.Field +} + +func (r *TokenNewResponseData) UnmarshalJSON(data []byte) (err error) { + return apijson.UnmarshalRoot(data, r) +} + +func (r tokenNewResponseDataJSON) RawJSON() string { + return r.raw +} + type TokenListResponse struct { // List of personal access tokens. Data []Token `json:"data,required"` diff --git a/token_test.go b/token_test.go index 8917ea9..35b8b19 100644 --- a/token_test.go +++ b/token_test.go @@ -13,6 +13,28 @@ import ( "github.com/terminaldotshop/terminal-sdk-go/option" ) +func TestTokenNew(t *testing.T) { + baseURL := "http://localhost:4010" + if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok { + baseURL = envURL + } + if !testutil.CheckTestServer(t, baseURL) { + return + } + client := terminal.NewClient( + option.WithBaseURL(baseURL), + option.WithBearerToken("My Bearer Token"), + ) + _, err := client.Token.New(context.TODO()) + if err != nil { + var apierr *terminal.Error + if errors.As(err, &apierr) { + t.Log(string(apierr.DumpRequest(true))) + } + t.Fatalf("err should be nil: %s", err.Error()) + } +} + func TestTokenList(t *testing.T) { baseURL := "http://localhost:4010" if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {