registry.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package payment
  2. import (
  3. "sync"
  4. infraerrors "github.com/Wei-Shaw/sub2api/internal/pkg/errors"
  5. )
  6. // Registry is a thread-safe registry mapping PaymentType to Provider.
  7. type Registry struct {
  8. mu sync.RWMutex
  9. providers map[PaymentType]Provider
  10. }
  11. // ErrProviderNotFound is returned when a requested payment provider is not registered.
  12. var ErrProviderNotFound = infraerrors.NotFound("PROVIDER_NOT_FOUND", "payment provider not registered")
  13. // NewRegistry creates a new empty provider registry.
  14. func NewRegistry() *Registry {
  15. return &Registry{
  16. providers: make(map[PaymentType]Provider),
  17. }
  18. }
  19. // Register adds a provider for each of its supported payment types.
  20. // If a type was previously registered, it is overwritten.
  21. func (r *Registry) Register(p Provider) {
  22. r.mu.Lock()
  23. defer r.mu.Unlock()
  24. for _, t := range p.SupportedTypes() {
  25. r.providers[t] = p
  26. }
  27. }
  28. // GetProvider returns the provider registered for the given payment type.
  29. func (r *Registry) GetProvider(t PaymentType) (Provider, error) {
  30. r.mu.RLock()
  31. defer r.mu.RUnlock()
  32. p, ok := r.providers[t]
  33. if !ok {
  34. return nil, ErrProviderNotFound
  35. }
  36. return p, nil
  37. }
  38. // GetProviderByKey returns the first provider whose ProviderKey matches the given key.
  39. func (r *Registry) GetProviderByKey(key string) (Provider, error) {
  40. r.mu.RLock()
  41. defer r.mu.RUnlock()
  42. for _, p := range r.providers {
  43. if p.ProviderKey() == key {
  44. return p, nil
  45. }
  46. }
  47. return nil, ErrProviderNotFound
  48. }
  49. // GetProviderKey returns the provider key for the given payment type, or empty string if not found.
  50. func (r *Registry) GetProviderKey(t PaymentType) string {
  51. r.mu.RLock()
  52. defer r.mu.RUnlock()
  53. p, ok := r.providers[t]
  54. if !ok {
  55. return ""
  56. }
  57. return p.ProviderKey()
  58. }
  59. // SupportedTypes returns all currently registered payment types.
  60. func (r *Registry) SupportedTypes() []PaymentType {
  61. r.mu.RLock()
  62. defer r.mu.RUnlock()
  63. types := make([]PaymentType, 0, len(r.providers))
  64. for t := range r.providers {
  65. types = append(types, t)
  66. }
  67. return types
  68. }
  69. // Clear removes all registered providers.
  70. func (r *Registry) Clear() {
  71. r.mu.Lock()
  72. defer r.mu.Unlock()
  73. r.providers = make(map[PaymentType]Provider)
  74. }