Consolidate all push notification handling logic in the root package to eliminate
adapters and simplify the architecture. This provides direct access to concrete
types without any intermediate layers or type conversions.
Key Changes:
1. Moved Core Types to Root Package:
- Moved Registry, Processor, VoidProcessor to push_notifications.go
- Moved all push notification constants to root package
- Removed internal/pushnotif package dependencies
- Direct implementation without internal abstractions
2. Eliminated All Adapters:
- Removed handlerAdapter that bridged internal and public interfaces
- Removed voidProcessorAdapter for void processor functionality
- Removed convertInternalToPublicContext conversion functions
- Direct usage of concrete types throughout
3. Simplified Architecture:
- PushNotificationHandlerContext directly implemented in root package
- PushNotificationHandler directly implemented in root package
- Registry, Processor, VoidProcessor directly in root package
- No intermediate layers or type conversions needed
4. Direct Type Usage:
- GetClusterClient() returns *ClusterClient directly
- GetSentinelClient() returns *SentinelClient directly
- GetRegularClient() returns *Client directly
- GetPubSub() returns *PubSub directly
- No interface casting or type assertions required
5. Updated All Integration Points:
- Updated redis.go to use direct types
- Updated pubsub.go to use direct types
- Updated sentinel.go to use direct types
- Removed all internal/pushnotif imports
- Simplified context creation and usage
6. Core Implementation in Root Package:
```go
// Direct implementation - no adapters needed
type Registry struct {
handlers map[string]PushNotificationHandler
protected map[string]bool
}
type Processor struct {
registry *Registry
}
type VoidProcessor struct{}
```
7. Handler Context with Concrete Types:
```go
type PushNotificationHandlerContext interface {
GetClusterClient() *ClusterClient // Direct concrete type
GetSentinelClient() *SentinelClient // Direct concrete type
GetRegularClient() *Client // Direct concrete type
GetPubSub() *PubSub // Direct concrete type
}
```
8. Comprehensive Test Suite:
- Added push_notifications_test.go with full test coverage
- Tests for Registry, Processor, VoidProcessor
- Tests for HandlerContext with concrete type access
- Tests for all push notification constants
- Validates all functionality works correctly
9. Benefits:
- Eliminated complex adapter pattern
- Removed unnecessary type conversions
- Simplified codebase with direct type usage
- Better performance without adapter overhead
- Cleaner architecture with single source of truth
- Enhanced developer experience with direct access
10. Architecture Simplification:
Before: Client -> Adapter -> Internal -> Adapter -> Handler
After: Client -> Handler (direct)
No more:
- handlerAdapter bridging interfaces
- voidProcessorAdapter for void functionality
- convertInternalToPublicContext conversions
- Complex type mapping between layers
This refactoring provides a much cleaner, simpler architecture where all
push notification logic lives in the root package with direct access to
concrete Redis client types, eliminating unnecessary complexity while
maintaining full functionality and type safety.