Documentation
¶
Overview ¶
Package payout is earned credit landing in an org's wallet: referral, affiliate and author earnings.
It is the ONE attributed-credit money seam those credit programs share: read an org's metered spend (the qualify / accrual base) and grant a promo credit to its wallet (a payout made in credits, landing in commerce's Credit/trial bucket). It was three byte-identical commerce.go copies (their own doc-comments said so); extracted here so the S2S commerce binding — the HTTP deposit + usage/rollup path — lives exactly ONCE.
Every payout lands via the SAME COMMERCE_SERVICE_TOKEN S2S path, the same X-Org-Id=<org> namespace + bare-org `user` subject that admin.grantCredit uses, so it is indistinguishable from an admin grant except by its ledger tag (grant:referral / grant:affiliate / grant:author, all → the commerce Credit/trial bucket per DepositKind's grant:* rule). The tag is supplied BY THE CALLER, so payout carries zero program domain logic — it is the money seam, nothing else.
Commerce is an INTERFACE so each program's store/handler logic stays testable with a fake ledger; Client is the ONE production binding. A program keeps its own narrow (unexported-method) seam and a thin adapter delegating to Client — Go package-scoped interface methods can't cross packages, and the adapter is where a program still names its own grant tag.
Index ¶
Constants ¶
This section is empty.
Variables ¶
var ErrUnconfigured = errors.New("payout: commerce endpoint not configured")
ErrUnconfigured is returned by a Deposit against an unwired commerce so the caller records an honest failure rather than reporting a phantom grant.
Functions ¶
This section is empty.
Types ¶
type Client ¶
type Client struct {
// contains filtered or unexported fields
}
Client is the production commerce binding (COMMERCE_SERVICE_TOKEN S2S).
func NewClient ¶
NewClient builds the production binding. base is the commerce HTTP URL (via transport.BaseURL at the call site); token is COMMERCE_SERVICE_TOKEN.
func (*Client) Configured ¶
func (*Client) Deposit ¶
func (c *Client) Deposit(ctx context.Context, org, user string, amountCents int64, currency, notes, tags string) (string, error)
Deposit posts POST /v1/billing/deposit — the ONE money-in primitive (identical to admin.grantCredit's deposit). Commerce's EdgeAuth pins the body `user` to the X-Org-Id subject, so a payout can never be mis-targeted to another wallet.
func (*Client) SpendCents ¶
SpendCents reads GET /v1/billing/usage/rollup and returns consumedCents. Zero (not an error) when commerce is unconfigured so a partial deploy degrades to "no spend to accrue yet" rather than a 5xx.
type Commerce ¶
type Commerce interface {
Configured() bool
// Deposit grants amountCents to org's wallet (Credit/trial bucket via the
// caller-supplied grant:* tag) and returns the ledger transaction id.
Deposit(ctx context.Context, org, user string, amountCents int64, currency, notes, tags string) (txnID string, err error)
// SpendCents is the org's month-to-date metered consumption — the qualify
// signal / commission accrual base (spend × the program's rate).
SpendCents(ctx context.Context, org, user string) (int64, error)
}
Commerce is the narrow money seam an attributed-credit program needs: read a referred/deploying org's metered spend and grant a credit to a wallet. The HTTP impl (Client) below is the ONE production binding.