User Model Migration - Implementation Summary
Completed Tasks ✅
1. Backend - New User Model
Files Created:
BaldrTs/src/models/user.model.ts- MongoDB schema for unified User modelBaldrTs/src/interfaces/user.interface.ts- TypeScript interface for UserBaldrTs/src/controllers/user.controller.ts- CRUD operations for usersBaldrTs/src/routes/user.route.ts- API routes for user management
Features:
- Email unique index
- Optional password (hashed with bcrypt)
- Optional firstName/lastName
- Last login tracking
- Full CRUD operations
2. Backend - Updated Protection Users
Files Modified:
BaldrTs/src/models/protectionUser.model.ts- Now references User viauser_idBaldrTs/src/interfaces/protectionUser.interface.ts- Updated interface withuser_idBaldrTs/src/controllers/protectionUser.controller.ts- Updated to create/manage User recordsBaldrTs/src/middlewares/protection.middleware.ts- Updated to populate User data
Changes:
- Removed:
email,passwordfields - Added:
user_idreference to User model - Login now updates
last_loginin User model - All operations populate user data
3. Backend - Updated Newsletter Subscribers
Files Modified:
BaldrTs/src/models/newsletterSubscribers.model.ts- Now references User viauser_idBaldrTs/src/interfaces/newsletterSubscribers.interface.ts- Updated interface withuser_idBaldrTs/src/controllers/newsletterSubscribers.controller.ts- Auto creates/finds UsersBaldrTs/src/services/crons/newsletter.cron.ts- Populates user data for emails
Changes:
- Removed:
email,firstName,lastNamefields - Added:
user_idreference to User model - Create operation finds or creates User
- Unsubscribe looks up User by email
4. Backend - Migration Script
Files Created:
BaldrTs/src/scripts/migrateToUserModel.ts- Automated migration scriptBaldrTs/documents/USER_MODEL_MIGRATION.md- Complete migration guide
Features:
- Migrates existing ProtectionUser data to User model
- Migrates existing NewsletterSubscriber data to User model
- Merges duplicate emails
- Updates all references
- Comprehensive error handling and logging
- Run with:
npm run migrate:users
5. Backend - Router Updates
Files Modified:
BaldrTs/src/routes/router.ts- Added user routesBaldrTs/package.json- Added migration script command
6. Frontend - Updated Interfaces
Files Created:
Baldr-Bo/app/interfaces/baseUser.interface.ts- Base user interface
Files Modified:
Baldr-Bo/app/interfaces/user.interface.ts- NowIProtectionUserwithuser_idBaldr-Bo/app/interfaces/newsletterSubscribers.interface.ts- Updated withuser_id
API Endpoints
New User Endpoints
POST /user - Get all users (paginated)
POST /user/search - Search users by email/name
GET /user/:id - Get user by ID
GET /user/email/:email - Get user by email
POST /user/new - Create new user
PUT /user/edit/:id - Update user (requires auth)
DELETE /user/delete - Delete users (requires auth)
PUT /user/last-login/:id - Update last login timestamp
Modified Endpoints
All existing endpoints continue to work but now return populated user data:
/protection/user/*- Now includes populateduser_iddata/newsletter/subscribers/*- Now includes populateduser_iddata
Database Schema Changes
New Collection: users
{
_id: ObjectId,
email: String (unique),
firstName: String (optional),
lastName: String (optional),
password: String (optional, hashed),
last_login: Date (optional),
createdAt: Date,
updatedAt: Date
}
Updated Collection: protectionusers
{
_id: ObjectId,
user_id: ObjectId (ref: 'User'), // NEW
userName: String (unique),
slug: String,
groups: [ObjectId],
module_id: ObjectId (optional),
active: Boolean,
// REMOVED: email, password
}
Updated Collection: newslettersubscribers
{
_id: ObjectId,
user_id: ObjectId (ref: 'User'), // NEW
groups: [ObjectId],
active: Boolean,
// REMOVED: email, firstName, lastName
}
Migration Workflow
-
Backup Database
mongodump --uri="mongodb://..." --out=backup -
Deploy Backend Updates
cd BaldrTs
npm install
npm run build -
Run Migration
npm run migrate:users -
Verify Results
- Check Users collection created
- Check user_id fields populated
- Test API endpoints
-
Update Frontend
- Update API calls to handle populated user data
- Update UI to display user information correctly
Key Benefits
✅ Single Source of Truth - User data in one place ✅ No Data Duplication - Email/names stored once ✅ Better Data Integrity - Enforced relationships ✅ Easier Maintenance - Update user info in one place ✅ Password Security - Consistent hashing, optional passwords ✅ Login Tracking - Last login timestamp for all users ✅ Future-Proof - Easy to add new user-related features
Testing Checklist
- Run migration script on test database
- Verify User records created correctly
- Test protection user login
- Test newsletter subscriber creation
- Test newsletter subscriber unsubscribe
- Test newsletter email sending (cron)
- Test user search functionality
- Test user update operations
- Verify frontend displays populated user data
- Check all TypeScript compilation passes
- Run backend tests
- Test rollback procedure
Notes
- Migration is idempotent - can be run multiple times safely
- Existing functionality is backward compatible during transition
- Password remains optional in User model (for newsletter-only users)
- Email is unique across all users
- Frontend interfaces use type-only imports for proper module syntax
Files Changed Summary
Backend (BaldrTs):
- 3 new models/interfaces
- 1 new controller
- 1 new route
- 4 modified controllers
- 3 modified models
- 3 modified interfaces
- 1 modified middleware
- 1 modified service (cron)
- 1 modified router
- 1 migration script
- 1 documentation file
Frontend (Baldr-Bo):
- 1 new interface
- 2 modified interfaces
Total: 22 files
Next Steps
- Review this implementation
- Test on development environment
- Run migration on staging database
- Monitor for issues
- Deploy to production
- Update frontend to use new structure
- Remove backward compatibility code after full migration