Aller au contenu principal

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 model
  • BaldrTs/src/interfaces/user.interface.ts - TypeScript interface for User
  • BaldrTs/src/controllers/user.controller.ts - CRUD operations for users
  • BaldrTs/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 via user_id
  • BaldrTs/src/interfaces/protectionUser.interface.ts - Updated interface with user_id
  • BaldrTs/src/controllers/protectionUser.controller.ts - Updated to create/manage User records
  • BaldrTs/src/middlewares/protection.middleware.ts - Updated to populate User data

Changes:

  • Removed: email, password fields
  • Added: user_id reference to User model
  • Login now updates last_login in User model
  • All operations populate user data

3. Backend - Updated Newsletter Subscribers

Files Modified:

  • BaldrTs/src/models/newsletterSubscribers.model.ts - Now references User via user_id
  • BaldrTs/src/interfaces/newsletterSubscribers.interface.ts - Updated interface with user_id
  • BaldrTs/src/controllers/newsletterSubscribers.controller.ts - Auto creates/finds Users
  • BaldrTs/src/services/crons/newsletter.cron.ts - Populates user data for emails

Changes:

  • Removed: email, firstName, lastName fields
  • Added: user_id reference 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 script
  • BaldrTs/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 routes
  • BaldrTs/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 - Now IProtectionUser with user_id
  • Baldr-Bo/app/interfaces/newsletterSubscribers.interface.ts - Updated with user_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 populated user_id data
  • /newsletter/subscribers/* - Now includes populated user_id data

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

  1. Backup Database

    mongodump --uri="mongodb://..." --out=backup
  2. Deploy Backend Updates

    cd BaldrTs
    npm install
    npm run build
  3. Run Migration

    npm run migrate:users
  4. Verify Results

    • Check Users collection created
    • Check user_id fields populated
    • Test API endpoints
  5. 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

  1. Review this implementation
  2. Test on development environment
  3. Run migration on staging database
  4. Monitor for issues
  5. Deploy to production
  6. Update frontend to use new structure
  7. Remove backward compatibility code after full migration