Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz Source: /opt/alga-psa on psa.joliet.tech
13 KiB
/# Email System Refactoring Plan
Intro / Rationale
Executive Summary
The current email system has duplicate implementations and lacks clear separation between system-level emails and tenant-specific business emails. This refactoring will establish a clear architectural pattern that distinguishes between:
- System Emails: Platform-level emails (user registration, password reset, system notifications) using environment variables
- Tenant Emails: Business-specific emails (portal invitations, invoices, project notifications) using database-configured settings
Business and Technical Drivers
- Code Duplication: Two separate EmailService implementations exist with overlapping functionality
- Architectural Confusion: Email verification incorrectly uses TenantEmailService when it should use system settings
- Maintenance Overhead: Scattered email logic makes updates and bug fixes difficult
- Scalability Issues: No clear pattern for adding new email types
Success Criteria
- Single, clear EmailService implementation for system emails using environment variables
- Properly separated TenantEmailService for business emails using database settings
- Email verification and password reset using SystemEmailService
- Portal invitations and business emails continue using TenantEmailService
- Clear documentation and examples for future development
Key Stakeholders
- Development team implementing new email features
- Operations team managing email configuration
- End users receiving system and business emails
Phased Implementation Checklist
Phase 1: System Email Service Consolidation
Goal: Create unified SystemEmailService for all platform-level emails
- Task 1.1: Create new directory structure
- Create
/src/lib/email/system/directory - Create
/src/lib/email/tenant/directory
- Create
- Task 1.2: Consolidate duplicate EmailService implementations
- Analyze differences between
/src/services/emailService.tsand/src/lib/notifications/emailService.ts - Create unified
SystemEmailService.tsin/src/lib/email/system/ - Implement environment variable configuration exclusively
- Add comprehensive logging and error handling
- Analyze differences between
- Task 1.3: Create system email templates
- Move system templates to
/src/lib/email/system/templates/ - Create
emailVerification.tstemplate - Create
passwordReset.tstemplate - Create
systemNotification.tstemplate
- Move system templates to
- Task 1.4: Create system email types
- Create
/src/lib/email/system/types.tswith SystemEmailOptions interface - Define SystemEmailConfig interface
- Export template interfaces
- Create
Dependencies: None
Completion Criteria: SystemEmailService can send emails using environment variables, all system templates are available
Phase 2: Tenant Email Service Migration
Goal: Move and enhance existing TenantEmailService to new structure
- Task 2.1: Move TenantEmailService to new location
- Move
TenantEmailService.tsto/src/lib/email/tenant/ - Move
templateProcessors.tsto/src/lib/email/tenant/ - Update all import paths referencing moved files
- Move
- Task 2.2: Enhance TenantEmailService documentation
- Add comprehensive JSDoc comments explaining tenant email purpose
- Document when to use TenantEmailService vs SystemEmailService
- Add usage examples in code comments
- Task 2.3: Create tenant email types
- Create
/src/lib/email/tenant/types.ts - Move tenant-specific interfaces from existing files
- Ensure clear separation from system email types
- Create
Dependencies: Phase 1 completion
Completion Criteria: TenantEmailService is in new location with enhanced documentation, all imports updated
Phase 3: Email Function Updates
Goal: Update specific email functions to use correct service
- Task 3.1: Update email verification to use SystemEmailService
- Modify
/src/lib/email/sendVerificationEmail.tsto import SystemEmailService - Replace TenantEmailService.sendEmail() call with SystemEmailService
- Update template processor to use system templates
- Test email verification flow works with environment variables
- Modify
- Task 3.2: Ensure password reset uses SystemEmailService
- Locate password reset email functions
- Update to use SystemEmailService instead of any tenant service calls
- Verify password reset templates are in system templates directory
- Task 3.3: Verify portal invitations continue using TenantEmailService
- Confirm
/src/lib/email/sendPortalInvitationEmail.tsuses TenantEmailService - Update import paths to new tenant service location
- Test portal invitation flow still works correctly
- Confirm
Dependencies: Phase 2 completion
Completion Criteria: Email verification and password reset use SystemEmailService, portal invitations use TenantEmailService
Phase 4: Email Service Factory and Integration
Goal: Create centralized factory and update integration points
- Task 4.1: Create email service factory
- Create
/src/lib/email/index.tsas main entry point - Export
getSystemEmailService()function - Export
getTenantEmailService()function - Re-export key types and interfaces
- Create
- Task 4.2: Update application integration points
- Update all files importing old EmailService locations
- Replace direct service instantiation with factory functions
- Update API routes and actions to use correct email service
- Task 4.3: Clean up old implementations
- Remove
/src/services/emailService.tsafter confirming no references - Remove
/src/lib/notifications/emailService.tsafter confirming no references - Remove
/src/utils/email/emailService.tsxif unused
- Remove
Dependencies: Phase 3 completion
Completion Criteria: Single entry point for email services, old implementations removed, all imports updated
Phase 5: Documentation and Guidelines
Goal: Create comprehensive documentation for email system usage
- Task 5.1: Create main email documentation
- Create
/src/lib/email/README.mdwith comprehensive guidelines - Document when to use SystemEmailService vs TenantEmailService
- Provide code examples for common email scenarios
- Create
Dependencies: Phase 4 completion
Completion Criteria: Complete documentation available, clear guidelines for future development
Background Details / Investigation / Implementation Advice
Current System Analysis
Duplicate EmailService Implementations
Two separate EmailService classes exist:
-
/src/services/emailService.ts:- Uses both environment variables and database templates
- Includes invoice email functionality
- Has comprehensive logging and error handling
- Contains template fallback logic
-
/src/lib/notifications/emailService.ts:- Uses environment variables exclusively
- Includes Handlebars template compilation
- Simpler implementation focused on notifications
Key Issues Identified
- Email verification uses TenantEmailService but should use system settings
- Template storage is inconsistent (hardcoded vs database)
- No clear naming convention to distinguish email types
- Import paths are scattered across different directories
Technical Implementation Guidelines
SystemEmailService Requirements
- Configuration: Environment variables only (EMAIL_HOST, EMAIL_PORT, EMAIL_USERNAME, EMAIL_PASSWORD, EMAIL_FROM)
- Templates: Static templates in code or system template table
- Use Cases: User registration, password reset, system alerts, platform notifications
- Initialization: Singleton pattern with lazy initialization
- Error Handling: Comprehensive logging with diagnostic information
TenantEmailService Requirements
- Configuration: Database-stored tenant email settings
- Templates: Database templates with tenant-specific customization
- Use Cases: Portal invitations, invoices, project notifications, business communications
- Provider Support: Multiple email provider configurations per tenant
- Template Processing: Support for complex template data and variables
Directory Structure Implementation
/src/lib/email/
├── index.ts # Main factory and exports
├── README.md # Comprehensive documentation
├── system/
│ ├── SystemEmailService.ts # Environment-based email service
│ ├── templates/
│ │ ├── emailVerification.ts
│ │ ├── passwordReset.ts
│ │ └── systemNotification.ts
│ └── types.ts # System email interfaces
└── tenant/
├── TenantEmailService.ts # Database-based email service
├── templateProcessors.ts # Template processing logic
└── types.ts # Tenant email interfaces
Migration Strategy
- Preserve Functionality: Ensure zero downtime during migration
- Gradual Transition: Update services one at a time with testing
- Import Path Updates: Use find-replace to update import statements systematically
- Template Migration: Move templates without changing their content initially
Testing Approach
- Test system emails with environment variable configuration
- Test tenant emails with database configuration
- Verify email verification flow uses system service
- Verify portal invitations use tenant service
- Test error handling for missing configuration
Potential Pitfalls and Solutions
Pitfall: Breaking existing email functionality during migration
Solution: Update one service at a time, maintain parallel implementations during transition
Pitfall: Template references breaking after file moves
Solution: Update all import paths in single atomic operation, use IDE refactoring tools
Pitfall: Configuration conflicts between system and tenant emails
Solution: Clearly separate configuration sources, add validation for each service type
Pitfall: Missing error handling in new implementations
Solution: Copy comprehensive error handling from existing services, add diagnostic logging
Code Examples
SystemEmailService Usage
import { getSystemEmailService } from '@/lib/email';
const emailService = await getSystemEmailService();
await emailService.sendVerificationEmail({
to: 'user@example.com',
templateData: { verificationUrl: 'https://...' }
});
TenantEmailService Usage
import { getTenantEmailService } from '@/lib/email';
const result = await TenantEmailService.sendEmail({
tenantId: 'tenant-123',
to: 'client@company.com',
templateProcessor: new DatabaseTemplateProcessor(knex, 'portal-invitation'),
templateData: { portalLink: 'https://...' }
});
Resources and References
- Current TenantEmailService implementation:
/src/lib/services/TenantEmailService.ts - Email provider management:
/src/services/email/EmailProviderManager.ts - Template processing:
/src/lib/services/email/templateProcessors.ts - Email types:
/src/types/email.types.ts
Implementer's Scratch Pad
Progress Tracking
- Phase 1 started: ___________
- Phase 1 completed: ___________
- Phase 2 started: ___________
- Phase 2 completed: ___________
- Phase 3 started: ___________
- Phase 3 completed: ___________
- Phase 4 started: ___________
- Phase 4 completed: ___________
- Phase 5 started: ___________
- Phase 5 completed: ___________
Implementation Notes
Phase 1 Notes:
- SystemEmailService consolidation status:
- Template migration status:
- Environment variable testing:
Phase 2 Notes:
- TenantEmailService move status:
- Import path updates:
- Documentation additions:
Phase 3 Notes:
- Email verification update status:
- Password reset verification:
- Portal invitation testing:
Phase 4 Notes:
- Factory implementation:
- Integration point updates:
- Cleanup completion:
Phase 5 Notes:
- Documentation completeness:
- Example code validation:
- Final review status:
Issues Encountered and Resolutions
Issue 1: [Description]
Resolution: [How resolved]
Impact: [Impact on timeline/scope]
Issue 2: [Description]
Resolution: [How resolved]
Impact: [Impact on timeline/scope]
Deviations From Original Plan
Deviation 1: [What changed]
Reason: [Why it changed]
Approval: [Who approved change]
Deviation 2: [What changed]
Reason: [Why it changed]
Approval: [Who approved change]
Performance Metrics and Test Results
Email Verification Tests:
- System service configuration: [PASS/FAIL]
- Template rendering: [PASS/FAIL]
- Email delivery: [PASS/FAIL]
Portal Invitation Tests:
- Tenant service configuration: [PASS/FAIL]
- Database template retrieval: [PASS/FAIL]
- Email delivery: [PASS/FAIL]
Integration Tests:
- Import path updates: [PASS/FAIL]
- Service factory: [PASS/FAIL]
- Error handling: [PASS/FAIL]
Questions for Review
1. [Question about implementation approach]
2. [Question about configuration]
3. [Question about testing strategy]