Documentation ¶
Index ¶
- Variables
- type Behavior
- type BehaviorConfig
- type BillingScheme
- type Feature
- type FeatureRepository
- type Filter
- type Price
- type PriceRepository
- type PriceTierMode
- type PriceUsageType
- type Product
- type Repository
- type Service
- func (s *Service) AddFeatureToProduct(ctx context.Context, feature Feature, productID string) error
- func (s *Service) AddPlan(ctx context.Context, productOb Product, planID string) error
- func (s *Service) Create(ctx context.Context, product Product) (Product, error)
- func (s *Service) CreatePrice(ctx context.Context, price Price) (Price, error)
- func (s *Service) GetByID(ctx context.Context, id string) (Product, error)
- func (s *Service) GetByProviderID(ctx context.Context, id string) (Product, error)
- func (s *Service) GetFeatureByID(ctx context.Context, id string) (Feature, error)
- func (s *Service) GetFeatureByProductID(ctx context.Context, id string) ([]Feature, error)
- func (s *Service) GetPriceByID(ctx context.Context, id string) (Price, error)
- func (s *Service) GetPriceByProductID(ctx context.Context, id string) ([]Price, error)
- func (s *Service) List(ctx context.Context, flt Filter) ([]Product, error)
- func (s *Service) ListFeatures(ctx context.Context, flt Filter) ([]Feature, error)
- func (s *Service) RemoveFeatureFromProduct(ctx context.Context, featureID, productID string) error
- func (s *Service) Update(ctx context.Context, product Product) (Product, error)
- func (s *Service) UpdatePrice(ctx context.Context, price Price) (Price, error)
- func (s *Service) UpsertFeature(ctx context.Context, feature Feature) (Feature, error)
- type Tier
Constants ¶
This section is empty.
Variables ¶
var ( ErrProductNotFound = errors.New("product not found") ErrPriceNotFound = errors.New("price not found") ErrInvalidDetail = errors.New("invalid product detail") ErrPerSeatLimitReached = errors.New("per seat limit reached") ErrInvalidFeatureDetail = errors.New("invalid feature detail") ErrFeatureNotFound = errors.New("feature not found") )
Functions ¶
This section is empty.
Types ¶
type BehaviorConfig ¶ added in v0.8.18
type BehaviorConfig struct { // CreditAmount is amount of credits that are awarded/consumed when buying/using this feature CreditAmount int64 `json:"credit_amount" yaml:"credit_amount"` // SeatLimit is the maximum number of seats that can be added to the subscription SeatLimit int64 `json:"seat_limit" yaml:"seat_limit"` }
type BillingScheme ¶
type BillingScheme string
const ( BillingSchemeFlat BillingScheme = "flat" BillingSchemeTiered BillingScheme = "tiered" )
func BuildBillingScheme ¶
func BuildBillingScheme(s string) BillingScheme
func (BillingScheme) ToStripe ¶
func (b BillingScheme) ToStripe() string
type Feature ¶
type Feature struct { ID string `json:"id" yaml:"id"` Name string `json:"name" yaml:"name"` // a machine friendly name for the feature Title string `json:"title" yaml:"title"` // a human friendly title for the feature // products this feature belongs to, this is optional and can be empty // a product will have at least one feature with the same name as the product ProductIDs []string `json:"product_ids" yaml:"product_ids"` Metadata metadata.Metadata `json:"metadata" yaml:"metadata"` CreatedAt time.Time UpdatedAt time.Time DeletedAt *time.Time }
Feature are part of a product which allows for a more granular control on what is packed with the product. It is a platform specific concept and doesn't have a corresponding billing engine entity
type FeatureRepository ¶
type FeatureRepository interface { GetByID(ctx context.Context, id string) (Feature, error) GetByName(ctx context.Context, name string) (Feature, error) Create(ctx context.Context, feature Feature) (Feature, error) UpdateByName(ctx context.Context, feature Feature) (Feature, error) List(ctx context.Context, flt Filter) ([]Feature, error) }
type Price ¶
type Price struct { ID string `json:"id" yaml:"id"` ProductID string `json:"feature_id" yaml:"feature_id"` ProviderID string `json:"provider_id" yaml:"provider_id"` Name string `json:"name" yaml:"name"` // a machine friendly name for the price // BillingScheme specifies the billing scheme for the price // known schemes are "tiered" and "flat". Default is "flat" BillingScheme BillingScheme `json:"billing_scheme" yaml:"billing_scheme" default:"flat"` // Currency Three-letter ISO 4217 currency code in lower case // like "usd", "eur", "gbp" // https://www.six-group.com/en/products-services/financial-information/data-standards.html Currency string `json:"currency" yaml:"currency" default:"usd"` // Amount price in the minor currency unit // Minor unit is the smallest unit of a currency, e.g. 1 dollar equals 100 cents (with 2 decimals). Amount int64 `json:"amount" yaml:"amount"` // UsageType specifies the usage type for the price // known types are "licensed" and "metered". Default is "licensed" UsageType PriceUsageType `json:"usage_type" yaml:"usage_type" default:"licensed"` // MeteredAggregate specifies the aggregation method for the price // known aggregations are "sum", "last_during_period", "last_ever" and "max". Default is "sum" MeteredAggregate string `json:"metered_aggregate" yaml:"metered_aggregate" default:"sum"` // Interval is the interval at which the plan is billed // e.g. day, week, month, year Interval string `json:"interval" yaml:"interval"` Metadata metadata.Metadata `json:"metadata" yaml:"metadata"` // TierMode specifies the tier mode for the price // known modes are "graduated" and "volume". Default is "graduated" // In volume-based, the maximum quantity within a period determines the per-unit price // In graduated, pricing changes as the quantity increases to specific thresholds TierMode string `json:"tier_mode" yaml:"tier_mode" default:"graduated"` // Tiers specifies the optional tiers for the price // only applicable when BillingScheme is "tiered" Tiers []Tier `json:"tiers" yaml:"tiers"` State string `json:"state" yaml:"state"` CreatedAt time.Time UpdatedAt time.Time DeletedAt *time.Time }
Price is a product price and has a corresponding price in the billing engine when creating a price, the feature must already exist when subscribing to a plan, the price must already exist
type PriceRepository ¶
type PriceRepository interface { GetByID(ctx context.Context, id string) (Price, error) GetByName(ctx context.Context, name string) (Price, error) Create(ctx context.Context, price Price) (Price, error) UpdateByID(ctx context.Context, price Price) (Price, error) List(ctx context.Context, flt Filter) ([]Price, error) }
type PriceTierMode ¶
type PriceTierMode string
const ( PriceTierModeGraduated PriceTierMode = "graduated" PriceTierModeVolume PriceTierMode = "volume" )
type PriceUsageType ¶
type PriceUsageType string
const ( PriceUsageTypeLicensed PriceUsageType = "licensed" PriceUsageTypeMetered PriceUsageType = "metered" )
func BuildPriceUsageType ¶
func BuildPriceUsageType(s string) PriceUsageType
func (PriceUsageType) ToStripe ¶
func (p PriceUsageType) ToStripe() string
type Product ¶
type Product struct { ID string `json:"id" yaml:"id"` ProviderID string `json:"provider_id" yaml:"provider_id"` // in case of stripe, provider id and id are same PlanIDs []string // plans this feature belongs to, this is optional and can be empty Name string `json:"name" yaml:"name"` // a machine friendly name for the feature Title string `json:"title" yaml:"title"` // a human friendly title for the feature Description string `json:"description" yaml:"description"` // Type is the type of the feature // known types are "credits" and "per_seat". Default is "basic" Behavior Behavior `json:"behavior" yaml:"behavior" default:"basic"` // Config is the configuration for the behavior Config BehaviorConfig `json:"config" yaml:"config"` // Prices for the product, return only, shouldn't be set while updating a product Prices []Price `json:"prices" yaml:"prices"` // Features for the product, return only, shouldn't be set while updating a product Features []Feature `json:"features" yaml:"features"` State string `json:"state" yaml:"state"` Metadata metadata.Metadata `json:"metadata" yaml:"metadata"` CreatedAt time.Time UpdatedAt time.Time DeletedAt *time.Time }
Product is an item being sold by the platform and has a corresponding reference in the billing engine
type Repository ¶
type Repository interface { GetByID(ctx context.Context, id string) (Product, error) GetByName(ctx context.Context, name string) (Product, error) Create(ctx context.Context, product Product) (Product, error) UpdateByName(ctx context.Context, product Product) (Product, error) List(ctx context.Context, flt Filter) ([]Product, error) }
type Service ¶
type Service struct {
// contains filtered or unexported fields
}
func NewService ¶
func NewService(stripeClient *client.API, productRepository Repository, priceRepository PriceRepository, featureRepository FeatureRepository) *Service
func (*Service) AddFeatureToProduct ¶ added in v0.8.15
func (*Service) CreatePrice ¶
func (*Service) GetByProviderID ¶ added in v0.8.19
func (*Service) GetFeatureByID ¶
func (*Service) GetFeatureByProductID ¶
func (*Service) GetPriceByID ¶
func (*Service) GetPriceByProductID ¶
func (*Service) ListFeatures ¶
func (*Service) RemoveFeatureFromProduct ¶ added in v0.8.15
func (*Service) Update ¶
Update updates a product, but it doesn't update all fields ideally we should keep it immutable and create a new product
func (*Service) UpdatePrice ¶
UpdatePrice updates a price, but it doesn't update all fields ideally we should keep it immutable and create a new price