File size: 2,356 Bytes
16cdcb7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package subscriptionworkflow

import (
	"context"
	"errors"
	"time"

	"github.com/openmeterio/openmeter/openmeter/subscription"
	subscriptionaddon "github.com/openmeterio/openmeter/openmeter/subscription/addon"
	"github.com/openmeterio/openmeter/pkg/models"
)

type Service interface {
	CreateFromPlan(ctx context.Context, inp CreateSubscriptionWorkflowInput, plan subscription.Plan) (subscription.SubscriptionView, error)
	EditRunning(ctx context.Context, subscriptionID models.NamespacedID, customizations []subscription.Patch, timing subscription.Timing) (subscription.SubscriptionView, error)
	ChangeToPlan(ctx context.Context, subscriptionID models.NamespacedID, inp ChangeSubscriptionWorkflowInput, plan subscription.Plan) (current subscription.Subscription, new subscription.SubscriptionView, err error)
	Restore(ctx context.Context, subscriptionID models.NamespacedID) (subscription.Subscription, error)

	AddAddon(ctx context.Context, subscriptionID models.NamespacedID, addonInp AddAddonWorkflowInput) (subscription.SubscriptionView, subscriptionaddon.SubscriptionAddon, error)
	ChangeAddonQuantity(ctx context.Context, subscriptionID models.NamespacedID, changeInp ChangeAddonQuantityWorkflowInput) (subscription.SubscriptionView, subscriptionaddon.SubscriptionAddon, error)
}

type CreateSubscriptionWorkflowInput struct {
	ChangeSubscriptionWorkflowInput
	Namespace  string
	CustomerID string

	BillingAnchor *time.Time `json:"billingAnchor,omitempty"`
	Annotations   models.Annotations
}

type ChangeSubscriptionWorkflowInput struct {
	subscription.Timing
	models.MetadataModel
	Name        string
	Description *string

	BillingAnchor *time.Time `json:"billingAnchor,omitempty"`
}

type AddAddonWorkflowInput struct {
	models.MetadataModel

	AddonID string `json:"addonID"`

	InitialQuantity int `json:"initialQuantity"`

	Timing subscription.Timing `json:"timing"`
}

func (i AddAddonWorkflowInput) Validate() error {
	if i.AddonID == "" {
		return errors.New("addonID is required")
	}

	if i.InitialQuantity <= 0 {
		return errors.New("initialQuantity must be greater than 0")
	}

	return nil
}

type ChangeAddonQuantityWorkflowInput struct {
	SubscriptionAddonID models.NamespacedID

	Quantity int `json:"quantity"`

	Timing subscription.Timing `json:"timing"`
}

func (i ChangeAddonQuantityWorkflowInput) Validate() error {
	return nil
}