go-wiki/vendor/github.com/stripe/stripe-go/source.go
2020-03-20 00:19:27 +01:00

352 lines
14 KiB
Go

package stripe
import (
"encoding/json"
"github.com/stripe/stripe-go/form"
)
// SourceCodeVerificationFlowStatus represents the possible statuses of a code verification flow.
type SourceCodeVerificationFlowStatus string
// List of values that SourceCodeVerificationFlowStatus can take.
const (
SourceCodeVerificationFlowStatusFailed SourceCodeVerificationFlowStatus = "failed"
SourceCodeVerificationFlowStatusPending SourceCodeVerificationFlowStatus = "pending"
SourceCodeVerificationFlowStatusSucceeded SourceCodeVerificationFlowStatus = "succeeded"
)
// SourceFlow represents the possible flows of a source object.
type SourceFlow string
// List of values that SourceFlow can take.
const (
SourceFlowCodeVerification SourceFlow = "code_verification"
SourceFlowNone SourceFlow = "none"
SourceFlowReceiver SourceFlow = "receiver"
SourceFlowRedirect SourceFlow = "redirect"
)
// SourceMandateAcceptanceStatus represents the possible failure reasons of a redirect flow.
type SourceMandateAcceptanceStatus string
// List of values that SourceMandateAcceptanceStatus can take.
const (
SourceMandateAcceptanceStatusAccepted SourceMandateAcceptanceStatus = "accepted"
SourceMandateAcceptanceStatusRefused SourceMandateAcceptanceStatus = "refused"
)
// SourceMandateNotificationMethod represents the possible methods of notification for a mandate.
type SourceMandateNotificationMethod string
// List of values that SourceMandateNotificationMethod can take.
const (
SourceMandateNotificationMethodEmail SourceMandateNotificationMethod = "email"
SourceMandateNotificationMethodManual SourceMandateNotificationMethod = "manual"
SourceMandateNotificationMethodNone SourceMandateNotificationMethod = "none"
)
// SourceSourceOrderItemType describes the type of source order items on source
// orders for sources.
type SourceSourceOrderItemType string
// The list of possible values for source order item types.
const (
SourceSourceOrderItemTypeDiscount SourceSourceOrderItemType = "discount"
SourceSourceOrderItemTypeSKU SourceSourceOrderItemType = "sku"
SourceSourceOrderItemTypeShipping SourceSourceOrderItemType = "shipping"
SourceSourceOrderItemTypeTax SourceSourceOrderItemType = "tax"
)
// SourceRedirectFlowFailureReason represents the possible failure reasons of a redirect flow.
type SourceRedirectFlowFailureReason string
// List of values that SourceRedirectFlowFailureReason can take.
const (
SourceRedirectFlowFailureReasonDeclined SourceRedirectFlowFailureReason = "declined"
SourceRedirectFlowFailureReasonProcessingError SourceRedirectFlowFailureReason = "processing_error"
SourceRedirectFlowFailureReasonUserAbort SourceRedirectFlowFailureReason = "user_abort"
)
// SourceRedirectFlowStatus represents the possible statuses of a redirect flow.
type SourceRedirectFlowStatus string
// List of values that SourceRedirectFlowStatus can take.
const (
SourceRedirectFlowStatusFailed SourceRedirectFlowStatus = "failed"
SourceRedirectFlowStatusNotRequired SourceRedirectFlowStatus = "not_required"
SourceRedirectFlowStatusPending SourceRedirectFlowStatus = "pending"
SourceRedirectFlowStatusSucceeded SourceRedirectFlowStatus = "succeeded"
)
// SourceRefundAttributesMethod are the possible method to retrieve a receiver's refund attributes.
type SourceRefundAttributesMethod string
// List of values that SourceRefundAttributesMethod can take.
const (
SourceRefundAttributesMethodEmail SourceRefundAttributesMethod = "email"
SourceRefundAttributesMethodManual SourceRefundAttributesMethod = "manual"
)
// SourceRefundAttributesStatus are the possible status of a receiver's refund attributes.
type SourceRefundAttributesStatus string
// List of values that SourceRefundAttributesStatus can take.
const (
SourceRefundAttributesStatusAvailable SourceRefundAttributesStatus = "available"
SourceRefundAttributesStatusMissing SourceRefundAttributesStatus = "missing"
SourceRefundAttributesStatusRequested SourceRefundAttributesStatus = "requested"
)
// SourceStatus represents the possible statuses of a source object.
type SourceStatus string
// List of values that SourceStatus can take.
const (
SourceStatusCanceled SourceStatus = "canceled"
SourceStatusChargeable SourceStatus = "chargeable"
SourceStatusConsumed SourceStatus = "consumed"
SourceStatusFailed SourceStatus = "failed"
SourceStatusPending SourceStatus = "pending"
)
// SourceUsage represents the possible usages of a source object.
type SourceUsage string
// List of values that SourceUsage can take.
const (
SourceUsageReusable SourceUsage = "reusable"
SourceUsageSingleUse SourceUsage = "single_use"
)
// SourceOwnerParams is the set of parameters allowed for the owner hash on
// source creation or update.
type SourceOwnerParams struct {
Address *AddressParams `form:"address"`
Email *string `form:"email"`
Name *string `form:"name"`
Phone *string `form:"phone"`
}
// RedirectParams is the set of parameters allowed for the redirect hash on
// source creation or update.
type RedirectParams struct {
ReturnURL *string `form:"return_url"`
}
// SourceOrderItemsParams is the set of parameters allowed for the items on a
// source order for a source.
type SourceOrderItemsParams struct {
Amount *int64 `form:"amount"`
Currency *string `form:"currency"`
Description *string `form:"description"`
Parent *string `form:"parent"`
Quantity *int64 `form:"quantity"`
Type *string `form:"type"`
}
// SourceOrderParams is the set of parameters allowed for the source order of a
// source.
type SourceOrderParams struct {
Items []*SourceOrderItemsParams `form:"items"`
Shipping *ShippingDetailsParams `form:"shipping"`
}
// SourceObjectParams is the set of parameters allowed on source creation or update.
type SourceObjectParams struct {
Params `form:"*"`
Amount *int64 `form:"amount"`
Currency *string `form:"currency"`
Customer *string `form:"customer"`
Flow *string `form:"flow"`
Mandate *SourceMandateParams `form:"mandate"`
OriginalSource *string `form:"original_source"`
Owner *SourceOwnerParams `form:"owner"`
Receiver *SourceReceiverParams `form:"receiver"`
Redirect *RedirectParams `form:"redirect"`
SourceOrder *SourceOrderParams `form:"source_order"`
StatementDescriptor *string `form:"statement_descriptor"`
Token *string `form:"token"`
Type *string `form:"type"`
TypeData map[string]string `form:"-"`
Usage *string `form:"usage"`
}
// SourceMandateAcceptanceParams describes the set of parameters allowed for the `acceptance`
// hash on source creation or update.
type SourceMandateAcceptanceParams struct {
Date *int64 `form:"date"`
IP *string `form:"ip"`
Offline *SourceMandateAcceptanceOfflineParams `form:"offline"`
Online *SourceMandateAcceptanceOnlineParams `form:"online"`
Status *string `form:"status"`
Type *string `form:"type"`
UserAgent *string `form:"user_agent"`
}
// SourceMandateAcceptanceOnlineParams describes the set of parameters for online accepted mandate
type SourceMandateAcceptanceOnlineParams struct {
Date *int64 `form:"date"`
IP *string `form:"ip"`
UserAgent *string `form:"user_agent"`
}
// SourceMandateAcceptanceOfflineParams describes the set of parameters for offline accepted mandate
type SourceMandateAcceptanceOfflineParams struct {
ContactEmail *string `form:"contact_email"`
}
// SourceMandateParams describes the set of parameters allowed for the `mandate` hash on
// source creation or update.
type SourceMandateParams struct {
Amount *int64 `form:"amount"`
Acceptance *SourceMandateAcceptanceParams `form:"acceptance"`
Currency *string `form:"currency"`
Interval *string `form:"interval"`
NotificationMethod *string `form:"notification_method"`
}
// SourceReceiverParams is the set of parameters allowed for the `receiver` hash on
// source creation or update.
type SourceReceiverParams struct {
RefundAttributesMethod *string `form:"refund_attributes_method"`
}
// SourceObjectDetachParams is the set of parameters that can be used when detaching
// a source from a customer.
type SourceObjectDetachParams struct {
Params `form:"*"`
Customer *string `form:"-"`
}
// SourceOwner describes the owner hash on a source.
type SourceOwner struct {
Address *Address `json:"address,omitempty"`
Email string `json:"email"`
Name string `json:"name"`
Phone string `json:"phone"`
VerifiedAddress *Address `json:"verified_address,omitempty"`
VerifiedEmail string `json:"verified_email"`
VerifiedName string `json:"verified_name"`
VerifiedPhone string `json:"verified_phone"`
}
// RedirectFlow informs of the state of a redirect authentication flow.
type RedirectFlow struct {
FailureReason SourceRedirectFlowFailureReason `json:"failure_reason"`
ReturnURL string `json:"return_url"`
Status SourceRedirectFlowStatus `json:"status"`
URL string `json:"url"`
}
// ReceiverFlow informs of the state of a receiver authentication flow.
type ReceiverFlow struct {
Address string `json:"address"`
AmountCharged int64 `json:"amount_charged"`
AmountReceived int64 `json:"amount_received"`
AmountReturned int64 `json:"amount_returned"`
RefundAttributesMethod SourceRefundAttributesMethod `json:"refund_attributes_method"`
RefundAttributesStatus SourceRefundAttributesStatus `json:"refund_attributes_status"`
}
// CodeVerificationFlow informs of the state of a verification authentication flow.
type CodeVerificationFlow struct {
AttemptsRemaining int64 `json:"attempts_remaining"`
Status SourceCodeVerificationFlowStatus `json:"status"`
}
// SourceMandateAcceptance describes a source mandate acceptance state.
type SourceMandateAcceptance struct {
Date int64 `json:"date"`
IP string `json:"ip"`
Status SourceMandateAcceptanceStatus `json:"status"`
UserAgent string `json:"user_agent"`
}
// SourceMandate describes a source mandate.
type SourceMandate struct {
Acceptance *SourceMandateAcceptance `json:"acceptance"`
NotificationMethod SourceMandateNotificationMethod `json:"notification_method"`
Reference string `json:"reference"`
URL string `json:"url"`
}
// SourceSourceOrderItems describes the items on source orders for sources.
type SourceSourceOrderItems struct {
Amount int64 `json:"amount"`
Currency Currency `json:"currency"`
Description string `json:"description"`
Quantity int64 `json:"quantity"`
Type SourceSourceOrderItemType `json:"type"`
}
// SourceSourceOrder describes a source order for a source.
type SourceSourceOrder struct {
Amount int64 `json:"amount"`
Currency Currency `json:"currency"`
Email string `json:"email"`
Items *[]SourceSourceOrderItems `json:"items"`
Shipping *ShippingDetails `json:"shipping"`
}
// Source is the resource representing a Source.
// For more details see https://stripe.com/docs/api#sources.
type Source struct {
Amount int64 `json:"amount"`
ClientSecret string `json:"client_secret"`
CodeVerification *CodeVerificationFlow `json:"code_verification,omitempty"`
Created int64 `json:"created"`
Currency Currency `json:"currency"`
Customer string `json:"customer"`
Flow SourceFlow `json:"flow"`
ID string `json:"id"`
Livemode bool `json:"livemode"`
Mandate *SourceMandate `json:"mandate"`
Metadata map[string]string `json:"metadata"`
Owner *SourceOwner `json:"owner"`
Receiver *ReceiverFlow `json:"receiver,omitempty"`
Redirect *RedirectFlow `json:"redirect,omitempty"`
StatementDescriptor string `json:"statement_descriptor"`
SourceOrder *SourceSourceOrder `json:"source_order"`
Status SourceStatus `json:"status"`
Type string `json:"type"`
TypeData map[string]interface{}
Usage SourceUsage `json:"usage"`
}
// AppendTo implements custom encoding logic for SourceObjectParams so that the special
// "TypeData" value for is sent as the correct parameter based on the Source type
func (p *SourceObjectParams) AppendTo(body *form.Values, keyParts []string) {
if len(p.TypeData) > 0 && p.Type == nil {
panic("You can not fill TypeData if you don't explicitly set Type")
}
for k, vs := range p.TypeData {
body.Add(form.FormatKey(append(keyParts, StringValue(p.Type), k)), vs)
}
}
// UnmarshalJSON handles deserialization of an Source. This custom unmarshaling
// is needed to extract the type specific data (accessible under `TypeData`)
// but stored in JSON under a hash named after the `type` of the source.
func (s *Source) UnmarshalJSON(data []byte) error {
type source Source
var v source
if err := json.Unmarshal(data, &v); err != nil {
return err
}
*s = Source(v)
var raw map[string]interface{}
if err := json.Unmarshal(data, &raw); err != nil {
return err
}
if d, ok := raw[s.Type]; ok {
if m, ok := d.(map[string]interface{}); ok {
s.TypeData = m
}
}
return nil
}