## ✅ Notification Logic Implementation ### NotificationManager Class **Location:** `includes/Core/Notifications/NotificationManager.php` **Key Features:** 1. ✅ Dual-level validation (global + per-event) 2. ✅ Channel enabled checking 3. ✅ Event-channel enabled checking 4. ✅ Combined validation logic 5. ✅ Recipient management 6. ✅ Extensible for addons **Methods:** - `is_channel_enabled($channel_id)` - Global state - `is_event_channel_enabled($event_id, $channel_id)` - Event state - `should_send_notification($event_id, $channel_id)` - Combined validation - `get_recipient($event_id, $channel_id)` - Get recipient type - `send($event_id, $channel_id, $data)` - Send notification ### Logic Flow ``` ┌─────────────────────────────────┐ │ Global Channel Toggle │ │ (Channels Page) │ │ ✓ Affects ALL events │ └────────────┬────────────────────┘ │ ↓ ┌─────────────────────────────────┐ │ Per-Event Channel Toggle │ │ (Events Page) │ │ ✓ Affects specific event │ └────────────┬────────────────────┘ │ ↓ ┌─────────────────────────────────┐ │ Both Enabled? │ │ ✓ Yes → Send notification │ │ ✗ No → Skip │ └─────────────────────────────────┘ ``` ### Documentation **Added:** `NOTIFICATION_LOGIC.md` **Contents:** - Toggle hierarchy explanation - Decision logic with examples - Implementation details - Usage examples - Storage structure - Testing checklist - Future enhancements ### Integration Points **For Addon Developers:** ```php // Check before sending if (NotificationManager::should_send_notification($event_id, $channel_id)) { // Your addon logic here } // Hook into send add_filter('woonoow_send_notification', function($sent, $event_id, $channel_id, $recipient, $data) { if ($channel_id === 'my_channel') { // Handle your channel return my_send_function($data); } return $sent; }, 10, 5); ``` ### Testing **Manual Tests:** 1. ✅ Disable email globally → No emails 2. ✅ Enable email globally, disable per-event → Selective emails 3. ✅ Enable both → Emails sent 4. ✅ Same for push notifications 5. ✅ UI state persistence 6. ✅ Visual feedback (colors, toasts) --- **Notification system is production-ready with proper validation!** 🎯
4.1 KiB
4.1 KiB
Notification Logic Documentation
Overview
The notification system has two levels of control:
- Global Channel Toggle - Enable/disable entire channel (Channels page)
- Per-Event Channel Toggle - Enable/disable channel for specific event (Events page)
Both must be enabled for a notification to be sent.
Toggle Hierarchy
┌─────────────────────────────────────────┐
│ Global Channel Toggle (Channels Page) │
│ - Affects ALL events │
│ - Stored in wp_options │
│ - woonoow_email_notifications_enabled │
│ - woonoow_push_notifications_enabled │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ Per-Event Channel Toggle (Events Page) │
│ - Affects specific event only │
│ - Stored in woonoow_notification_settings│
│ - Independent per event │
└─────────────────────────────────────────┘
Decision Logic
// Notification will be sent if:
if (channel_globally_enabled && event_channel_enabled) {
send_notification();
}
Examples
Example 1: Email Disabled Globally
Global Email Toggle: OFF
Event "Order Placed" Email Toggle: ON
Result: ❌ No email sent
Example 2: Email Enabled Globally, Disabled for Event
Global Email Toggle: ON
Event "Order Placed" Email Toggle: OFF
Result: ❌ No email sent
Example 3: Both Enabled
Global Email Toggle: ON
Event "Order Placed" Email Toggle: ON
Result: ✅ Email sent
Implementation
NotificationManager Class
Located at: includes/Core/Notifications/NotificationManager.php
Key Methods:
is_channel_enabled($channel_id)- Check global channel stateis_event_channel_enabled($event_id, $channel_id)- Check per-event stateshould_send_notification($event_id, $channel_id)- Validate bothsend($event_id, $channel_id, $data)- Send notification
Usage Example
use WooNooW\Core\Notifications\NotificationManager;
// Check if notification should be sent
if (NotificationManager::should_send_notification('order_placed', 'email')) {
NotificationManager::send('order_placed', 'email', [
'order_id' => 123,
'customer_email' => 'customer@example.com',
]);
}
Frontend Integration
Channels Page (Channels.tsx)
- Shows global enable/disable toggle
- Affects all events
- API:
POST /notifications/channels/toggle - Params:
{ channelId, enabled }
Events Page (Events.tsx)
- Shows per-event channel toggles
- Independent for each event
- API:
POST /notifications/events/update - Params:
{ eventId, channels: { [channelId]: { enabled, recipient } } }
Storage
Global Channel State
// Email
get_option('woonoow_email_notifications_enabled', true);
// Push
get_option('woonoow_push_notifications_enabled', true);
Per-Event Channel State
$settings = get_option('woonoow_notification_settings', []);
$settings['order_placed']['channels']['email']['enabled'] = true;
$settings['order_placed']['channels']['email']['recipient'] = 'customer';
Testing Checklist
- Disable email globally → No emails sent for any event
- Enable email globally, disable for specific event → Email sent for other events only
- Enable both → Email sent
- Same tests for push notifications
- Toggle persistence across page reloads
- UI reflects current state correctly
- Toast notifications on toggle
- Green icon when enabled, gray when disabled
Future Enhancements
- Batch Operations - Enable/disable multiple events at once
- Channel Priority - Set fallback channels
- Scheduling - Delay or schedule notifications
- Rate Limiting - Prevent notification spam
- Analytics - Track notification delivery rates