product

package
v0.8.29 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 26, 2024 License: Apache-2.0 Imports: 12 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
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 Behavior

type Behavior string
const (
	BasicBehavior   Behavior = "basic"
	CreditBehavior  Behavior = "credits"
	PerSeatBehavior Behavior = "per_seat"
)

func (Behavior) String

func (b Behavior) String() string

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 human friendly name 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 Filter

type Filter struct {
	PlanID     string
	ProductID  string
	ProductIDs []string
}

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 (s *Service) AddFeatureToProduct(ctx context.Context, feature Feature, productID string) error

func (*Service) AddPlan

func (s *Service) AddPlan(ctx context.Context, productOb Product, planID string) error

func (*Service) Create

func (s *Service) Create(ctx context.Context, product Product) (Product, error)

func (*Service) CreatePrice

func (s *Service) CreatePrice(ctx context.Context, price Price) (Price, error)

func (*Service) GetByID

func (s *Service) GetByID(ctx context.Context, id string) (Product, error)

func (*Service) GetByProviderID added in v0.8.19

func (s *Service) GetByProviderID(ctx context.Context, id string) (Product, error)

func (*Service) GetFeatureByID

func (s *Service) GetFeatureByID(ctx context.Context, id string) (Feature, error)

func (*Service) GetFeatureByProductID

func (s *Service) GetFeatureByProductID(ctx context.Context, id string) ([]Feature, error)

func (*Service) GetPriceByID

func (s *Service) GetPriceByID(ctx context.Context, id string) (Price, error)

func (*Service) GetPriceByProductID

func (s *Service) GetPriceByProductID(ctx context.Context, id string) ([]Price, error)

func (*Service) List

func (s *Service) List(ctx context.Context, flt Filter) ([]Product, error)

func (*Service) ListFeatures

func (s *Service) ListFeatures(ctx context.Context, flt Filter) ([]Feature, error)

func (*Service) RemoveFeatureFromProduct added in v0.8.15

func (s *Service) RemoveFeatureFromProduct(ctx context.Context, featureID, productID string) error

func (*Service) Update

func (s *Service) Update(ctx context.Context, product Product) (Product, error)

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

func (s *Service) UpdatePrice(ctx context.Context, price Price) (Price, error)

UpdatePrice updates a price, but it doesn't update all fields ideally we should keep it immutable and create a new price

func (*Service) UpsertFeature

func (s *Service) UpsertFeature(ctx context.Context, feature Feature) (Feature, error)

type Tier

type Tier struct {
	FlatAmount int64
	UpTo       int64
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL