'use strict'; /** @type {import('sequelize-cli').Migration} */ module.exports = { async up(queryInterface, Sequelize) { await queryInterface.createTable('users', { id: { type: Sequelize.CHAR(36), primaryKey: true, allowNull: false, defaultValue: Sequelize.UUIDV4, comment: 'UUID primary key' }, username: { type: Sequelize.STRING(50), allowNull: false, unique: true, comment: 'Unique username' }, email: { type: Sequelize.STRING(100), allowNull: false, unique: true, comment: 'User email address' }, password: { type: Sequelize.STRING(255), allowNull: false, comment: 'Hashed password' }, role: { type: Sequelize.ENUM('admin', 'user'), allowNull: false, defaultValue: 'user', comment: 'User role' }, profile_image: { type: Sequelize.STRING(255), allowNull: true, comment: 'Profile image URL' }, is_active: { type: Sequelize.BOOLEAN, allowNull: false, defaultValue: true, comment: 'Account active status' }, // Statistics total_quizzes: { type: Sequelize.INTEGER, allowNull: false, defaultValue: 0, comment: 'Total number of quizzes taken' }, quizzes_passed: { type: Sequelize.INTEGER, allowNull: false, defaultValue: 0, comment: 'Number of quizzes passed' }, total_questions_answered: { type: Sequelize.INTEGER, allowNull: false, defaultValue: 0, comment: 'Total questions answered' }, correct_answers: { type: Sequelize.INTEGER, allowNull: false, defaultValue: 0, comment: 'Number of correct answers' }, current_streak: { type: Sequelize.INTEGER, allowNull: false, defaultValue: 0, comment: 'Current daily streak' }, longest_streak: { type: Sequelize.INTEGER, allowNull: false, defaultValue: 0, comment: 'Longest daily streak achieved' }, // Timestamps last_login: { type: Sequelize.DATE, allowNull: true, comment: 'Last login timestamp' }, last_quiz_date: { type: Sequelize.DATE, allowNull: true, comment: 'Date of last quiz taken' }, created_at: { type: Sequelize.DATE, allowNull: false, defaultValue: Sequelize.literal('CURRENT_TIMESTAMP') }, updated_at: { type: Sequelize.DATE, allowNull: false, defaultValue: Sequelize.literal('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP') } }, { charset: 'utf8mb4', collate: 'utf8mb4_unicode_ci' }); // Add indexes await queryInterface.addIndex('users', ['email'], { name: 'idx_users_email', unique: true }); await queryInterface.addIndex('users', ['username'], { name: 'idx_users_username', unique: true }); await queryInterface.addIndex('users', ['role'], { name: 'idx_users_role' }); await queryInterface.addIndex('users', ['is_active'], { name: 'idx_users_is_active' }); await queryInterface.addIndex('users', ['created_at'], { name: 'idx_users_created_at' }); console.log('✅ Users table created successfully with indexes'); }, async down(queryInterface, Sequelize) { await queryInterface.dropTable('users'); console.log('✅ Users table dropped successfully'); } };