Browse Source
- Replaced all databaseUtil and direct PlatformServiceFactory usage with PlatformServiceMixin methods - Removed all raw SQL queries from the component - Centralized all notification messages in src/constants/notifications.ts - Replaced direct $notify calls with notification helpers and TIMEOUTS constants - Streamlined template logic (tab classes via computed properties) - Updated migration documentation and security audit - Ran lint-fix; no errors remain Ready for human testing and validation.web-serve-fix
4 changed files with 263 additions and 55 deletions
@ -0,0 +1,211 @@ |
|||||
|
# DiscoverView.vue Migration Documentation |
||||
|
|
||||
|
**Migration Start**: 2025-07-08 12:11 UTC |
||||
|
**Component**: DiscoverView.vue |
||||
|
**Priority**: High (Critical User Journey) |
||||
|
**Location**: `src/views/DiscoverView.vue` |
||||
|
|
||||
|
## Pre-Migration Analysis |
||||
|
|
||||
|
### 🔍 **Current State Assessment** |
||||
|
|
||||
|
#### Database Operations |
||||
|
- **Legacy Pattern**: Uses `databaseUtil.retrieveSettingsForActiveAccount()` (line 396) |
||||
|
- **Legacy Pattern**: Uses `databaseUtil.mapQueryResultToValues()` (line 405) |
||||
|
- **Direct PlatformService**: Uses `PlatformServiceFactory.getInstance()` (line 403) |
||||
|
- **Raw SQL**: Uses `"SELECT * FROM contacts"` (line 404) |
||||
|
|
||||
|
#### Notification Usage |
||||
|
- **Direct $notify Calls**: 3 instances found (lines 515, 607, 758) |
||||
|
- **Notification Types**: danger, warning, success |
||||
|
- **Messages**: Error handling, search results, loading status |
||||
|
|
||||
|
#### Template Complexity |
||||
|
- **Conditional Rendering**: Multiple v-if/v-else conditions for tabs |
||||
|
- **Dynamic Content**: Complex search results and map integration |
||||
|
- **User Interactions**: Search functionality, map interactions, infinite scroll |
||||
|
|
||||
|
### 📊 **Migration Complexity Assessment** |
||||
|
- **Database Migration**: Medium (2 database operations) |
||||
|
- **SQL Abstraction**: Low (1 raw SQL query) |
||||
|
- **Notification Migration**: Medium (3 notifications) |
||||
|
- **Template Streamlining**: High (complex conditionals and interactions) |
||||
|
|
||||
|
### 🎯 **Migration Goals** |
||||
|
1. Replace `databaseUtil` calls with PlatformServiceMixin methods |
||||
|
2. Abstract raw SQL with service methods |
||||
|
3. Extract all notification messages to constants |
||||
|
4. Replace `$notify()` calls with helper methods |
||||
|
5. Streamline template with computed properties |
||||
|
|
||||
|
## Migration Plan |
||||
|
|
||||
|
### **Phase 1: Database Migration** |
||||
|
```typescript |
||||
|
// Replace databaseUtil.retrieveSettingsForActiveAccount() |
||||
|
const settings = await this.$accountSettings(); |
||||
|
|
||||
|
// Replace PlatformServiceFactory.getInstance() + raw SQL |
||||
|
const allContacts = await this.$getAllContacts(); |
||||
|
|
||||
|
// Replace databaseUtil.mapQueryResultToValues() |
||||
|
// This will be handled by the service method above |
||||
|
``` |
||||
|
|
||||
|
### **Phase 2: Notification Migration** |
||||
|
```typescript |
||||
|
// Extract to constants |
||||
|
NOTIFY_DISCOVER_SEARCH_ERROR |
||||
|
NOTIFY_DISCOVER_LOCAL_SEARCH_ERROR |
||||
|
NOTIFY_DISCOVER_MAP_SEARCH_ERROR |
||||
|
|
||||
|
// Replace direct $notify calls with helper methods |
||||
|
this.notify.error(NOTIFY_DISCOVER_SEARCH_ERROR.message, TIMEOUTS.LONG); |
||||
|
``` |
||||
|
|
||||
|
### **Phase 3: Template Streamlining** |
||||
|
```typescript |
||||
|
// Extract complex conditional classes to computed properties |
||||
|
computedProjectsTabStyleClassNames() |
||||
|
computedPeopleTabStyleClassNames() |
||||
|
computedLocalTabStyleClassNames() |
||||
|
computedMappedTabStyleClassNames() |
||||
|
computedRemoteTabStyleClassNames() |
||||
|
``` |
||||
|
|
||||
|
## Migration Implementation |
||||
|
|
||||
|
### **Step 1: Add PlatformServiceMixin** |
||||
|
```typescript |
||||
|
import { PlatformServiceMixin } from "@/utils/PlatformServiceMixin"; |
||||
|
|
||||
|
@Component({ |
||||
|
components: { |
||||
|
// ... existing components |
||||
|
}, |
||||
|
mixins: [PlatformServiceMixin], |
||||
|
}) |
||||
|
``` |
||||
|
|
||||
|
### **Step 2: Add Notification Infrastructure** |
||||
|
```typescript |
||||
|
import { createNotifyHelpers, TIMEOUTS } from "@/utils/notify"; |
||||
|
import { |
||||
|
NOTIFY_DISCOVER_SEARCH_ERROR, |
||||
|
NOTIFY_DISCOVER_LOCAL_SEARCH_ERROR, |
||||
|
NOTIFY_DISCOVER_MAP_SEARCH_ERROR, |
||||
|
} from "@/constants/notifications"; |
||||
|
|
||||
|
// Add property |
||||
|
notify!: ReturnType<typeof createNotifyHelpers>; |
||||
|
|
||||
|
// Initialize in created() |
||||
|
created() { |
||||
|
this.notify = createNotifyHelpers(this.$notify); |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
### **Step 3: Replace Database Operations** |
||||
|
```typescript |
||||
|
// In mounted() method |
||||
|
const settings = await this.$accountSettings(); |
||||
|
this.allContacts = await this.$getAllContacts(); |
||||
|
``` |
||||
|
|
||||
|
### **Step 4: Replace Notification Calls** |
||||
|
```typescript |
||||
|
// Replace error notifications |
||||
|
this.notify.error(NOTIFY_DISCOVER_SEARCH_ERROR.message, TIMEOUTS.LONG); |
||||
|
this.notify.error(NOTIFY_DISCOVER_LOCAL_SEARCH_ERROR.message, TIMEOUTS.LONG); |
||||
|
this.notify.error(NOTIFY_DISCOVER_MAP_SEARCH_ERROR.message, TIMEOUTS.LONG); |
||||
|
``` |
||||
|
|
||||
|
## Expected Outcomes |
||||
|
|
||||
|
### **Technical Improvements** |
||||
|
- ✅ All database operations use PlatformServiceMixin |
||||
|
- ✅ No raw SQL queries in component |
||||
|
- ✅ All notifications use helper methods and constants |
||||
|
- ✅ Template logic streamlined with computed properties |
||||
|
- ✅ Consistent error handling patterns |
||||
|
|
||||
|
### **Functional Preservation** |
||||
|
- ✅ Search functionality (local, mapped, anywhere) preserved |
||||
|
- ✅ Map integration and tile loading preserved |
||||
|
- ✅ Infinite scroll functionality preserved |
||||
|
- ✅ Tab switching and state management preserved |
||||
|
- ✅ Error handling and user feedback preserved |
||||
|
|
||||
|
### **Performance Improvements** |
||||
|
- ✅ Reduced database query complexity |
||||
|
- ✅ Standardized notification patterns |
||||
|
- ✅ Optimized template rendering |
||||
|
- ✅ Better error handling efficiency |
||||
|
|
||||
|
## Testing Requirements |
||||
|
|
||||
|
### **Functional Testing** |
||||
|
- [ ] Search functionality works for all tabs (Projects, People) |
||||
|
- [ ] Local search with location selection works |
||||
|
- [ ] Mapped search with map integration works |
||||
|
- [ ] Anywhere search with infinite scroll works |
||||
|
- [ ] Error handling displays appropriate notifications |
||||
|
- [ ] Tab switching preserves state correctly |
||||
|
|
||||
|
### **Cross-Platform Testing** |
||||
|
- [ ] Web browser functionality |
||||
|
- [ ] Mobile app functionality (Capacitor) |
||||
|
- [ ] Desktop app functionality (Electron) |
||||
|
- [ ] PWA functionality |
||||
|
|
||||
|
### **Error Scenario Testing** |
||||
|
- [ ] Network connectivity issues |
||||
|
- [ ] Invalid search parameters |
||||
|
- [ ] Empty search results |
||||
|
- [ ] Map loading failures |
||||
|
- [ ] Database connection issues |
||||
|
|
||||
|
## Security Audit Checklist |
||||
|
|
||||
|
### **SQL Injection Prevention** |
||||
|
- [ ] No raw SQL queries in component |
||||
|
- [ ] All database operations use parameterized queries |
||||
|
- [ ] Input validation for search terms |
||||
|
- [ ] Proper error handling without information disclosure |
||||
|
|
||||
|
### **Data Privacy** |
||||
|
- [ ] User search terms properly sanitized |
||||
|
- [ ] Location data handled securely |
||||
|
- [ ] Contact information access controlled |
||||
|
- [ ] No sensitive data in error messages |
||||
|
|
||||
|
### **Input Validation** |
||||
|
- [ ] Search terms validated and sanitized |
||||
|
- [ ] Map coordinates validated |
||||
|
- [ ] URL parameters properly handled |
||||
|
- [ ] File uploads (if any) validated |
||||
|
|
||||
|
## Migration Timeline |
||||
|
|
||||
|
### **Estimated Duration**: 25-35 minutes |
||||
|
- **Phase 1 (Database)**: 8-10 minutes |
||||
|
- **Phase 2 (SQL)**: 3-5 minutes |
||||
|
- **Phase 3 (Notifications)**: 8-10 minutes |
||||
|
- **Phase 4 (Template)**: 6-10 minutes |
||||
|
|
||||
|
### **Risk Assessment** |
||||
|
- **Functionality Risk**: Low (search is well-contained) |
||||
|
- **Data Risk**: Low (read-only operations) |
||||
|
- **User Impact**: Low (feature is secondary to main workflow) |
||||
|
|
||||
|
### **Dependencies** |
||||
|
- PlatformServiceMixin availability |
||||
|
- Notification constants in place |
||||
|
- Map component integration preserved |
||||
|
- Search API endpoints accessible |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
**Author**: Matthew Raymer |
||||
|
**Date**: 2025-07-08 |
||||
|
**Purpose**: Document DiscoverView.vue migration to Enhanced Triple Migration Pattern |
Loading…
Reference in new issue