notification

package
v1.0.0-beta.224 Latest Latest
Warning

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

Go to latest
Published: Sep 29, 2025 License: Apache-2.0 Imports: 14 Imported by: 0

Documentation

Index

Constants

View Source
const (
	// AnnotationRuleTestEvent indicates that the event is generated as part of testing a notification rule
	AnnotationRuleTestEvent = "notification.rule.test"

	AnnotationEventFeatureKey = "event.feature.key"
	AnnotationEventFeatureID  = "event.feature.id"
	AnnotationEventSubjectKey = "event.subject.key"
	AnnotationEventSubjectID  = "event.subject.id"

	AnnotationEventCustomerID  = "event.customer.id"
	AnnotationEventCustomerKey = "event.customer.key"

	// TODO[later]: deprecate this annotation and use a generic one
	AnnotationBalanceEventDedupeHash = "event.balance.dedupe.hash"

	AnnotationEventInvoiceID     = "event.invoice.id"
	AnnotationEventInvoiceNumber = "event.invoice.number"
)
View Source
const (
	DefaultDisabled   = false
	DefaultPageNumber = 1
	DefaultPageSize   = 100
)
View Source
const (
	DefaultReconcileInterval = 15 * time.Second
	DefaultDispatchTimeout   = 30 * time.Second
)
View Source
const MaxChannelsPerRule = 5

Variables

This section is empty.

Functions

func ChannelIDsByType

func ChannelIDsByType(channels []Channel, channelType ChannelType) []string

ChannelIDsByType returns a list of Channel identifiers from Channel slice with the provided ChannelType

func InterfaceMapToStringMap

func InterfaceMapToStringMap(m map[string]interface{}) map[string]string

func PayloadToMapInterface

func PayloadToMapInterface(t any) (map[string]interface{}, error)

func StrictInterfaceMapToStringMap

func StrictInterfaceMapToStringMap(m map[string]interface{}) (map[string]string, error)

Types

type BalanceThresholdPayload

type BalanceThresholdPayload struct {
	EntitlementValuePayloadBase

	Threshold api.NotificationRuleBalanceThresholdValue `json:"threshold"`
}

func (BalanceThresholdPayload) Validate

func (b BalanceThresholdPayload) Validate() error

Validate returns an error if the balance threshold payload is invalid.

type BalanceThresholdRuleConfig

type BalanceThresholdRuleConfig struct {
	// Features store the list of features the rule is associated with.
	Features []string `json:"features"`
	// Thresholds store the list of thresholds used to trigger a new notification event if the balance exceeds one of the thresholds.
	Thresholds []BalanceThreshold `json:"thresholds"`
}

BalanceThresholdRuleConfig defines the configuration specific to rule.

func (BalanceThresholdRuleConfig) Validate

func (b BalanceThresholdRuleConfig) Validate(ctx context.Context, service Service, namespace string) error

Validate returns an error if the balance threshold configuration is invalid.

type Channel

type Channel struct {
	models.NamespacedModel
	models.ManagedModel

	// ID is the unique identifier for Channel.
	ID string `json:"id"`
	// Type of the notification channel (e.g. webhook)
	Type ChannelType `json:"type"`
	// Name of is the user provided name of the Channel.
	Name string `json:"name"`
	// Disabled defines whether the Channel is disabled or not.
	Disabled bool `json:"disabled"`
	// Config stores the actual Channel configuration specific to the Type.
	Config ChannelConfig `json:"config"`
}

Channel represents a notification channel with specific type and configuration.

type ChannelConfig

type ChannelConfig struct {
	ChannelConfigMeta

	// WebHook
	WebHook WebHookChannelConfig `json:"webhook"`
}

ChannelConfig is a union type capturing configuration parameters for all type of channels.

func (ChannelConfig) Validate

func (c ChannelConfig) Validate() error

Validate invokes channel type specific validator and returns an error if channel configuration is invalid.

type ChannelConfigMeta

type ChannelConfigMeta struct {
	Type ChannelType `json:"type"`
}

func (ChannelConfigMeta) Validate

func (m ChannelConfigMeta) Validate() error

type ChannelIDsDifference

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

func NewChannelIDsDifference

func NewChannelIDsDifference(new, old []string) *ChannelIDsDifference

func (ChannelIDsDifference) Additions

func (d ChannelIDsDifference) Additions() []string

func (ChannelIDsDifference) All

func (d ChannelIDsDifference) All() []string

func (ChannelIDsDifference) Has

func (d ChannelIDsDifference) Has(id string) bool

func (ChannelIDsDifference) HasChanged

func (d ChannelIDsDifference) HasChanged() bool

func (ChannelIDsDifference) InAdditions

func (d ChannelIDsDifference) InAdditions(id string) bool

func (ChannelIDsDifference) InRemovals

func (d ChannelIDsDifference) InRemovals(id string) bool

func (ChannelIDsDifference) Removals

func (d ChannelIDsDifference) Removals() []string

type ChannelRepository

type ChannelRepository interface {
	ListChannels(ctx context.Context, params ListChannelsInput) (pagination.Result[Channel], error)
	CreateChannel(ctx context.Context, params CreateChannelInput) (*Channel, error)
	DeleteChannel(ctx context.Context, params DeleteChannelInput) error
	GetChannel(ctx context.Context, params GetChannelInput) (*Channel, error)
	UpdateChannel(ctx context.Context, params UpdateChannelInput) (*Channel, error)
}

type ChannelService

type ChannelService interface {
	ListChannels(ctx context.Context, params ListChannelsInput) (ListChannelsResult, error)
	CreateChannel(ctx context.Context, params CreateChannelInput) (*Channel, error)
	DeleteChannel(ctx context.Context, params DeleteChannelInput) error
	GetChannel(ctx context.Context, params GetChannelInput) (*Channel, error)
	UpdateChannel(ctx context.Context, params UpdateChannelInput) (*Channel, error)
}

type ChannelType

type ChannelType string
const (
	ChannelTypeWebhook ChannelType = "WEBHOOK"
)

func ChannelTypes

func ChannelTypes(channels []Channel) []ChannelType

ChannelTypes returns a set of ChannelType from Channel slice

func (ChannelType) Validate

func (t ChannelType) Validate() error

func (ChannelType) Values

func (t ChannelType) Values() []string

type CreateChannelInput

type CreateChannelInput struct {
	models.NamespacedModel

	// Type defines the Channel type (e.g. webhook)
	Type ChannelType
	// Name stores the user defined name of the Channel.
	Name string
	// Disabled defines whether the Channel is disabled or not. Deleted Channels are always disabled.
	Disabled bool
	// Config stores the Channel Type specific configuration.
	Config ChannelConfig
}

func (CreateChannelInput) Validate

func (i CreateChannelInput) Validate(_ context.Context, _ Service) error

type CreateEventInput

type CreateEventInput struct {
	models.NamespacedModel
	Annotations models.Annotations `json:"annotations,omitempty"`

	// Type of the notification Event (e.g. entitlements.balance.threshold)
	Type EventType `json:"type"`
	// Payload is the actual payload sent to Channel as part of the notification Event.
	Payload EventPayload `json:"payload"`
	// RuleID defines the notification Rule that generated this Event.
	RuleID string `json:"ruleId"`
	// HandlerDeduplicationHash is a hash that the handler can use to deduplicate events if needed
	HandlerDeduplicationHash string `json:"handlerDeduplicationHash"`
}

func (CreateEventInput) Validate

func (i CreateEventInput) Validate(ctx context.Context, service Service) error

type CreateRuleInput

type CreateRuleInput struct {
	models.NamespacedModel

	// Type defines the Rule type (e.g. entitlements.balance.threshold)
	Type EventType
	// Name stores the user defined name of the Rule.
	Name string
	// Disabled defines whether the Rule is disabled or not. Deleted Rules are always disabled.
	Disabled bool
	// Config stores the Rule Type specific configuration.
	Config RuleConfig
	// Channels defines the list of Channels the Rule needs to send Events.
	Channels []string
}

func (CreateRuleInput) Validate

func (i CreateRuleInput) Validate(ctx context.Context, service Service) error

type DeleteChannelInput

type DeleteChannelInput models.NamespacedID

func (DeleteChannelInput) Validate

func (i DeleteChannelInput) Validate(_ context.Context, _ Service) error

type DeleteRuleInput

type DeleteRuleInput models.NamespacedID

func (DeleteRuleInput) Validate

func (i DeleteRuleInput) Validate(_ context.Context, _ Service) error

type EntitlementResetPayload

type EntitlementResetPayload EntitlementValuePayloadBase

func (EntitlementResetPayload) Validate

func (e EntitlementResetPayload) Validate() error

type EntitlementResetRuleConfig

type EntitlementResetRuleConfig struct {
	Features []string `json:"features"`
}

func (EntitlementResetRuleConfig) Validate

func (e EntitlementResetRuleConfig) Validate(ctx context.Context, service Service, namespace string) error

type EntitlementValuePayloadBase

type EntitlementValuePayloadBase struct {
	Entitlement api.EntitlementMetered `json:"entitlement"`
	Feature     api.Feature            `json:"feature"`
	Subject     api.Subject            `json:"subject"`
	Value       api.EntitlementValue   `json:"value"`
	Customer    api.Customer           `json:"customer"`
}

type Event

type Event struct {
	models.NamespacedModel
	models.Annotations

	// ID is the unique identifier for Event.
	ID string `json:"id"`
	// Type of the notification Event (e.g. entitlements.balance.threshold)
	// TODO(chrisgacsal): this is redundant as it is always the same as the payload type. Deprecate this field.
	Type EventType `json:"type"`
	// CreatedAt Timestamp when the notification event was created.
	CreatedAt time.Time `json:"createdAt"`
	// DeliveryStatus defines the delivery status of the notification Event per Channel.
	DeliveryStatus []EventDeliveryStatus `json:"deliveryStatus"`
	// Payload is the actual payload sent to Channel as part of the notification Event.
	Payload EventPayload `json:"payload"`
	// Rule defines the notification Rule that generated this Event.
	Rule Rule `json:"rule"`
	// DeduplicationHash is a hash that the handler can use to deduplicate events if needed
	HandlerDeduplicationHash string `json:"-"`
}

type EventDeliveryStatus

type EventDeliveryStatus struct {
	models.NamespacedModel

	// ID is the unique identifier for Event.
	ID string `json:"id"`
	// EventID defines the Event identifier the EventDeliveryStatus belongs to.
	EventID string `json:"eventId"`

	ChannelID string                   `json:"channelId"`
	State     EventDeliveryStatusState `json:"state"`
	Reason    string                   `json:"reason,omitempty"`
	CreatedAt time.Time                `json:"createdAt"`
	UpdatedAt time.Time                `json:"updatedAt,omitempty"`
}

type EventDeliveryStatusState

type EventDeliveryStatusState string
const (
	EventDeliveryStatusStateSuccess EventDeliveryStatusState = "SUCCESS"
	EventDeliveryStatusStateFailed  EventDeliveryStatusState = "FAILED"
	EventDeliveryStatusStateSending EventDeliveryStatusState = "SENDING"
	EventDeliveryStatusStatePending EventDeliveryStatusState = "PENDING"
)

func DeliveryStatusStates

func DeliveryStatusStates(statuses []EventDeliveryStatus) []EventDeliveryStatusState

DeliveryStatusStates returns a list of EventDeliveryStatusState from EventDeliveryStatus slice

func (EventDeliveryStatusState) Validate

func (e EventDeliveryStatusState) Validate() error

func (EventDeliveryStatusState) Values

func (e EventDeliveryStatusState) Values() []string

type EventDispatcher

type EventDispatcher interface {
	Dispatch(*Event) error
}

type EventHandler

type EventHandler interface {
	EventDispatcher
	EventReconciler

	Start() error
	Close() error
}

type EventPayload

type EventPayload struct {
	EventPayloadMeta

	// Entitlements
	BalanceThreshold *BalanceThresholdPayload `json:"balanceThreshold,omitempty"`
	EntitlementReset *EntitlementResetPayload `json:"entitlementReset,omitempty"`

	// Invoice
	Invoice *billing.EventInvoice `json:"invoice,omitempty"`
}

EventPayload is a union type capturing payload for all EventType of Events.

func (EventPayload) Validate

func (p EventPayload) Validate() error

type EventPayloadMeta

type EventPayloadMeta struct {
	Type EventType `json:"type"`
}

func (EventPayloadMeta) Validate

func (m EventPayloadMeta) Validate() error

type EventReconciler

type EventReconciler interface {
	Reconcile(ctx context.Context) error
}

type EventRepository

type EventRepository interface {
	ListEvents(ctx context.Context, params ListEventsInput) (pagination.Result[Event], error)
	GetEvent(ctx context.Context, params GetEventInput) (*Event, error)
	CreateEvent(ctx context.Context, params CreateEventInput) (*Event, error)
	ListEventsDeliveryStatus(ctx context.Context, params ListEventsDeliveryStatusInput) (pagination.Result[EventDeliveryStatus], error)
	GetEventDeliveryStatus(ctx context.Context, params GetEventDeliveryStatusInput) (*EventDeliveryStatus, error)
	UpdateEventDeliveryStatus(ctx context.Context, params UpdateEventDeliveryStatusInput) (*EventDeliveryStatus, error)
}

type EventService

type EventService interface {
	ListEvents(ctx context.Context, params ListEventsInput) (ListEventsResult, error)
	GetEvent(ctx context.Context, params GetEventInput) (*Event, error)
	CreateEvent(ctx context.Context, params CreateEventInput) (*Event, error)
	ListEventsDeliveryStatus(ctx context.Context, params ListEventsDeliveryStatusInput) (ListEventsDeliveryStatusResult, error)
	GetEventDeliveryStatus(ctx context.Context, params GetEventDeliveryStatusInput) (*EventDeliveryStatus, error)
	UpdateEventDeliveryStatus(ctx context.Context, params UpdateEventDeliveryStatusInput) (*EventDeliveryStatus, error)
}

type EventType

type EventType string
const (
	EventTypeBalanceThreshold EventType = "entitlements.balance.threshold"
	EventTypeEntitlementReset EventType = "entitlements.reset"
)
const (
	EventTypeInvoiceCreated EventType = "invoice.created"
	EventTypeInvoiceUpdated EventType = "invoice.updated"
)

func EventTypes

func EventTypes() []EventType

func (EventType) Validate

func (t EventType) Validate() error

func (EventType) Values

func (t EventType) Values() []string

type FeatureMeta

type FeatureMeta = api.FeatureMeta

type FeatureService

type FeatureService interface {
	ListFeature(ctx context.Context, namespace string, features ...string) ([]feature.Feature, error)
}

type GetChannelInput

type GetChannelInput models.NamespacedID

func (GetChannelInput) Validate

func (i GetChannelInput) Validate(_ context.Context, _ Service) error

type GetEventDeliveryStatusInput

type GetEventDeliveryStatusInput struct {
	models.NamespacedModel

	// ID the unique identifier of the EventDeliveryStatus.
	ID string
	// EventID defines the Event identifier the EventDeliveryStatus belongs to. Must be provided if ID is empty.
	EventID string
	// ChannelID defines the Channel identifier the EventDeliveryStatus belongs to. Must be provided if ID is empty.
	ChannelID string
}

func (GetEventDeliveryStatusInput) Validate

type GetEventInput

type GetEventInput struct {
	models.NamespacedID
}

func (GetEventInput) Validate

func (i GetEventInput) Validate(_ context.Context, _ Service) error

type GetRuleInput

type GetRuleInput models.NamespacedID

func (GetRuleInput) Validate

func (i GetRuleInput) Validate(_ context.Context, _ Service) error

type InvoicePayload

type InvoicePayload = billing.EventInvoice

type InvoiceRuleConfig

type InvoiceRuleConfig struct{}

func (InvoiceRuleConfig) Validate

func (c InvoiceRuleConfig) Validate(ctx context.Context, service Service, namespace string) error

type ListChannelsInput

type ListChannelsInput struct {
	pagination.Page

	Namespaces      []string
	Channels        []string
	IncludeDisabled bool

	OrderBy OrderBy
	Order   sortx.Order
}

func (ListChannelsInput) Validate

func (i ListChannelsInput) Validate(_ context.Context, _ Service) error

type ListChannelsResult

type ListChannelsResult = pagination.Result[Channel]

type ListEventsDeliveryStatusInput

type ListEventsDeliveryStatusInput struct {
	pagination.Page

	// Namespaces is a list of namespaces to be used to filter the list of EventDeliveryStatus to be returned.
	Namespaces []string

	// From limits the scope fo the request by defining the earliest date to be used for lookup.
	// This filter is applied to EventDeliveryStatus.UpdatedAt field.
	From time.Time
	// To limits the scope fo the request by defining the latest date to be used for lookup.
	// This filter is applied to EventDeliveryStatus.UpdatedAt field.
	To time.Time

	// Events is a list of Event identifiers used as filter.
	Events []string
	// Channels is a list of Channel identifiers used as filter.
	Channels []string
	// State is a list of Event State used as filter.
	States []EventDeliveryStatusState
}

func (ListEventsDeliveryStatusInput) Validate

type ListEventsDeliveryStatusResult

type ListEventsDeliveryStatusResult = pagination.Result[EventDeliveryStatus]

type ListEventsInput

type ListEventsInput struct {
	pagination.Page

	Namespaces []string `json:"namespaces,omitempty"`
	Events     []string `json:"events,omitempty"`

	From time.Time `json:"from,omitempty"`
	To   time.Time `json:"to,omitempty"`

	Subjects []string `json:"subjects,omitempty"`
	Features []string `json:"features,omitempty"`

	Rules    []string `json:"rules,omitempty"`
	Channels []string `json:"channels,omitempty"`

	DeduplicationHashes []string `json:"deduplicationHashes,omitempty"`

	DeliveryStatusStates []EventDeliveryStatusState `json:"deliveryStatusStates,omitempty"`

	OrderBy OrderBy
	Order   sortx.Order
}

func (*ListEventsInput) Validate

func (i *ListEventsInput) Validate(_ context.Context, _ Service) error

type ListEventsResult

type ListEventsResult = pagination.Result[Event]

type ListRulesInput

type ListRulesInput struct {
	pagination.Page

	Namespaces      []string
	Rules           []string
	IncludeDisabled bool
	Types           []EventType
	Channels        []string

	OrderBy OrderBy
	Order   sortx.Order
}

func (ListRulesInput) Validate

func (i ListRulesInput) Validate(_ context.Context, _ Service) error

type ListRulesResult

type ListRulesResult = pagination.Result[Rule]

type NotFoundError

type NotFoundError struct {
	models.NamespacedID
}

func (NotFoundError) Error

func (e NotFoundError) Error() string

type OrderBy

type OrderBy string
const (
	OrderByID        OrderBy = "id"
	OrderByType      OrderBy = "type"
	OrderByCreatedAt OrderBy = "createdAt"
	OrderByUpdatedAt OrderBy = "updatedAt"
)

type Rule

type Rule struct {
	models.NamespacedModel
	models.ManagedModel

	// ID is the unique identifier for Rule.
	ID string `json:"id"`
	// Type of the notification Rule (e.g. entitlements.balance.threshold)
	Type EventType `json:"type"`
	// Name of is the user provided name of the Rule.
	Name string `json:"name"`
	// Disabled defines whether the Rule is disabled or not.
	Disabled bool `json:"disabled"`
	// Config stores the actual Rule configuration specific to the Type.
	Config RuleConfig `json:"config"`
	// Channels stores the list of channels the Rule send notification Events to.
	Channels []Channel `json:"channels"`
}

func (Rule) HasEnabledChannels

func (r Rule) HasEnabledChannels() bool

func (Rule) Validate

func (r Rule) Validate(ctx context.Context, service Service) error

type RuleConfig

type RuleConfig struct {
	RuleConfigMeta

	// Balance Threshold
	BalanceThreshold *BalanceThresholdRuleConfig `json:"balanceThreshold,omitempty"`
	EntitlementReset *EntitlementResetRuleConfig `json:"entitlementReset,omitempty"`

	// Invoice
	Invoice *InvoiceRuleConfig `json:"invoice,omitempty"`
}

RuleConfig is a union type capturing configuration parameters for all type of rules.

func (RuleConfig) Validate

func (c RuleConfig) Validate(ctx context.Context, service Service, namespace string) error

Validate invokes channel type specific validator and returns an error if channel configuration is invalid.

type RuleConfigMeta

type RuleConfigMeta struct {
	Type EventType `json:"type"`
}

func (RuleConfigMeta) Validate

func (m RuleConfigMeta) Validate() error

type RuleRepository

type RuleRepository interface {
	ListRules(ctx context.Context, params ListRulesInput) (pagination.Result[Rule], error)
	CreateRule(ctx context.Context, params CreateRuleInput) (*Rule, error)
	DeleteRule(ctx context.Context, params DeleteRuleInput) error
	GetRule(ctx context.Context, params GetRuleInput) (*Rule, error)
	UpdateRule(ctx context.Context, params UpdateRuleInput) (*Rule, error)
}

type RuleService

type RuleService interface {
	ListRules(ctx context.Context, params ListRulesInput) (ListRulesResult, error)
	CreateRule(ctx context.Context, params CreateRuleInput) (*Rule, error)
	DeleteRule(ctx context.Context, params DeleteRuleInput) error
	GetRule(ctx context.Context, params GetRuleInput) (*Rule, error)
	UpdateRule(ctx context.Context, params UpdateRuleInput) (*Rule, error)
}

type UpdateAfterDeleteError

type UpdateAfterDeleteError genericError

func (UpdateAfterDeleteError) Error

func (e UpdateAfterDeleteError) Error() string

func (UpdateAfterDeleteError) Unwrap

func (e UpdateAfterDeleteError) Unwrap() error

type UpdateChannelInput

type UpdateChannelInput struct {
	models.NamespacedModel

	// Type defines the Channel type (e.g. webhook)
	Type ChannelType
	// Name stores the user defined name of the Channel.
	Name string
	// Disabled defines whether the Channel is disabled or not. Deleted Channels are always disabled.
	Disabled bool
	// Config stores the Channel Type specific configuration.
	Config ChannelConfig

	// ID is the unique identifier for Channel.
	ID string
}

func (UpdateChannelInput) Validate

func (i UpdateChannelInput) Validate(_ context.Context, _ Service) error

type UpdateEventDeliveryStatusInput

type UpdateEventDeliveryStatusInput struct {
	models.NamespacedModel

	// ID the unique identifier of the EventDeliveryStatus.
	ID string
	// State is the delivery state of the Event.
	State EventDeliveryStatusState
	// Reason describes the reason for the latest State transition.
	Reason string
	// EventID defines the Event identifier the EventDeliveryStatus belongs to. Must be provided if ID is empty.
	EventID string
	// ChannelID defines the Channel identifier the EventDeliveryStatus belongs to. Must be provided if ID is empty.
	ChannelID string
}

func (UpdateEventDeliveryStatusInput) Validate

type UpdateRuleInput

type UpdateRuleInput struct {
	models.NamespacedModel

	// Type defines the Rule type (e.g. entitlements.balance.threshold)
	Type EventType
	// Name stores the user defined name of the Rule.
	Name string
	// Disabled defines whether the Rule is disabled or not. Deleted Rules are always disabled.
	Disabled bool
	// Config stores the Rule Type specific configuration.
	Config RuleConfig
	// Channels defines the list of Channels the Rule needs to send Events.
	Channels []string

	// ID is the unique identifier for Rule.
	ID string
}

func (UpdateRuleInput) Validate

func (i UpdateRuleInput) Validate(ctx context.Context, service Service) error

type ValidationError

type ValidationError genericError

func (ValidationError) Error

func (e ValidationError) Error() string

func (ValidationError) Unwrap

func (e ValidationError) Unwrap() error

type WebHookChannelConfig

type WebHookChannelConfig struct {
	// CustomHeaders stores a set of HTTP headers which are applied to the outgoing webhook message.
	CustomHeaders map[string]string `json:"customHeaders,omitempty"`
	// URL is the webhook endpoint url where the messages are sent to.
	URL string `json:"url"`
	// SigningSecret defines the secret which can be used for validating the signature of the message sent
	// to the webhook endpoint.
	SigningSecret string `json:"signingSecret"`
}

WebHookChannelConfig defines the configuration specific to channel with webhook type.

func (WebHookChannelConfig) Validate

func (w WebHookChannelConfig) Validate() error

Validate returns an error if webhook channel configuration is invalid.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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