'use strict'; /** @type {import('sequelize-cli').Migration} */ module.exports = { async up(queryInterface, Sequelize) { await queryInterface.createTable('categories', { id: { type: Sequelize.CHAR(36), primaryKey: true, allowNull: false, defaultValue: Sequelize.UUIDV4, comment: 'UUID primary key' }, name: { type: Sequelize.STRING(100), allowNull: false, unique: true, comment: 'Category name' }, slug: { type: Sequelize.STRING(100), allowNull: false, unique: true, comment: 'URL-friendly slug' }, description: { type: Sequelize.TEXT, allowNull: true, comment: 'Category description' }, icon: { type: Sequelize.STRING(255), allowNull: true, comment: 'Icon URL or class' }, color: { type: Sequelize.STRING(20), allowNull: true, comment: 'Display color (hex or name)' }, is_active: { type: Sequelize.BOOLEAN, allowNull: false, defaultValue: true, comment: 'Category active status' }, guest_accessible: { type: Sequelize.BOOLEAN, allowNull: false, defaultValue: false, comment: 'Whether guests can access this category' }, // Statistics question_count: { type: Sequelize.INTEGER, allowNull: false, defaultValue: 0, comment: 'Total number of questions in this category' }, quiz_count: { type: Sequelize.INTEGER, allowNull: false, defaultValue: 0, comment: 'Total number of quizzes taken in this category' }, // Display order display_order: { type: Sequelize.INTEGER, allowNull: false, defaultValue: 0, comment: 'Display order (lower numbers first)' }, // Timestamps 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('categories', ['name'], { unique: true, name: 'idx_categories_name' }); await queryInterface.addIndex('categories', ['slug'], { unique: true, name: 'idx_categories_slug' }); await queryInterface.addIndex('categories', ['is_active'], { name: 'idx_categories_is_active' }); await queryInterface.addIndex('categories', ['guest_accessible'], { name: 'idx_categories_guest_accessible' }); await queryInterface.addIndex('categories', ['display_order'], { name: 'idx_categories_display_order' }); await queryInterface.addIndex('categories', ['is_active', 'guest_accessible'], { name: 'idx_categories_active_guest' }); console.log('✅ Categories table created successfully with indexes'); }, async down(queryInterface, Sequelize) { await queryInterface.dropTable('categories'); console.log('✅ Categories table dropped successfully'); } };