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 {