subscription

package
v0.1.5 Latest Latest
Warning

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

Go to latest
Published: Jul 9, 2026 License: Apache-2.0 Imports: 5 Imported by: 0

Documentation

Overview

Package subscription manages tenant plan subscriptions, renewals, expiration, grace periods, and billing hooks.

Index

Constants

This section is empty.

Variables

View Source
var (
	// ErrSubscriptionNotFound reports that a subscription does not exist.
	ErrSubscriptionNotFound = errors.New("gotenancy/subscription: subscription not found")

	// ErrSubscriptionAlreadyExists reports that a tenant already has a subscription.
	ErrSubscriptionAlreadyExists = errors.New("gotenancy/subscription: subscription already exists")

	// ErrInvalidSubscription reports invalid subscription metadata.
	ErrInvalidSubscription = errors.New("gotenancy/subscription: invalid subscription")

	// ErrInvalidTransition reports an invalid subscription lifecycle transition.
	ErrInvalidTransition = errors.New("gotenancy/subscription: invalid transition")
)

Functions

This section is empty.

Types

type BillingEvent

type BillingEvent struct {
	TenantID         types.TenantID
	Action           string
	FromPlan         string
	ToPlan           string
	Status           Status
	CurrentPeriodEnd *time.Time
}

BillingEvent describes a subscription change for external billing systems.

type BillingHook

type BillingHook func(context.Context, BillingEvent) error

BillingHook receives subscription lifecycle changes.

type LifecycleService added in v0.1.5

type LifecycleService interface {
	Service
	SubscribeWithPeriod(ctx context.Context, tenantID types.TenantID, planID string, currentPeriodEnd time.Time) (Subscription, error)
	Renew(ctx context.Context, tenantID types.TenantID, currentPeriodEnd time.Time) (Subscription, error)
	Expire(ctx context.Context, tenantID types.TenantID) (Subscription, error)
	ExpireDue(ctx context.Context) ([]Subscription, error)
}

LifecycleService extends Service with billing-period renewal and expiration operations.

type MemoryService

type MemoryService struct {
	// contains filtered or unexported fields
}

MemoryService is a thread-safe in-memory subscription service.

func NewMemoryService

func NewMemoryService(opts ...Option) *MemoryService

NewMemoryService creates an empty subscription service.

func (*MemoryService) Downgrade

func (service *MemoryService) Downgrade(ctx context.Context, tenantID types.TenantID, planID string) (Subscription, error)

Downgrade changes an active subscription to a lower plan.

func (*MemoryService) Expire added in v0.1.5

func (service *MemoryService) Expire(ctx context.Context, tenantID types.TenantID) (Subscription, error)

Expire marks an active subscription expired immediately.

func (*MemoryService) ExpireDue added in v0.1.5

func (service *MemoryService) ExpireDue(ctx context.Context) ([]Subscription, error)

ExpireDue marks active subscriptions expired after their current period and grace window end.

func (*MemoryService) Get

func (service *MemoryService) Get(ctx context.Context, tenantID types.TenantID) (Subscription, error)

Get returns a subscription by tenant ID.

func (*MemoryService) Renew added in v0.1.5

func (service *MemoryService) Renew(ctx context.Context, tenantID types.TenantID, currentPeriodEnd time.Time) (Subscription, error)

Renew reactivates an active or expired subscription with a new current period end.

func (*MemoryService) Subscribe

func (service *MemoryService) Subscribe(ctx context.Context, tenantID types.TenantID, planID string) (Subscription, error)

Subscribe creates an active subscription for a tenant.

func (*MemoryService) SubscribeWithPeriod added in v0.1.5

func (service *MemoryService) SubscribeWithPeriod(ctx context.Context, tenantID types.TenantID, planID string, currentPeriodEnd time.Time) (Subscription, error)

SubscribeWithPeriod creates an active subscription with a current billing period end.

func (*MemoryService) Unsubscribe

func (service *MemoryService) Unsubscribe(ctx context.Context, tenantID types.TenantID) (Subscription, error)

Unsubscribe cancels an active subscription.

func (*MemoryService) Upgrade

func (service *MemoryService) Upgrade(ctx context.Context, tenantID types.TenantID, planID string) (Subscription, error)

Upgrade changes an active subscription to a higher plan.

type Option

type Option func(*MemoryService)

Option configures MemoryService.

func WithBillingHook

func WithBillingHook(hook BillingHook) Option

WithBillingHook sets the billing hook.

func WithClock

func WithClock(clock func() time.Time) Option

WithClock sets the clock used for subscription dates.

func WithGracePeriod added in v0.1.5

func WithGracePeriod(period time.Duration) Option

WithGracePeriod sets the post-period grace window before ExpireDue marks a subscription expired.

type Service

type Service interface {
	Subscribe(ctx context.Context, tenantID types.TenantID, planID string) (Subscription, error)
	Unsubscribe(ctx context.Context, tenantID types.TenantID) (Subscription, error)
	Upgrade(ctx context.Context, tenantID types.TenantID, planID string) (Subscription, error)
	Downgrade(ctx context.Context, tenantID types.TenantID, planID string) (Subscription, error)
	Get(ctx context.Context, tenantID types.TenantID) (Subscription, error)
}

Service manages tenant subscriptions.

type Status

type Status string

Status describes subscription lifecycle state.

const (
	StatusActive    Status = "active"
	StatusExpired   Status = "expired"
	StatusCancelled Status = "cancelled"
)

type Subscription

type Subscription struct {
	TenantID         types.TenantID
	PlanID           string
	Status           Status
	StartDate        time.Time
	EndDate          *time.Time
	CurrentPeriodEnd *time.Time
	GracePeriodEnd   *time.Time
}

Subscription binds a tenant to a plan.

Jump to

Keyboard shortcuts

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