import { QueryInterface, DataTypes } from 'sequelize'; /** * Migration: Create users table * This must run FIRST before other tables that reference users */ export async function up(queryInterface: QueryInterface): Promise { // Create users table await queryInterface.createTable('users', { user_id: { type: DataTypes.UUID, primaryKey: true, defaultValue: DataTypes.UUIDV4, field: 'user_id' }, employee_id: { type: DataTypes.STRING(50), allowNull: true, field: 'employee_id' }, okta_sub: { type: DataTypes.STRING(100), allowNull: false, unique: true, field: 'okta_sub' }, email: { type: DataTypes.STRING(255), allowNull: false, unique: true, field: 'email' }, first_name: { type: DataTypes.STRING(100), allowNull: true, field: 'first_name' }, last_name: { type: DataTypes.STRING(100), allowNull: true, field: 'last_name' }, display_name: { type: DataTypes.STRING(200), allowNull: true, field: 'display_name' }, department: { type: DataTypes.STRING(100), allowNull: true }, designation: { type: DataTypes.STRING(100), allowNull: true }, phone: { type: DataTypes.STRING(20), allowNull: true }, location: { type: DataTypes.JSONB, allowNull: true }, is_active: { type: DataTypes.BOOLEAN, defaultValue: true, field: 'is_active' }, is_admin: { type: DataTypes.BOOLEAN, defaultValue: false, field: 'is_admin' }, last_login: { type: DataTypes.DATE, allowNull: true, field: 'last_login' }, created_at: { type: DataTypes.DATE, allowNull: false, defaultValue: DataTypes.NOW, field: 'created_at' }, updated_at: { type: DataTypes.DATE, allowNull: false, defaultValue: DataTypes.NOW, field: 'updated_at' } }); // Create indexes await queryInterface.addIndex('users', ['email'], { name: 'users_email_idx', unique: true }); await queryInterface.addIndex('users', ['okta_sub'], { name: 'users_okta_sub_idx', unique: true }); await queryInterface.addIndex('users', ['employee_id'], { name: 'users_employee_id_idx' }); // Users table created } export async function down(queryInterface: QueryInterface): Promise { await queryInterface.dropTable('users'); // Users table dropped }