Files
daily-notification-plugin/docs/progress/P2.1-BATCH-1.md
Matthew Raymer 56a89e65b3 docs(p2.1): Fix baseline tag drift and create method-service mapping
Fixed baseline tag drift issue:
- docs/00-INDEX.md now references docs/progress/00-STATUS.md as canonical baseline
- docs/progress/00-STATUS.md marked as canonical baseline authority

Created Priority 2.1 mapping and batch planning:
- docs/progress/P2.1-METHOD-SERVICE-MAP.md: Complete method-to-service mapping
- docs/progress/P2.1-BATCH-1.md: First batch (pure delegation, ~15 methods)
- docs/progress/P2.1-BATCH-2.md: Second batch (validation + delegation, ~20 methods)

Batch 1 focuses on read-only operations (lowest risk).
Batch 2 focuses on validation + delegation (medium risk).

Expected reduction: ~1,650-2,000 lines across both platforms.

Verification:
- Baseline authority fixed 
- Method mapping complete 
- Batch plans created 
2025-12-23 10:16:12 +00:00

231 lines
7.7 KiB
Markdown

# Priority 2.1: Batch 1 - Pure Delegation Methods
**Purpose:** First refactoring batch focusing on pure delegation (lowest risk).
**Owner:** Development Team
**Last Updated:** 2025-12-23
**Status:** planned
**Baseline:** See `docs/progress/00-STATUS.md`
---
## Batch 1 Scope
**Goal:** Refactor methods that are pure delegation (no transformation, minimal validation).
**Risk Level:** ⭐ Low (read-only operations, no state mutation)
**Estimated Impact:** ~15-20 methods across both platforms
---
## Android Methods
### Status & Health (Read-Only)
1. **`getNotificationStatus()`**
- **Current:** Direct implementation in plugin
- **Target:** `NotificationStatusChecker.getComprehensiveStatus()`
- **Change:** Replace implementation with service call
- **Files:** `DailyNotificationPlugin.kt` (~45 lines → ~5 lines)
2. **`checkStatus()`**
- **Current:** Alias for `getNotificationStatus()`
- **Target:** `NotificationStatusChecker.getComprehensiveStatus()`
- **Change:** Delegate to same service method
- **Files:** `DailyNotificationPlugin.kt` (~55 lines → ~5 lines)
### Permission Checks (Read-Only)
3. **`checkPermissionStatus()`**
- **Current:** Direct implementation in plugin
- **Target:** `PermissionManager.checkNotificationPermission()`
- **Change:** Replace implementation with service call
- **Files:** `DailyNotificationPlugin.kt` (~53 lines → ~5 lines)
4. **`checkPermissions()`** (override)
- **Current:** Direct implementation in plugin
- **Target:** `PermissionManager.checkAllPermissions()`
- **Change:** Delegate to manager
- **Files:** `DailyNotificationPlugin.kt` (~43 lines → ~5 lines)
### Exact Alarm Status (Read-Only)
5. **`getExactAlarmStatus()`**
- **Current:** Direct implementation in plugin
- **Target:** `DailyNotificationExactAlarmManager.getStatus()`
- **Change:** Replace implementation with service call
- **Files:** `DailyNotificationPlugin.kt` (~43 lines → ~5 lines)
6. **`checkExactAlarmPermission()`**
- **Current:** Direct implementation in plugin
- **Target:** `DailyNotificationExactAlarmManager.checkPermission()`
- **Change:** Replace implementation with service call
- **Files:** `DailyNotificationPlugin.kt` (~23 lines → ~5 lines)
### Channel Status (Read-Only)
7. **`isChannelEnabled()`**
- **Current:** Direct implementation in plugin
- **Target:** `ChannelManager.isChannelEnabled(channelId)`
- **Change:** Replace implementation with service call
- **Files:** `DailyNotificationPlugin.kt` (~77 lines → ~5 lines)
### Scheduling Queries (Read-Only)
8. **`isAlarmScheduled()`**
- **Current:** Direct implementation in plugin
- **Target:** `DailyNotificationScheduler.isScheduled(...)`
- **Change:** Replace implementation with service call
- **Files:** `DailyNotificationPlugin.kt` (~24 lines → ~5 lines)
9. **`getNextAlarmTime()`**
- **Current:** Direct implementation in plugin
- **Target:** `DailyNotificationScheduler.getNextAlarmTime()`
- **Change:** Replace implementation with service call
- **Files:** `DailyNotificationPlugin.kt` (~26 lines → ~5 lines)
### Content Cache (Read-Only)
10. **`getContentCache()`**
- **Current:** Direct database access in plugin
- **Target:** `DailyNotificationStorage.getContentCache(id)`
- **Change:** Replace database access with storage service call
- **Files:** `DailyNotificationPlugin.kt` (~31 lines → ~5 lines)
---
## iOS Methods
### Permission Status (Read-Only)
1. **`getNotificationPermissionStatus()`**
- **Current:** Direct `UNUserNotificationCenter` access
- **Target:** Create `PermissionService.getStatus()` (or use existing pattern)
- **Change:** Extract to service, delegate
- **Files:** `DailyNotificationPlugin.swift` (~37 lines → ~5 lines)
### Background Task Status (Read-Only)
2. **`getBackgroundTaskStatus()`**
- **Current:** Direct `BGTaskScheduler` access
- **Target:** `DailyNotificationBackgroundTaskManager.getStatus()`
- **Change:** Replace implementation with service call
- **Files:** `DailyNotificationPlugin.swift` (~18 lines → ~5 lines)
### Scheduling Queries (Read-Only)
3. **`getNextScheduledNotificationTime()`**
- **Current:** Direct scheduler access
- **Target:** `DailyNotificationScheduler.getNextTime()`
- **Change:** Replace implementation with service call
- **Files:** `DailyNotificationPlugin.swift` (~29 lines → ~5 lines)
### Content & History (Read-Only)
4. **`getLastNotification()`**
- **Current:** Direct storage access
- **Target:** `DailyNotificationStorage.getLastNotification()`
- **Change:** Replace storage access with service call
- **Files:** `DailyNotificationPlugin.swift` (~38 lines → ~5 lines)
5. **`getScheduledReminders()`**
- **Current:** Direct UserDefaults access
- **Target:** `DailyNotificationStorage.getReminders()`
- **Change:** Replace UserDefaults access with storage service call
- **Files:** `DailyNotificationPlugin.swift` (~24 lines → ~5 lines)
---
## Implementation Steps
### Step 1: Verify Service Methods Exist
- [ ] Check `NotificationStatusChecker.getComprehensiveStatus()` exists
- [ ] Check `PermissionManager.checkNotificationPermission()` exists
- [ ] Check `DailyNotificationExactAlarmManager.getStatus()` exists
- [ ] Check `ChannelManager.isChannelEnabled()` exists
- [ ] Check `DailyNotificationScheduler.isScheduled()` exists
- [ ] Check `DailyNotificationScheduler.getNextAlarmTime()` exists
- [ ] Check `DailyNotificationStorage.getContentCache()` exists
- [ ] Check iOS service methods exist or need creation
### Step 2: Create Service Instances (if needed)
- [ ] Ensure plugin has service instances as private properties
- [ ] Initialize services in `load()` method
- [ ] Add null checks where appropriate
### Step 3: Refactor Android Methods
- [ ] Replace `getNotificationStatus()` implementation
- [ ] Replace `checkStatus()` implementation
- [ ] Replace `checkPermissionStatus()` implementation
- [ ] Replace `checkPermissions()` implementation
- [ ] Replace `getExactAlarmStatus()` implementation
- [ ] Replace `checkExactAlarmPermission()` implementation
- [ ] Replace `isChannelEnabled()` implementation
- [ ] Replace `isAlarmScheduled()` implementation
- [ ] Replace `getNextAlarmTime()` implementation
- [ ] Replace `getContentCache()` implementation
### Step 4: Refactor iOS Methods
- [ ] Replace `getNotificationPermissionStatus()` implementation
- [ ] Replace `getBackgroundTaskStatus()` implementation
- [ ] Replace `getNextScheduledNotificationTime()` implementation
- [ ] Replace `getLastNotification()` implementation
- [ ] Replace `getScheduledReminders()` implementation
### Step 5: Testing
- [ ] Run Android unit tests
- [ ] Run iOS unit tests
- [ ] Run integration tests
- [ ] Manual smoke test on both platforms
- [ ] Verify no behavior changes
### Step 6: Verification
- [ ] Run `./ci/run.sh` (must pass)
- [ ] Check plugin class line count reduction
- [ ] Verify service methods are being called
- [ ] Update progress docs
---
## Expected Outcomes
### Metrics
- **Android plugin:** ~400-500 lines removed
- **iOS plugin:** ~150-200 lines removed
- **Total reduction:** ~550-700 lines across both platforms
- **Test coverage:** Maintained (no behavior changes)
### Benefits
- ✅ Plugin classes become thinner
- ✅ Business logic moves to testable services
- ✅ No breaking API changes
- ✅ Lower risk (read-only operations)
---
## Rollback Plan
If issues arise:
1. Revert commits for this batch
2. Service methods remain unchanged (no risk)
3. Plugin methods can be restored from git history
---
## Next Batch
After Batch 1 completes successfully:
- **Batch 2:** Validation + Delegation methods (input validation, then delegate)
- **Batch 3:** Glue methods (orchestration across multiple services)