Files
orbit/platform/events/queries.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)
}