package lottery import ( "context" "sync" "gorm.io/gorm" ) // defaultRegistry 是并发安全的默认 Registry。启动时一次性注册,运行时只读。 type defaultRegistry struct { mu sync.RWMutex handlers map[string]PrizeHandler } // NewRegistry 返回空的默认注册表。使用 Register 挂接实现。 // 实际业务 handler(vpn_duration / commission)在 internal/logic/lottery/handler 里, // 由 initialize 阶段注入(避免 model 层反向依赖 logic 层)。 func NewRegistry() *defaultRegistry { return &defaultRegistry{handlers: make(map[string]PrizeHandler, 8)} } // Register 挂接一个 handler;重复注册会覆盖(初始化阶段可控,不额外拦截)。 func (r *defaultRegistry) Register(h PrizeHandler) { r.mu.Lock() defer r.mu.Unlock() r.handlers[h.Type()] = h } func (r *defaultRegistry) Get(prizeType string) (PrizeHandler, bool) { r.mu.RLock() defer r.mu.RUnlock() h, ok := r.handlers[prizeType] return h, ok } func (r *defaultRegistry) MustGet(prizeType string) (PrizeHandler, error) { if h, ok := r.Get(prizeType); ok { return h, nil } return nil, ErrHandlerNotRegistered } // noopHandler 是"谢谢参与",永远归 model 层:不依赖任何业务,最小占位。 type noopHandler struct{} // NewNoopHandler 返回 PrizeTypeNone 的 handler。 func NewNoopHandler() PrizeHandler { return &noopHandler{} } func (noopHandler) Type() string { return PrizeTypeNone } func (noopHandler) IsAuto() bool { return true } func (noopHandler) Dispatch(_ context.Context, _ *gorm.DB, _ DispatchRequest) (DispatchResult, error) { return DispatchResult{State: DispatchStateAutoClaimed, Message: "谢谢参与"}, nil } func (noopHandler) ValidateClaim(_ []byte) error { return nil }