forked from trent_larson/crowd-funder-for-time-pwa
- Update BUILDING.md with current build system information - Modernize various README files across the project - Update CHANGELOG.md with recent changes - Improve documentation consistency and formatting - Update platform-specific documentation (iOS, Electron, Docker) - Enhance test documentation and build guides
468 lines
15 KiB
Markdown
468 lines
15 KiB
Markdown
# Migration Progress Tracker: PlatformServiceMixin & 52-File Migration
|
|
|
|
## Per-File Migration Workflow (MANDATORY)
|
|
|
|
For each file migrated:
|
|
|
|
1. **First**, migrate to PlatformServiceMixin (replace all databaseUtil usage, etc.).
|
|
2. **Immediately after**, standardize notify helper usage (property + created() pattern) and fix any related linter/type errors.
|
|
|
|
**This two-step process is to be followed for every file, not as a global sweep at the end.**
|
|
|
|
Anyone picking up this migration should follow this workflow for consistency and completeness.
|
|
|
|
---
|
|
|
|
## Overview
|
|
|
|
This document tracks the progress of the 2-day sprint to complete PlatformServiceMixin implementation and migrate all 52 files from databaseUtil imports to PlatformServiceMixin usage.
|
|
|
|
**Last Updated**: $(date)
|
|
**Current Phase**: ✅ **DAY 1 COMPLETE** - PlatformServiceMixin Circular Dependency Resolved
|
|
**Overall Progress**: 69% (64/92 components migrated)
|
|
|
|
---
|
|
|
|
## ✅ **DAY 1: PlatformServiceMixin Completion (COMPLETE)**
|
|
|
|
### **Phase 1: Remove Circular Dependency (COMPLETE)**
|
|
|
|
**Status**: ✅ **COMPLETE**
|
|
**Issue**: PlatformServiceMixin imports `memoryLogs` from databaseUtil
|
|
**Solution**: Create self-contained memoryLogs implementation
|
|
|
|
#### **Tasks**
|
|
|
|
- [x] **Step 1.1**: Remove `memoryLogs` import from PlatformServiceMixin.ts ✅
|
|
- [x] **Step 1.2**: Add self-contained `_memoryLogs` array to PlatformServiceMixin ✅
|
|
- [x] **Step 1.3**: Add `$appendToMemoryLogs()` method to PlatformServiceMixin ✅
|
|
- [x] **Step 1.4**: Update logger.ts to use self-contained memoryLogs ✅
|
|
- [x] **Step 1.5**: Test memoryLogs functionality ✅
|
|
|
|
#### **Files Modified**
|
|
|
|
- `src/utils/PlatformServiceMixin.ts` ✅
|
|
- `src/utils/logger.ts` ✅
|
|
|
|
#### **Validation**
|
|
|
|
- [x] No circular dependency errors ✅
|
|
- [x] memoryLogs functionality works correctly ✅
|
|
- [x] Linting passes ✅
|
|
|
|
---
|
|
|
|
### **Phase 2: Add Missing Utility Functions (COMPLETE)**
|
|
|
|
**Status**: ✅ **COMPLETE**
|
|
**Missing Functions**: `generateInsertStatement`, `generateUpdateStatement`
|
|
|
|
#### **Tasks**
|
|
|
|
- [x] **Step 2.1**: Add `_generateInsertStatement()` private method to PlatformServiceMixin ✅
|
|
- [x] **Step 2.2**: Add `_generateUpdateStatement()` private method to PlatformServiceMixin ✅
|
|
- [x] **Step 2.3**: Add `$generateInsertStatement()` public wrapper method ✅
|
|
- [x] **Step 2.4**: Add `$generateUpdateStatement()` public wrapper method ✅
|
|
- [x] **Step 2.5**: Test both utility functions ✅
|
|
|
|
#### **Files Modified**
|
|
|
|
- `src/utils/PlatformServiceMixin.ts` ✅
|
|
|
|
#### **Validation**
|
|
|
|
- [x] Both functions generate correct SQL ✅
|
|
- [x] Parameter handling works correctly ✅
|
|
- [x] Type safety maintained ✅
|
|
|
|
---
|
|
|
|
### **Phase 3: Update Type Definitions (COMPLETE)**
|
|
|
|
**Status**: ✅ **COMPLETE**
|
|
**Goal**: Add new methods to TypeScript interfaces
|
|
|
|
#### **Tasks**
|
|
|
|
- [x] **Step 3.1**: Add new methods to `IPlatformServiceMixin` interface ✅
|
|
- [x] **Step 3.2**: Add new methods to `ComponentCustomProperties` interface ✅
|
|
- [x] **Step 3.3**: Verify TypeScript compilation ✅
|
|
|
|
#### **Files Modified**
|
|
|
|
- `src/utils/PlatformServiceMixin.ts` (interface definitions) ✅
|
|
|
|
#### **Validation**
|
|
|
|
- [x] TypeScript compilation passes ✅
|
|
- [x] All new methods properly typed ✅
|
|
- [x] No type errors in existing code ✅
|
|
|
|
---
|
|
|
|
### **Phase 4: Testing & Validation (COMPLETE)**
|
|
|
|
**Status**: ✅ **COMPLETE**
|
|
**Goal**: Ensure PlatformServiceMixin is fully functional
|
|
|
|
#### **Tasks**
|
|
|
|
- [x] **Step 4.1**: Create test component to verify all methods ✅
|
|
- [x] **Step 4.2**: Run comprehensive linting ✅
|
|
- [x] **Step 4.3**: Run TypeScript type checking ✅
|
|
- [x] **Step 4.4**: Test caching functionality ✅
|
|
- [x] **Step 4.5**: Test database operations ✅
|
|
|
|
#### **Validation**
|
|
|
|
- [x] All tests pass ✅
|
|
- [x] No linting errors ✅
|
|
- [x] No TypeScript errors ✅
|
|
- [x] Caching works correctly ✅
|
|
- [x] Database operations work correctly ✅
|
|
|
|
---
|
|
|
|
### **Phase 5: Utility Files Migration (COMPLETE)**
|
|
|
|
**Status**: ✅ **COMPLETE**
|
|
**Goal**: Remove all remaining databaseUtil imports from utility files
|
|
|
|
#### **Tasks**
|
|
|
|
- [x] **Step 5.1**: Migrate `src/services/deepLinks.ts` ✅
|
|
- Replaced `logConsoleAndDb` with `console.error`
|
|
- Removed databaseUtil import
|
|
- [x] **Step 5.2**: Migrate `src/libs/util.ts` ✅
|
|
- Added self-contained `parseJsonField()` and `mapQueryResultToValues()` functions
|
|
- Replaced all databaseUtil calls with PlatformServiceFactory usage
|
|
- Updated all async calls to use proper async pattern
|
|
- [x] **Step 5.3**: Verify no remaining databaseUtil imports ✅
|
|
|
|
#### **Validation**
|
|
|
|
- [x] No databaseUtil imports in any TypeScript files ✅
|
|
- [x] No databaseUtil imports in any Vue files ✅
|
|
- [x] All functions work correctly ✅
|
|
|
|
---
|
|
|
|
## 🎯 **DAY 2: Migrate All 52 Files (READY TO START)**
|
|
|
|
### **Migration Strategy**
|
|
|
|
**Priority Order**:
|
|
|
|
1. **Views** (25 files) - User-facing components
|
|
2. **Components** (15 files) - Reusable UI components
|
|
3. **Services** (8 files) - Business logic
|
|
4. **Utils** (4 files) - Utility functions
|
|
|
|
### **Migration Pattern for Each File**
|
|
|
|
```typescript
|
|
// 1. Add PlatformServiceMixin
|
|
import { PlatformServiceMixin } from "@/utils/PlatformServiceMixin";
|
|
export default class ComponentName extends Vue {
|
|
mixins = [PlatformServiceMixin];
|
|
}
|
|
|
|
// 2. Replace databaseUtil imports
|
|
// Remove: import { ... } from "@/db/databaseUtil";
|
|
// Use mixin methods instead
|
|
|
|
// 3. Update method calls
|
|
// Before: generateInsertStatement(contact, 'contacts')
|
|
// After: this.$generateInsertStatement(contact, 'contacts')
|
|
```
|
|
|
|
### **Common Replacements**
|
|
|
|
- `generateInsertStatement` → `this.$generateInsertStatement`
|
|
- `generateUpdateStatement` → `this.$generateUpdateStatement`
|
|
- `parseJsonField` → `this._parseJsonField`
|
|
- `mapColumnsToValues` → `this._mapColumnsToValues`
|
|
- `logToDb` → `this.$log`
|
|
- `logConsoleAndDb` → `this.$logAndConsole`
|
|
- `memoryLogs` → `this.$memoryLogs`
|
|
|
|
---
|
|
|
|
## 📋 **File Migration Checklist**
|
|
|
|
### **Views (25 files) - Priority 1**
|
|
|
|
**Progress**: 6/25 (24%)
|
|
|
|
- [ ] QuickActionBvcEndView.vue
|
|
- [ ] ProjectsView.vue
|
|
- [x] ClaimCertificateView.vue ✅ **MIGRATED & HUMAN TESTED**
|
|
- [ ] NewEditAccountView.vue
|
|
- [ ] OnboardMeetingSetupView.vue
|
|
- [ ] SearchAreaView.vue
|
|
- [ ] TestView.vue
|
|
- [ ] InviteOneView.vue
|
|
- [ ] IdentitySwitcherView.vue
|
|
- [ ] HelpNotificationsView.vue
|
|
- [ ] StartView.vue
|
|
- [ ] OfferDetailsView.vue
|
|
- [ ] ContactEditView.vue
|
|
- [ ] SharedPhotoView.vue
|
|
- [x] ContactQRScanShowView.vue ✅ **MIGRATED & HUMAN TESTED**
|
|
- [ ] ContactGiftingView.vue
|
|
- [x] DiscoverView.vue ✅ **MIGRATED & HUMAN TESTED**
|
|
- [ ] ImportAccountView.vue
|
|
- [ ] ConfirmGiftView.vue
|
|
- [ ] SeedBackupView.vue
|
|
- [ ] ContactAmountsView.vue
|
|
- [x] ContactQRScanFullView.vue ✅ **MIGRATED & HUMAN TESTED**
|
|
- [ ] ContactsView.vue
|
|
- [ ] DIDView.vue
|
|
- [ ] GiftedDetailsView.vue
|
|
- [x] HelpView.vue ✅ **MIGRATED & HUMAN TESTED**
|
|
- [ ] ImportDerivedAccountView.vue
|
|
- [ ] InviteOneAcceptView.vue
|
|
- [ ] NewActivityView.vue
|
|
- [x] NewEditProjectView.vue ✅ **MIGRATED**
|
|
- [ ] OnboardMeetingListView.vue
|
|
- [ ] OnboardMeetingMembersView.vue
|
|
- [ ] ProjectViewView.vue
|
|
- [ ] QuickActionBvcBeginView.vue
|
|
- [ ] RecentOffersToUserProjectsView.vue
|
|
- [ ] RecentOffersToUserView.vue
|
|
- [ ] UserProfileView.vue
|
|
|
|
### **Components (15 files) - Priority 2**
|
|
|
|
**Progress**: 9/15 (60%)
|
|
|
|
- [x] UserNameDialog.vue ✅ **MIGRATED**
|
|
- [x] AmountInput.vue ✅ **REVIEWED (no migration needed)**
|
|
- Pure UI component, no databaseUtil or notification usage.
|
|
- [x] ImageMethodDialog.vue ✅ **MIGRATED & HUMAN TESTED**
|
|
- Completed 2025-07-09 07:04 AM UTC (19 minutes)
|
|
- All 4 phases completed: Database migration, SQL abstraction, notification standardization, template streamlining
|
|
- 20 long CSS classes extracted to computed properties
|
|
- [x] ChoiceButtonDialog.vue ✅ MIGRATED 2025-07-09 (7 min, all phases complete, template streamlined, no DB/SQL needed)
|
|
- [x] ContactNameDialog.vue ✅ MIGRATED 2025-07-09 (2 min, all phases complete, template streamlined, no DB/SQL needed)
|
|
- [x] DataExportSection.vue ✅ MIGRATED & HUMAN TESTED 2025-07-09 (3 min, all phases complete, template streamlined, already had DB/notifications)
|
|
- [x] EntityGrid.vue ✅ MIGRATED 2024-12-19 (3 min, Phase 4 only - template streamlined, no DB/SQL needed)
|
|
- [x] EntityIcon.vue ✅ MIGRATED & HUMAN TESTED 2024-12-19 (2 min, documentation enhancement, no DB/SQL needed)
|
|
- [x] EntitySelectionStep.vue ✅ MIGRATED & HUMAN TESTED 2024-12-19 (3 min, Phase 4 only - template streamlined, no DB/SQL needed)
|
|
- [x] EntitySummaryButton.vue ✅ MIGRATED & HUMAN TESTED 2024-12-19 (3 min, Phase 4 only - template streamlined, no DB/SQL needed)
|
|
- [x] FeedFilters.vue ✅ **MIGRATED**
|
|
- [x] GiftDetailsStep.vue ✅ MIGRATED & HUMAN TESTED 2024-12-19 (4 min, Phase 4 only - template streamlined, no DB/SQL needed)
|
|
- [x] GiftedDialog.vue ✅ **MIGRATED**
|
|
- [x] GiftedPrompts.vue ✅ MIGRATED & HUMAN TESTED 2024-12-19 (3 min, Phase 4 only - template streamlined, no DB/SQL needed)
|
|
- [x] HiddenDidDialog.vue ✅ MIGRATED & HUMAN TESTED 2024-12-19 (5 min, Phase 3 & 4 - notification modernized, template streamlined, no DB/SQL needed)
|
|
- [x] IconRenderer.vue ✅ MIGRATED & HUMAN TESTED 2024-12-19 (0 min, no migration needed - already compliant)
|
|
|
|
### **Services (8 files) - Priority 3**
|
|
|
|
**Progress**: 2/8 (25%)
|
|
|
|
- [x] api.ts ✅ MIGRATED 2024-12-19 (0 min, no migration needed - already compliant)
|
|
- [x] endorserServer.ts ✅ MIGRATED 2024-12-19 (35 min, all phases complete - database, SQL, notification migration)
|
|
- [ ] partnerServer.ts
|
|
- [ ] deepLinks.ts
|
|
|
|
### **Utils (4 files) - Priority 4**
|
|
|
|
**Progress**: 1/4 (25%)
|
|
|
|
- [ ] LogCollector.ts
|
|
- [x] util.ts ✅ MIGRATED 2024-12-19 (no migration needed, utility module decoupled from Vue, reviewed and confirmed)
|
|
- [x] test/index.ts ✅ MIGRATED 2024-12-19 (5 min, database migration with dynamic import pattern, enhanced documentation)
|
|
- [ ] PlatformServiceMixin.ts (remove circular dependency)
|
|
|
|
---
|
|
|
|
## 🛠️ **Migration Tools**
|
|
|
|
### **Migration Helper Script**
|
|
|
|
```bash
|
|
# Track progress
|
|
./scripts/migration-helper.sh progress
|
|
|
|
# Show remaining files
|
|
./scripts/migration-helper.sh files
|
|
|
|
# Show replacement patterns
|
|
./scripts/migration-helper.sh patterns
|
|
|
|
# Show migration template
|
|
./scripts/migration-helper.sh template
|
|
|
|
# Validate migration
|
|
./scripts/migration-helper.sh validate
|
|
|
|
# Show next steps
|
|
./scripts/migration-helper.sh next
|
|
|
|
# Run all checks
|
|
./scripts/migration-helper.sh all
|
|
```
|
|
|
|
### **Validation Commands**
|
|
|
|
```bash
|
|
# Check for remaining databaseUtil imports
|
|
find src -name "*.vue" -o -name "*.ts" | xargs grep -l "import.*databaseUtil"
|
|
|
|
# Run linting
|
|
npm run lint
|
|
|
|
# Run type checking
|
|
npx tsc --noEmit
|
|
|
|
# Count remaining files
|
|
find src -name "*.vue" -o -name "*.ts" | xargs grep -l "import.*databaseUtil" | wc -l
|
|
```
|
|
|
|
---
|
|
|
|
## 📊 **Progress Tracking**
|
|
|
|
### **Day 1 Progress**
|
|
|
|
- [ ] Phase 1: Circular dependency resolved
|
|
- [ ] Phase 2: Utility functions added
|
|
- [ ] Phase 3: Type definitions updated
|
|
- [ ] Phase 4: Testing completed
|
|
|
|
### **Day 2 Progress**
|
|
|
|
- [ ] Views migrated (0/25)
|
|
- [ ] Components migrated (0/15)
|
|
- [ ] Services migrated (0/8)
|
|
- [ ] Utils migrated (0/4)
|
|
- [ ] Validation completed
|
|
|
|
### **Overall Progress**
|
|
|
|
- **Total files to migrate**: 52
|
|
- **Files migrated**: 3
|
|
- **Progress**: 6%
|
|
|
|
---
|
|
|
|
## 🎯 **Success Criteria**
|
|
|
|
### **Day 1 Success Criteria**
|
|
|
|
- [ ] PlatformServiceMixin has no circular dependencies
|
|
- [ ] All utility functions implemented and tested
|
|
- [ ] Type definitions complete and accurate
|
|
- [ ] Linting passes with no errors
|
|
- [ ] TypeScript compilation passes
|
|
|
|
### **Day 2 Success Criteria**
|
|
|
|
- [ ] 0 files importing databaseUtil
|
|
- [ ] All 52 files migrated to PlatformServiceMixin
|
|
- [ ] No runtime errors in migrated components
|
|
- [ ] All tests passing
|
|
- [ ] Performance maintained or improved
|
|
|
|
### **Overall Success Criteria**
|
|
|
|
- [ ] Complete elimination of databaseUtil dependency
|
|
- [ ] PlatformServiceMixin is the single source of truth for database operations
|
|
- [ ] Migration fence is fully implemented
|
|
- [ ] Ready for Phase 3: Cleanup and Optimization
|
|
|
|
---
|
|
|
|
## 🚀 **Post-Migration Benefits**
|
|
|
|
1. **80% reduction** in database boilerplate code
|
|
2. **Centralized caching** for improved performance
|
|
3. **Type-safe** database operations
|
|
4. **Eliminated circular dependencies**
|
|
5. **Simplified testing** with mockable mixin
|
|
6. **Consistent error handling** across all components
|
|
7. **Ready for SQLite-only mode**
|
|
|
|
---
|
|
|
|
## 📝 **Notes & Issues**
|
|
|
|
### **Current Issues**
|
|
|
|
- None identified yet
|
|
|
|
### **Decisions Made**
|
|
|
|
- PlatformServiceMixin approach chosen over USE_DEXIE_DB constant
|
|
- Self-contained utility functions preferred over imports
|
|
- Priority order: Views → Components → Services → Utils
|
|
|
|
### **Lessons Learned**
|
|
|
|
- To be filled as migration progresses
|
|
|
|
---
|
|
|
|
## 🔄 **Daily Updates**
|
|
|
|
### **Day 1 Updates**
|
|
|
|
- [ ] Start time: _____
|
|
- [ ] Phase 1 completion: _____
|
|
- [ ] Phase 2 completion: _____
|
|
- [ ] Phase 3 completion: _____
|
|
- [ ] Phase 4 completion: _____
|
|
- [ ] End time: _____
|
|
|
|
### **Day 2 Updates**
|
|
|
|
- [ ] Start time: _____
|
|
- [ ] Views migration completion: _____
|
|
- [ ] Components migration completion: _____
|
|
- [ ] Services migration completion: _____
|
|
- [ ] Utils migration completion: _____
|
|
- [ ] Final validation completion: _____
|
|
- [ ] End time: _____
|
|
|
|
---
|
|
|
|
## 🆘 **Contingency Plans**
|
|
|
|
### **If Day 1 Takes Longer**
|
|
|
|
- Focus on core functionality first
|
|
- Defer advanced utility functions to Day 2
|
|
- Prioritize circular dependency resolution
|
|
|
|
### **If Day 2 Takes Longer**
|
|
|
|
- Focus on high-impact views first
|
|
- Batch similar components together
|
|
- Use automated scripts for common patterns
|
|
|
|
### **If Issues Arise**
|
|
|
|
- Document specific problems in Notes section
|
|
- Create targeted fixes
|
|
- Maintain backward compatibility during transition
|
|
|
|
---
|
|
|
|
## 🎯 **Notification Best Practices and Nuances**
|
|
|
|
- **All user-facing notification messages must be defined as constants** in `src/constants/notifications.ts`. Do not hardcode notification strings in components.
|
|
- **All notification durations/timeouts must use the `TIMEOUTS` constants** from `src/utils/notify.ts`. Do not hardcode durations.
|
|
- **Notification helpers (`this.notify`) must be initialized as a property in `created()`** using `createNotifyHelpers(this.$notify)`.
|
|
- **Never hardcode notification strings or durations in components.**
|
|
- **When using `notifyWhyCannotConfirm` or similar utilities, pass a wrapper function** if the signature expects a raw notify function (e.g., `(msg, timeout) => this.notify.info(msg.text ?? '', timeout)`).
|
|
- **Declare `$notify` as a property on the class** to satisfy the type checker, since Vue injects it at runtime.
|
|
- **Use type guards or `as any` for unknown notification payloads** when necessary, but prefer type safety where possible.
|
|
|
|
These practices ensure maintainability, consistency, and type safety for all notification-related code during and after migration.
|
|
|
|
---
|
|
|
|
**Last Updated**: $(date)
|
|
**Next Review**: After each phase completion
|