Re_Backend/src/migrations/2025103000-create-users.ts

116 lines
2.5 KiB
TypeScript

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<void> {
// 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<void> {
await queryInterface.dropTable('users');
// Users table dropped
}