diff --git a/src/migrations/2025103000-create-users.ts b/src/migrations/2025103000-create-users.ts new file mode 100644 index 0000000..27d138e --- /dev/null +++ b/src/migrations/2025103000-create-users.ts @@ -0,0 +1,115 @@ +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' + }); + + console.log('✅ Created users table with indexes'); +} + +export async function down(queryInterface: QueryInterface): Promise { + await queryInterface.dropTable('users'); + console.log('✅ Dropped users table'); +} + diff --git a/src/scripts/migrate.ts b/src/scripts/migrate.ts index 86c4ed0..9914368 100644 --- a/src/scripts/migrate.ts +++ b/src/scripts/migrate.ts @@ -1,5 +1,6 @@ import { sequelize } from '../config/database'; import { QueryInterface, QueryTypes } from 'sequelize'; +import * as m0 from '../migrations/2025103000-create-users'; import * as m1 from '../migrations/2025103001-create-workflow-requests'; import * as m2 from '../migrations/2025103002-create-approval-levels'; import * as m3 from '../migrations/2025103003-create-participants'; @@ -14,6 +15,7 @@ import * as m11 from '../migrations/20251104-create-kpi-views'; import * as m12 from '../migrations/20251104-create-holidays'; import * as m13 from '../migrations/20251104-create-admin-config'; import * as m14 from '../migrations/20251105-add-skip-fields-to-approval-levels'; +import * as m15 from '../migrations/2025110501-alter-tat-days-to-generated'; interface Migration { name: string; @@ -21,7 +23,12 @@ interface Migration { } // Define all migrations in order +// IMPORTANT: Order matters! Dependencies must be created before tables that reference them const migrations: Migration[] = [ + // 1. FIRST: Create base tables with no dependencies + { name: '2025103000-create-users', module: m0 }, // ← MUST BE FIRST + + // 2. Tables that depend on users { name: '2025103001-create-workflow-requests', module: m1 }, { name: '2025103002-create-approval-levels', module: m2 }, { name: '2025103003-create-participants', module: m3 }, @@ -30,12 +37,15 @@ const migrations: Migration[] = [ { name: '20251031_02_create_activities', module: m6 }, { name: '20251031_03_create_work_notes', module: m7 }, { name: '20251031_04_create_work_note_attachments', module: m8 }, + + // 3. Table modifications and additional features { name: '20251104-add-tat-alert-fields', module: m9 }, { name: '20251104-create-tat-alerts', module: m10 }, { name: '20251104-create-kpi-views', module: m11 }, { name: '20251104-create-holidays', module: m12 }, { name: '20251104-create-admin-config', module: m13 }, { name: '20251105-add-skip-fields-to-approval-levels', module: m14 }, + { name: '2025110501-alter-tat-days-to-generated', module: m15 }, ]; /**