89 lines
2.6 KiB
Go
89 lines
2.6 KiB
Go
package events
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"git.yuntuo.hk/k2safe/orbit/internal/fault"
|
|
core "git.yuntuo.hk/k2safe/orbit/model"
|
|
"git.yuntuo.hk/k2safe/orbit/platform/auth"
|
|
platform "git.yuntuo.hk/k2safe/orbit/platform/model"
|
|
)
|
|
|
|
type PageInput struct {
|
|
Limit int
|
|
Cursor string
|
|
State platform.DeliveryState
|
|
}
|
|
type SubscriptionPage struct {
|
|
Items []Subscription `json:"items"`
|
|
NextCursor string `json:"next_cursor,omitempty"`
|
|
}
|
|
type DeliveryPage struct {
|
|
Items []Delivery `json:"items"`
|
|
NextCursor string `json:"next_cursor,omitempty"`
|
|
}
|
|
type DeliveryDetail struct {
|
|
Delivery Delivery `json:"delivery"`
|
|
Event Event `json:"event"`
|
|
}
|
|
|
|
// ConsumerBinding 由认证关系派生,不接受客户端指定应用、队列或凭据归属。
|
|
type ConsumerBinding struct {
|
|
ApplicationID core.ID
|
|
SubscriptionID core.ID
|
|
QueueID core.ID
|
|
Enabled bool
|
|
ServerTime time.Time
|
|
}
|
|
|
|
func normalizePage(in PageInput) (PageInput, error) {
|
|
if in.Limit == 0 {
|
|
in.Limit = 20
|
|
}
|
|
if in.Limit < 1 || in.Limit > 100 || len(in.Cursor) > 2048 {
|
|
return in, fault.Invalid("invalid event page")
|
|
}
|
|
switch in.State {
|
|
case "", platform.DeliveryPending, platform.DeliveryLeased, platform.DeliveryAcked, platform.DeliveryExpired:
|
|
default:
|
|
return in, fault.Invalid("invalid delivery state")
|
|
}
|
|
return in, nil
|
|
}
|
|
func (s *Service) List(ctx context.Context, t auth.Token, queue core.ID, in PageInput) (SubscriptionPage, error) {
|
|
in, err := normalizePage(in)
|
|
if err != nil {
|
|
return SubscriptionPage{}, err
|
|
}
|
|
if queue.Validate() != nil || in.State != "" {
|
|
return SubscriptionPage{}, fault.Invalid("invalid subscription query")
|
|
}
|
|
return s.store.ListSubscriptions(ctx, t, queue, in)
|
|
}
|
|
func (s *Service) Deliveries(ctx context.Context, t auth.Token, id core.ID, in PageInput) (DeliveryPage, error) {
|
|
in, err := normalizePage(in)
|
|
if err != nil {
|
|
return DeliveryPage{}, err
|
|
}
|
|
if id.Validate() != nil {
|
|
return DeliveryPage{}, fault.Invalid("invalid subscription_id")
|
|
}
|
|
return s.store.ListDeliveries(ctx, t, id, in)
|
|
}
|
|
func (s *Service) Detail(ctx context.Context, t auth.Token, sub, id core.ID) (DeliveryDetail, error) {
|
|
if sub.Validate() != nil || id.Validate() != nil {
|
|
return DeliveryDetail{}, fault.Invalid("invalid subscription_id or delivery_id")
|
|
}
|
|
return s.store.GetDeliveryDetail(ctx, t, sub, id)
|
|
}
|
|
func (s *Service) Authorize(ctx context.Context, t auth.Token) error {
|
|
return s.store.AuthorizeEvents(ctx, t)
|
|
}
|
|
func (s *Service) Bind(ctx context.Context, t auth.Token, id core.ID) (ConsumerBinding, error) {
|
|
if id.Validate() != nil {
|
|
return ConsumerBinding{}, fault.Invalid("invalid subscription_id")
|
|
}
|
|
return s.store.BindConsumer(ctx, t, id)
|
|
}
|