Skip to content

Commit

Permalink
chore(api): add backtest methods to AuthRules (#419)
Browse files Browse the repository at this point in the history
  • Loading branch information
stainless-app[bot] authored and stainless-bot committed Nov 26, 2024
1 parent 88a36f9 commit 4d63e87
Show file tree
Hide file tree
Showing 6 changed files with 432 additions and 4 deletions.
2 changes: 1 addition & 1 deletion .stats.yml
Original file line number Diff line number Diff line change
@@ -1 +1 @@
configured_endpoints: 151
configured_endpoints: 153
12 changes: 12 additions & 0 deletions api.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,18 @@ Methods:
- <code title="post /v2/auth_rules/{auth_rule_token}/promote">client.AuthRules.V2.<a href="https://pkg.go.dev/github.com/lithic-com/lithic-go#AuthRuleV2Service.Promote">Promote</a>(ctx <a href="https://pkg.go.dev/context">context</a>.<a href="https://pkg.go.dev/context#Context">Context</a>, authRuleToken <a href="https://pkg.go.dev/builtin#string">string</a>) (<a href="https://pkg.go.dev/github.com/lithic-com/lithic-go">lithic</a>.<a href="https://pkg.go.dev/github.com/lithic-com/lithic-go#AuthRuleV2PromoteResponse">AuthRuleV2PromoteResponse</a>, <a href="https://pkg.go.dev/builtin#error">error</a>)</code>
- <code title="post /v2/auth_rules/{auth_rule_token}/report">client.AuthRules.V2.<a href="https://pkg.go.dev/github.com/lithic-com/lithic-go#AuthRuleV2Service.Report">Report</a>(ctx <a href="https://pkg.go.dev/context">context</a>.<a href="https://pkg.go.dev/context#Context">Context</a>, authRuleToken <a href="https://pkg.go.dev/builtin#string">string</a>) (<a href="https://pkg.go.dev/github.com/lithic-com/lithic-go">lithic</a>.<a href="https://pkg.go.dev/github.com/lithic-com/lithic-go#AuthRuleV2ReportResponse">AuthRuleV2ReportResponse</a>, <a href="https://pkg.go.dev/builtin#error">error</a>)</code>

### Backtests

Response Types:

- <a href="https://pkg.go.dev/github.com/lithic-com/lithic-go">lithic</a>.<a href="https://pkg.go.dev/github.com/lithic-com/lithic-go#BacktestResults">BacktestResults</a>
- <a href="https://pkg.go.dev/github.com/lithic-com/lithic-go">lithic</a>.<a href="https://pkg.go.dev/github.com/lithic-com/lithic-go#AuthRuleV2BacktestNewResponse">AuthRuleV2BacktestNewResponse</a>

Methods:

- <code title="post /v2/auth_rules/{auth_rule_token}/backtests">client.AuthRules.V2.Backtests.<a href="https://pkg.go.dev/github.com/lithic-com/lithic-go#AuthRuleV2BacktestService.New">New</a>(ctx <a href="https://pkg.go.dev/context">context</a>.<a href="https://pkg.go.dev/context#Context">Context</a>, authRuleToken <a href="https://pkg.go.dev/builtin#string">string</a>, body <a href="https://pkg.go.dev/github.com/lithic-com/lithic-go">lithic</a>.<a href="https://pkg.go.dev/github.com/lithic-com/lithic-go#AuthRuleV2BacktestNewParams">AuthRuleV2BacktestNewParams</a>) (<a href="https://pkg.go.dev/github.com/lithic-com/lithic-go">lithic</a>.<a href="https://pkg.go.dev/github.com/lithic-com/lithic-go#AuthRuleV2BacktestNewResponse">AuthRuleV2BacktestNewResponse</a>, <a href="https://pkg.go.dev/builtin#error">error</a>)</code>
- <code title="get /v2/auth_rules/{auth_rule_token}/backtests/{auth_rule_backtest_token}">client.AuthRules.V2.Backtests.<a href="https://pkg.go.dev/github.com/lithic-com/lithic-go#AuthRuleV2BacktestService.Get">Get</a>(ctx <a href="https://pkg.go.dev/context">context</a>.<a href="https://pkg.go.dev/context#Context">Context</a>, authRuleToken <a href="https://pkg.go.dev/builtin#string">string</a>, authRuleBacktestToken <a href="https://pkg.go.dev/builtin#string">string</a>) (<a href="https://pkg.go.dev/github.com/lithic-com/lithic-go">lithic</a>.<a href="https://pkg.go.dev/github.com/lithic-com/lithic-go#BacktestResults">BacktestResults</a>, <a href="https://pkg.go.dev/builtin#error">error</a>)</code>

# AuthStreamEnrollment

Response Types:
Expand Down
4 changes: 3 additions & 1 deletion authrulev2.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ import (
// automatically. You should not instantiate this service directly, and instead use
// the [NewAuthRuleV2Service] method instead.
type AuthRuleV2Service struct {
Options []option.RequestOption
Options []option.RequestOption
Backtests *AuthRuleV2BacktestService
}

// NewAuthRuleV2Service generates a new service that applies the given options to
Expand All @@ -36,6 +37,7 @@ type AuthRuleV2Service struct {
func NewAuthRuleV2Service(opts ...option.RequestOption) (r *AuthRuleV2Service) {
r = &AuthRuleV2Service{}
r.Options = opts
r.Backtests = NewAuthRuleV2BacktestService(opts...)
return
}

Expand Down
341 changes: 341 additions & 0 deletions authrulev2backtest.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,341 @@
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.

package lithic

import (
"context"
"errors"
"fmt"
"net/http"
"time"

"github.com/lithic-com/lithic-go/internal/apijson"
"github.com/lithic-com/lithic-go/internal/param"
"github.com/lithic-com/lithic-go/internal/requestconfig"
"github.com/lithic-com/lithic-go/option"
)

// AuthRuleV2BacktestService contains methods and other services that help with
// interacting with the lithic API.
//
// Note, unlike clients, this service does not read variables from the environment
// automatically. You should not instantiate this service directly, and instead use
// the [NewAuthRuleV2BacktestService] method instead.
type AuthRuleV2BacktestService struct {
Options []option.RequestOption
}

// NewAuthRuleV2BacktestService generates a new service that applies the given
// options to each request. These options are applied after the parent client's
// options (if there is one), and before any request-specific options.
func NewAuthRuleV2BacktestService(opts ...option.RequestOption) (r *AuthRuleV2BacktestService) {
r = &AuthRuleV2BacktestService{}
r.Options = opts
return
}

// Initiates a request to asynchronously generate a backtest for an authorization
// rule. During backtesting, both the active version (if one exists) and the draft
// version of the Authorization Rule are evaluated by replaying historical
// transaction data against the rule's conditions. This process allows customers to
// simulate and understand the effects of proposed rule changes before deployment.
// The generated backtest report provides detailed results showing whether the
// draft version of the Auth Rule would have approved or declined historical
// transactions which were processed during the backtest period. These reports help
// evaluate how changes to rule configurations might affect overall transaction
// approval rates.
//
// The generated backtest report will be delivered asynchronously through a webhook
// with `event_type` = `auth_rules.backtest_report.created`. See the docs on
// setting up [webhook subscriptions](https://docs.lithic.com/docs/events-api). It
// is also possible to request backtest reports on-demand through the
// `/v2/auth_rules/{auth_rule_token}/backtests/{auth_rule_backtest_token}`
// endpoint.
//
// Lithic currently supports backtesting for `CONDITIONAL_BLOCK` rules. Backtesting
// for `VELOCITY_LIMIT` rules is generally not supported. In specific cases (i.e.
// where Lithic has pre-calculated the requested velocity metrics for historical
// transactions), a backtest may be feasible. However, such cases are uncommon and
// customers should not anticipate support for velocity backtests under most
// configurations. If a historical transaction does not feature the required inputs
// to evaluate the rule, then it will not be included in the final backtest report.
func (r *AuthRuleV2BacktestService) New(ctx context.Context, authRuleToken string, body AuthRuleV2BacktestNewParams, opts ...option.RequestOption) (res *AuthRuleV2BacktestNewResponse, err error) {
opts = append(r.Options[:], opts...)
if authRuleToken == "" {
err = errors.New("missing required auth_rule_token parameter")
return
}
path := fmt.Sprintf("v2/auth_rules/%s/backtests", authRuleToken)
err = requestconfig.ExecuteNewRequest(ctx, http.MethodPost, path, body, &res, opts...)
return
}

// Returns the backtest results of an authorization rule (if available).
//
// Backtesting is an asynchronous process that requires time to complete. If a
// customer retrieves the backtest results using this endpoint before the report is
// fully generated, the response will return null for `results.current_version` and
// `results.draft_version`. Customers are advised to wait for the backtest creation
// process to complete (as indicated by the webhook event
// auth_rules.backtest_report.created) before retrieving results from this
// endpoint.
//
// Backtesting is an asynchronous process, while the backtest is being processed,
// results will not be available which will cause `results.current_version` and
// `results.draft_version` objects to contain `null`. The entries in `results` will
// also always represent the configuration of the rule at the time requests are
// made to this endpoint. For example, the results for `current_version` in the
// served backtest report will be consistent with which version of the rule is
// currently activated in the Auth Stream, regardless of which version of the rule
// was active in the Auth Stream at the time a backtest is requested.
func (r *AuthRuleV2BacktestService) Get(ctx context.Context, authRuleToken string, authRuleBacktestToken string, opts ...option.RequestOption) (res *BacktestResults, err error) {
opts = append(r.Options[:], opts...)
if authRuleToken == "" {
err = errors.New("missing required auth_rule_token parameter")
return
}
if authRuleBacktestToken == "" {
err = errors.New("missing required auth_rule_backtest_token parameter")
return
}
path := fmt.Sprintf("v2/auth_rules/%s/backtests/%s", authRuleToken, authRuleBacktestToken)
err = requestconfig.ExecuteNewRequest(ctx, http.MethodGet, path, nil, &res, opts...)
return
}

type BacktestResults struct {
// Auth Rule Backtest Token
BacktestToken string `json:"backtest_token,required" format:"uuid"`
Results BacktestResultsResults `json:"results,required"`
SimulationParameters BacktestResultsSimulationParameters `json:"simulation_parameters,required"`
JSON backtestResultsJSON `json:"-"`
}

// backtestResultsJSON contains the JSON metadata for the struct [BacktestResults]
type backtestResultsJSON struct {
BacktestToken apijson.Field
Results apijson.Field
SimulationParameters apijson.Field
raw string
ExtraFields map[string]apijson.Field
}

func (r *BacktestResults) UnmarshalJSON(data []byte) (err error) {
return apijson.UnmarshalRoot(data, r)
}

func (r backtestResultsJSON) RawJSON() string {
return r.raw
}

type BacktestResultsResults struct {
CurrentVersion BacktestResultsResultsCurrentVersion `json:"current_version,nullable"`
DraftVersion BacktestResultsResultsDraftVersion `json:"draft_version,nullable"`
JSON backtestResultsResultsJSON `json:"-"`
}

// backtestResultsResultsJSON contains the JSON metadata for the struct
// [BacktestResultsResults]
type backtestResultsResultsJSON struct {
CurrentVersion apijson.Field
DraftVersion apijson.Field
raw string
ExtraFields map[string]apijson.Field
}

func (r *BacktestResultsResults) UnmarshalJSON(data []byte) (err error) {
return apijson.UnmarshalRoot(data, r)
}

func (r backtestResultsResultsJSON) RawJSON() string {
return r.raw
}

type BacktestResultsResultsCurrentVersion struct {
// The total number of historical transactions approved by this rule during the
// backtest period, or the number of transactions that would have been approved if
// the rule was evaluated in shadow mode.
Approved int64 `json:"approved"`
// The total number of historical transactions declined by this rule during the
// backtest period, or the number of transactions that would have been declined if
// the rule was evaluated in shadow mode.
Declined int64 `json:"declined"`
// Example authorization request events that would have been approved or declined.
Examples []BacktestResultsResultsCurrentVersionExample `json:"examples"`
// The version of the rule, this is incremented whenever the rule's parameters
// change.
Version int64 `json:"version"`
JSON backtestResultsResultsCurrentVersionJSON `json:"-"`
}

// backtestResultsResultsCurrentVersionJSON contains the JSON metadata for the
// struct [BacktestResultsResultsCurrentVersion]
type backtestResultsResultsCurrentVersionJSON struct {
Approved apijson.Field
Declined apijson.Field
Examples apijson.Field
Version apijson.Field
raw string
ExtraFields map[string]apijson.Field
}

func (r *BacktestResultsResultsCurrentVersion) UnmarshalJSON(data []byte) (err error) {
return apijson.UnmarshalRoot(data, r)
}

func (r backtestResultsResultsCurrentVersionJSON) RawJSON() string {
return r.raw
}

type BacktestResultsResultsCurrentVersionExample struct {
// Whether the rule would have approved the authorization request.
Approved bool `json:"approved"`
// The authorization request event token.
EventToken string `json:"event_token" format:"uuid"`
// The timestamp of the authorization request event.
Timestamp time.Time `json:"timestamp" format:"date-time"`
JSON backtestResultsResultsCurrentVersionExampleJSON `json:"-"`
}

// backtestResultsResultsCurrentVersionExampleJSON contains the JSON metadata for
// the struct [BacktestResultsResultsCurrentVersionExample]
type backtestResultsResultsCurrentVersionExampleJSON struct {
Approved apijson.Field
EventToken apijson.Field
Timestamp apijson.Field
raw string
ExtraFields map[string]apijson.Field
}

func (r *BacktestResultsResultsCurrentVersionExample) UnmarshalJSON(data []byte) (err error) {
return apijson.UnmarshalRoot(data, r)
}

func (r backtestResultsResultsCurrentVersionExampleJSON) RawJSON() string {
return r.raw
}

type BacktestResultsResultsDraftVersion struct {
// The total number of historical transactions approved by this rule during the
// backtest period, or the number of transactions that would have been approved if
// the rule was evaluated in shadow mode.
Approved int64 `json:"approved"`
// The total number of historical transactions declined by this rule during the
// backtest period, or the number of transactions that would have been declined if
// the rule was evaluated in shadow mode.
Declined int64 `json:"declined"`
// Example authorization request events that would have been approved or declined.
Examples []BacktestResultsResultsDraftVersionExample `json:"examples"`
// The version of the rule, this is incremented whenever the rule's parameters
// change.
Version int64 `json:"version"`
JSON backtestResultsResultsDraftVersionJSON `json:"-"`
}

// backtestResultsResultsDraftVersionJSON contains the JSON metadata for the struct
// [BacktestResultsResultsDraftVersion]
type backtestResultsResultsDraftVersionJSON struct {
Approved apijson.Field
Declined apijson.Field
Examples apijson.Field
Version apijson.Field
raw string
ExtraFields map[string]apijson.Field
}

func (r *BacktestResultsResultsDraftVersion) UnmarshalJSON(data []byte) (err error) {
return apijson.UnmarshalRoot(data, r)
}

func (r backtestResultsResultsDraftVersionJSON) RawJSON() string {
return r.raw
}

type BacktestResultsResultsDraftVersionExample struct {
// Whether the rule would have approved the authorization request.
Approved bool `json:"approved"`
// The authorization request event token.
EventToken string `json:"event_token" format:"uuid"`
// The timestamp of the authorization request event.
Timestamp time.Time `json:"timestamp" format:"date-time"`
JSON backtestResultsResultsDraftVersionExampleJSON `json:"-"`
}

// backtestResultsResultsDraftVersionExampleJSON contains the JSON metadata for the
// struct [BacktestResultsResultsDraftVersionExample]
type backtestResultsResultsDraftVersionExampleJSON struct {
Approved apijson.Field
EventToken apijson.Field
Timestamp apijson.Field
raw string
ExtraFields map[string]apijson.Field
}

func (r *BacktestResultsResultsDraftVersionExample) UnmarshalJSON(data []byte) (err error) {
return apijson.UnmarshalRoot(data, r)
}

func (r backtestResultsResultsDraftVersionExampleJSON) RawJSON() string {
return r.raw
}

type BacktestResultsSimulationParameters struct {
// Auth Rule Token
AuthRuleToken string `json:"auth_rule_token" format:"uuid"`
// The end time of the simulation.
End time.Time `json:"end" format:"date-time"`
// The start time of the simulation.
Start time.Time `json:"start" format:"date-time"`
JSON backtestResultsSimulationParametersJSON `json:"-"`
}

// backtestResultsSimulationParametersJSON contains the JSON metadata for the
// struct [BacktestResultsSimulationParameters]
type backtestResultsSimulationParametersJSON struct {
AuthRuleToken apijson.Field
End apijson.Field
Start apijson.Field
raw string
ExtraFields map[string]apijson.Field
}

func (r *BacktestResultsSimulationParameters) UnmarshalJSON(data []byte) (err error) {
return apijson.UnmarshalRoot(data, r)
}

func (r backtestResultsSimulationParametersJSON) RawJSON() string {
return r.raw
}

type AuthRuleV2BacktestNewResponse struct {
// Auth Rule Backtest Token
BacktestToken string `json:"backtest_token" format:"uuid"`
JSON authRuleV2BacktestNewResponseJSON `json:"-"`
}

// authRuleV2BacktestNewResponseJSON contains the JSON metadata for the struct
// [AuthRuleV2BacktestNewResponse]
type authRuleV2BacktestNewResponseJSON struct {
BacktestToken apijson.Field
raw string
ExtraFields map[string]apijson.Field
}

func (r *AuthRuleV2BacktestNewResponse) UnmarshalJSON(data []byte) (err error) {
return apijson.UnmarshalRoot(data, r)
}

func (r authRuleV2BacktestNewResponseJSON) RawJSON() string {
return r.raw
}

type AuthRuleV2BacktestNewParams struct {
// The end time of the backtest.
End param.Field[time.Time] `json:"end" format:"date-time"`
// The start time of the backtest.
Start param.Field[time.Time] `json:"start" format:"date-time"`
}

func (r AuthRuleV2BacktestNewParams) MarshalJSON() (data []byte, err error) {
return apijson.MarshalRoot(r)
}
Loading

0 comments on commit 4d63e87

Please sign in to comment.