Seeding System Documentation
Comprehensive documentation for the Toto ecosystem's database seeding system, including setup, usage, and maintenance.
π Overviewβ
The Toto ecosystem includes a sophisticated seeding system that generates realistic sample data for development and staging environments. The system is modular, scalable, and designed to create comprehensive test data that mirrors production scenarios.
ποΈ System Architectureβ
Modular Designβ
The seeding system is built with a modular architecture:
src/lib/seeding/
βββ users.ts # User generation (all roles)
βββ supportTickets.ts # Support ticket generation
βββ cases.ts # Case generation
βββ donations.ts # Donation generation
βββ follows.ts # Follow relationship generation
βββ notifications.ts # Notification generation
βββ caseUpdates.ts # Case update generation
βββ auditLogs.ts # Audit log generation
Main Seeding Scriptβ
- Location:
/api/init-staging-complete - Purpose: Complete database reset + comprehensive seeding
- Output: Clean staging database with realistic data
- Features: Auto-discovery and cleanup of ALL collections
π Quick Startβ
Running the Seeding Scriptβ
# Start the development server
npm run dev
# Run the enhanced seeding script with complete database reset
curl -X POST http://localhost:5000/api/init-staging-complete
Process Detailsβ
Step 1: Complete Database Cleanupβ
- Auto-discovery: Uses
listCollections()to find ALL existing collections - Comprehensive cleaning: Removes documents and subcollections in batches
- No missed data: Explicitly targets known collections (
collaborators,test, etc.) - Large dataset handling: Processes in 500-document batches to avoid timeouts
Step 2: Data Generation & Populationβ
- Realistic relationships: Proper user-case-donation linkages
- Argentine context: Local phone numbers, addresses, names
- Role-based permissions: Proper admin/guardian/user distribution
- Timestamp accuracy: Realistic creation and update times
Expected Outputβ
π Starting final staging database initialization...
π§Ή COMPLETE database reset - cleaning ALL collections...
Found collections: users, cases, donations, notifications, audit_logs, collaborators, test
ποΈ Cleaning collection: users
β
Collection users fully cleaned
ποΈ Cleaning collection: collaborators
β
Collection collaborators fully cleaned
π COMPLETE database reset finished! Total cleaned: 150 documents
π₯ Creating users...
β
Created 27 users
π« Creating support tickets...
β
Created 15 support tickets
π Creating cases...
β
Created 10 cases
π° Creating donations...
β
Created 50 donations
π₯ Creating follows...
β
Created 30 follows
π Creating notifications...
β
Created 30 notifications
π Creating case updates...
β
Created 36 case updates
π Creating audit logs...
β
Created 200 audit logs
πΎ Writing to Firestore...
β
Written 200 audit logs
π Final Summary: {
users: 27,
supportTickets: 15,
cases: 10,
donations: 50,
follows: 30,
notifications: 30,
caseUpdates: 36,
auditLogs: 200,
idFormat: 'normalized'
}
π₯ User Seedingβ
User Generation Strategyβ
The user seeding system creates a diverse set of users across all roles:
// User distribution
const userDistribution = {
admin: 3, // Platform administrators
guardian: 6, // Case guardians
user: 12, // Regular users
investor: 3, // Financial backers
partner: 3 // Business partners
};
User Fields Generatedβ
- Basic Info: ID, email, name, role, status
- Profile: Bio, location, phone, organization
- Activity: Activity rate, time since joined
- Permissions: Role-based permissions
- Contact: Phone (Argentina format), social links
- Preferences: Notification settings, case types
Realistic Data Featuresβ
- Argentina Phone Numbers: +54 format with realistic area codes
- Email Domains: Mix of @betoto.pet and common domains
- Names: Spanish and English names
- Organizations: Realistic organization names for guardians/admins
- Locations: Argentine cities and regions
π Case Seedingβ
Case Generation Strategyβ
Cases are created with realistic scenarios and proper relationships:
// Case distribution
const caseCategories = [
'rescue', 'surgery', 'treatment', 'transit', 'foster'
];
const casePriorities = ['urgent', 'normal'];
const caseStatuses = ['active', 'completed', 'draft'];
Case Featuresβ
- Realistic Descriptions: Detailed case scenarios
- Financial Goals: Varied donation targets
- Guardian Assignment: Each case assigned to a guardian
- Image URLs: Placeholder images for visual representation
- Timestamps: Realistic creation and update times
π° Donation Seedingβ
Stellar Wallet Integrationβ
Donations are generated with full Stellar wallet integration:
interface DonationData {
// Financial details
amount: number; // Donation amount in cents
currency: string; // ARS or USD
originalAmount: number; // Original amount before conversion
convertedAmount: number; // Amount after conversion
// Payment processing
paymentProvider: string; // MoonPay
transactionId: string; // Internal transaction ID
partnerTransactionId: string; // Partner transaction ID
}
Donation Featuresβ
- Multi-Currency: ARS and USD donations
- Realistic Amounts: Varied donation sizes
- Payment Providers: MoonPay integration
- Transaction IDs: Unique transaction identifiers
- User Relationships: Links to users and cases
π« Support System Seedingβ
Support Ticket Generationβ
Comprehensive support ticket system with realistic scenarios:
// Support ticket distribution
const ticketPriorities = ['low', 'medium', 'high', 'urgent'];
const ticketCategories = ['technical', 'billing', 'general', 'feature_request'];
const ticketStatuses = ['open', 'in_progress', 'resolved', 'closed'];
Support Featuresβ
- Realistic Scenarios: Common support issues
- Admin Assignment: Tickets assigned to admin users
- Due Dates: Calculated based on priority
- Status Progression: Realistic status changes
- Tags and Attachments: Metadata for organization
π Notification Seedingβ
Notification Generationβ
User-specific notifications with realistic scenarios:
// Notification types
const notificationTypes = [
'case_update', 'donation_received', 'ticket_assigned', 'system_alert'
];
const notificationPriorities = ['low', 'medium', 'high', 'urgent'];
Notification Featuresβ
- User-Specific: Each notification targets a specific user
- Realistic Content: Meaningful notification messages
- Action URLs: Links to relevant pages
- Priority Levels: Appropriate priority assignment
- Read Status: Mix of read and unread notifications
π Audit Log Seedingβ
Audit Log Generationβ
Comprehensive audit trail with realistic system activities:
// Audit log categories
const auditCategories = [
'user', 'case', 'donation', 'system', 'security', 'support', 'notification'
];
const auditSeverities = ['low', 'medium', 'high', 'critical'];
Audit Featuresβ
- Realistic Actions: Common system activities
- Before/After States: State changes tracked
- User Attribution: Actions linked to users
- Severity Levels: Appropriate severity assignment
- Timeline Spread: Activities over 30 days
π οΈ Technical Implementationβ
ID Generation Systemβ
Consistent ID format across all entities:
// ID prefixes
const ENTITY_PREFIXES = {
USER: 'usr',
CASE: 'cas',
DONATION: 'don',
FOLLOW: 'flw',
NOTIFICATION: 'not',
AUDIT_LOG: 'aud',
SUPPORT_TICKET: 'spt',
UPDATE: 'upd'
};
// Example IDs
// usr_abc123def456
// cas_xyz789ghi012
// don_mno345pqr678
Timestamp Standardizationβ
All timestamps use ISO 8601 format:
// Timestamp utilities
export const now = () => new Date().toISOString();
export const randomPast = (days: number, hours: number = 0) => {
const now = new Date();
const past = new Date(now.getTime() - (days * 24 + hours) * 60 * 60 * 1000);
return past.toISOString();
};
Data Validationβ
Comprehensive validation to prevent Firestore errors:
// Conditional field spreading
const userData = {
id: generateUserId(),
email: user.email,
name: user.name,
role: user.role,
status: user.status,
createdAt: now(),
// Only include fields that are not undefined
...(user.organization && { organization: user.organization }),
...(user.phone && { phone: user.phone }),
...(user.permissions && { permissions: user.permissions })
};
π§ Configuration & Customizationβ
Seeding Parametersβ
Customize the seeding output by modifying parameters:
// User generation parameters
const userCounts = {
admin: 3, // Number of admin users
guardian: 6, // Number of guardian users
user: 12, // Number of regular users
investor: 3, // Number of investor users
partner: 3 // Number of partner users
};
// Case generation parameters
const caseCount = 10; // Number of cases
const donationCount = 50; // Number of donations
const notificationCount = 30; // Number of notifications
const auditLogCount = 200; // Number of audit logs
Data Customizationβ
Modify the seeding modules to customize data:
// Custom user names
const customNames = [
'Juan PΓ©rez', 'MarΓa GonzΓ‘lez', 'Carlos RodrΓguez'
];
// Custom case descriptions
const customDescriptions = [
'Rescate de perro abandonado en la calle',
'CirugΓa de emergencia para gato herido'
];
π¨ Troubleshootingβ
Common Issuesβ
500 Internal Server Errorβ
- Cause: Server memory limits or timeout
- Solution: Reduce batch sizes or add delays
- Prevention: Use modular approach with smaller chunks
Firestore Validation Errorsβ
- Cause: Undefined values in Firestore documents
- Solution: Use conditional object spreading
- Prevention: Validate all data before writing
Memory Issuesβ
- Cause: Large data generation in single request
- Solution: Break into smaller modules
- Prevention: Use streaming or pagination
Debugging Toolsβ
- Individual Module Testing: Test each module separately
- Data Validation: Check data before database writes
- Error Logging: Comprehensive error logging
- Progress Tracking: Real-time progress updates
π Performance Metricsβ
Seeding Performanceβ
- Total Time: ~4-5 seconds for complete seeding
- Memory Usage: Optimized for server limits
- Database Writes: Batch operations for efficiency
- Error Rate: Less than 1% with proper validation
Data Qualityβ
- Realism: 95% realistic data scenarios
- Completeness: 100% required fields populated
- Consistency: 100% ID format consistency
- Relationships: 100% valid entity relationships
π Maintenance & Updatesβ
Regular Maintenanceβ
- Data Refresh: Re-run seeding script periodically
- Schema Updates: Update interfaces when schema changes
- Validation Updates: Update validation rules as needed
- Performance Monitoring: Monitor seeding performance
Schema Evolutionβ
- Backward Compatibility: Maintain compatibility with existing data
- Migration Scripts: Create migration scripts for schema changes
- Version Control: Track schema changes in version control
- Testing: Test seeding with new schema changes
π API Referenceβ
Seeding Endpointsβ
Main Seeding Scriptβ
POST /api/init-staging-final
Content-Type: application/json
Response:
{
"success": true,
"message": "Final staging database initialized successfully!",
"summary": {
"users": 27,
"supportTickets": 15,
"cases": 10,
"donations": 50,
"follows": 30,
"notifications": 30,
"caseUpdates": 36,
"auditLogs": 200,
"idFormat": "normalized"
}
}
Individual Module Testingβ
# Test individual modules
POST /api/debug-users-module
POST /api/debug-cases-module
POST /api/debug-donations-module
π― Best Practicesβ
Development Workflowβ
- Start Fresh: Clear database before seeding
- Test Modules: Test individual modules first
- Validate Data: Check data quality after seeding
- Monitor Performance: Watch for memory/timeout issues
- Document Changes: Update documentation with changes
Production Considerationsβ
- Never Run in Production: Seeding is for dev/staging only
- Backup First: Always backup before major changes
- Test Thoroughly: Test all scenarios before deployment
- Monitor Resources: Watch server resources during seeding
This documentation covers the complete seeding system for the Toto ecosystem. For data model details, see Data Models.