39949-vm/backend/src/db/migrations/1778492863095.js
2026-05-11 09:50:25 +00:00

5353 lines
172 KiB
JavaScript

module.exports = {
/**
* @param {QueryInterface} queryInterface
* @param {Sequelize} Sequelize
* @returns {Promise<void>}
*/
async up(queryInterface, Sequelize) {
/**
* @type {Transaction}
*/
const transaction = await queryInterface.sequelize.transaction();
try {
await queryInterface.createTable('users', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('roles', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('permissions', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('matters', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('ai_tools', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('vendors', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('vendor_risk_assessments', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('ai_use_case_requests', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('approval_steps', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('policies', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('ai_workflows', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('workflow_runs', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('prompt_audit_logs', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('human_review_tasks', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('training_courses', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('training_completions', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('tool_access_rules', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('roi_metrics', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('integrations', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.addColumn(
'users',
'firstName',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'users',
'lastName',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'users',
'phoneNumber',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'users',
'email',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'users',
'disabled',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'users',
'password',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'users',
'emailVerified',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'users',
'emailVerificationToken',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'users',
'emailVerificationTokenExpiresAt',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'users',
'passwordResetToken',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'users',
'passwordResetTokenExpiresAt',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'users',
'provider',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'users',
'app_roleId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'roles',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'roles',
'name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'roles',
'role_customization',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'permissions',
'name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'matters',
'matter_name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'matters',
'matter_number',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'matters',
'client_name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'matters',
'practice_group',
{
type: Sequelize.DataTypes.ENUM,
values: ['litigation','corporate','employment','ip','real_estate','privacy','tax','general'],
},
{ transaction }
);
await queryInterface.addColumn(
'matters',
'sensitivity_level',
{
type: Sequelize.DataTypes.ENUM,
values: ['public','internal','confidential','privileged','regulated'],
},
{ transaction }
);
await queryInterface.addColumn(
'matters',
'has_personal_data',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'matters',
'has_health_data',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'matters',
'has_payment_data',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'matters',
'subject_to_hold',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'matters',
'opened_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'matters',
'closed_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'matters',
'responsible_lawyerId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'users',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'matters',
'notes',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'ai_tools',
'tool_name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'ai_tools',
'tool_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['chat_assistant','document_review','drafting','research','summarization','translation','contract_analysis','internal_llm','other'],
},
{ transaction }
);
await queryInterface.addColumn(
'ai_tools',
'provider_name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'ai_tools',
'website_url',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'ai_tools',
'deployment_model',
{
type: Sequelize.DataTypes.ENUM,
values: ['saas','on_prem','private_cloud','azure_openai','aws_bedrock','gcp_vertex','other'],
},
{ transaction }
);
await queryInterface.addColumn(
'ai_tools',
'approval_status',
{
type: Sequelize.DataTypes.ENUM,
values: ['proposed','in_review','approved','restricted','rejected','retired'],
},
{ transaction }
);
await queryInterface.addColumn(
'ai_tools',
'data_handling_policy',
{
type: Sequelize.DataTypes.ENUM,
values: ['no_client_data','client_data_allowed_with_controls','client_data_allowed','unknown'],
},
{ transaction }
);
await queryInterface.addColumn(
'ai_tools',
'training_on_customer_data',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'ai_tools',
'supports_audit_logs',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'ai_tools',
'supports_data_residency',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'ai_tools',
'supports_sso',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'ai_tools',
'supports_encryption_at_rest',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'ai_tools',
'supports_encryption_in_transit',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'ai_tools',
'notes',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'vendors',
'vendor_name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'vendors',
'vendor_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['ai_vendor','document_management','practice_management','identity_security','workflow_automation','risk_compliance','e_signature','reporting','other'],
},
{ transaction }
);
await queryInterface.addColumn(
'vendors',
'primary_contact_name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'vendors',
'primary_contact_email',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'vendors',
'website_url',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'vendors',
'status',
{
type: Sequelize.DataTypes.ENUM,
values: ['active','prospect','inactive'],
},
{ transaction }
);
await queryInterface.addColumn(
'vendors',
'notes',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'vendor_risk_assessments',
'vendorId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'vendors',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'vendor_risk_assessments',
'toolId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'ai_tools',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'vendor_risk_assessments',
'assessment_status',
{
type: Sequelize.DataTypes.ENUM,
values: ['not_started','in_progress','waiting_on_vendor','completed','expired'],
},
{ transaction }
);
await queryInterface.addColumn(
'vendor_risk_assessments',
'risk_rating',
{
type: Sequelize.DataTypes.ENUM,
values: ['low','medium','high','critical','unknown'],
},
{ transaction }
);
await queryInterface.addColumn(
'vendor_risk_assessments',
'data_retention_policy',
{
type: Sequelize.DataTypes.ENUM,
values: ['none','short_term','standard','long_term','unknown'],
},
{ transaction }
);
await queryInterface.addColumn(
'vendor_risk_assessments',
'data_residency',
{
type: Sequelize.DataTypes.ENUM,
values: ['us','eu','uk','canada','global','customer_choice','unknown'],
},
{ transaction }
);
await queryInterface.addColumn(
'vendor_risk_assessments',
'subprocessors_used',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'vendor_risk_assessments',
'supports_deletion',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'vendor_risk_assessments',
'supports_export',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'vendor_risk_assessments',
'audit_logs_available',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'vendor_risk_assessments',
'incident_response_sla',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'vendor_risk_assessments',
'security_certifications_present',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'vendor_risk_assessments',
'security_score',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'vendor_risk_assessments',
'privacy_score',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'vendor_risk_assessments',
'legal_risk_score',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'vendor_risk_assessments',
'integration_readiness_score',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'vendor_risk_assessments',
'cost_score',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'vendor_risk_assessments',
'summary',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'vendor_risk_assessments',
'ownerId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'users',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'vendor_risk_assessments',
'started_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'vendor_risk_assessments',
'completed_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'vendor_risk_assessments',
'expires_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'ai_use_case_requests',
'request_title',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'ai_use_case_requests',
'request_description',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'ai_use_case_requests',
'use_case_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['summarization','drafting','research','classification','contract_review','email_generation','translation','data_extraction','other'],
},
{ transaction }
);
await queryInterface.addColumn(
'ai_use_case_requests',
'risk_level',
{
type: Sequelize.DataTypes.ENUM,
values: ['low','medium','high','critical'],
},
{ transaction }
);
await queryInterface.addColumn(
'ai_use_case_requests',
'data_sensitivity',
{
type: Sequelize.DataTypes.ENUM,
values: ['public','internal','confidential','privileged','regulated'],
},
{ transaction }
);
await queryInterface.addColumn(
'ai_use_case_requests',
'client_consent_required',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'ai_use_case_requests',
'client_consent_obtained',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'ai_use_case_requests',
'involves_personal_data',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'ai_use_case_requests',
'involves_health_data',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'ai_use_case_requests',
'involves_financial_data',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'ai_use_case_requests',
'status',
{
type: Sequelize.DataTypes.ENUM,
values: ['draft','submitted','in_review','approved','rejected','on_hold','implemented'],
},
{ transaction }
);
await queryInterface.addColumn(
'ai_use_case_requests',
'requested_byId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'users',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'ai_use_case_requests',
'matterId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'matters',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'ai_use_case_requests',
'proposed_toolId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'ai_tools',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'ai_use_case_requests',
'estimated_hours_saved_per_month',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'ai_use_case_requests',
'estimated_cost_per_month',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'ai_use_case_requests',
'success_metrics',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'ai_use_case_requests',
'submitted_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'ai_use_case_requests',
'needed_by',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'approval_steps',
'use_case_requestId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'ai_use_case_requests',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'approval_steps',
'step_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['partner','gc','it_security','risk_ethics','privacy','billing_ops','other'],
},
{ transaction }
);
await queryInterface.addColumn(
'approval_steps',
'decision',
{
type: Sequelize.DataTypes.ENUM,
values: ['pending','approved','rejected','changes_requested','skipped'],
},
{ transaction }
);
await queryInterface.addColumn(
'approval_steps',
'assigned_toId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'users',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'approval_steps',
'decided_byId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'users',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'approval_steps',
'comments',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'approval_steps',
'due_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'approval_steps',
'decided_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'policies',
'policy_title',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'policies',
'policy_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['firm_ai_policy','client_notice','client_consent_language','internal_usage_rules','human_review_checklist','vendor_guidance','other'],
},
{ transaction }
);
await queryInterface.addColumn(
'policies',
'status',
{
type: Sequelize.DataTypes.ENUM,
values: ['draft','review','approved','archived'],
},
{ transaction }
);
await queryInterface.addColumn(
'policies',
'policy_body',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'policies',
'ownerId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'users',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'policies',
'related_toolId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'ai_tools',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'policies',
'related_matterId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'matters',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'policies',
'effective_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'policies',
'review_due_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'ai_workflows',
'workflow_name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'ai_workflows',
'workflow_description',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'ai_workflows',
'status',
{
type: Sequelize.DataTypes.ENUM,
values: ['draft','active','paused','retired'],
},
{ transaction }
);
await queryInterface.addColumn(
'ai_workflows',
'use_case_requestId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'ai_use_case_requests',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'ai_workflows',
'default_toolId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'ai_tools',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'ai_workflows',
'default_sensitivity',
{
type: Sequelize.DataTypes.ENUM,
values: ['public','internal','confidential','privileged','regulated'],
},
{ transaction }
);
await queryInterface.addColumn(
'ai_workflows',
'trigger_notes',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'workflow_runs',
'workflowId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'ai_workflows',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'workflow_runs',
'run_status',
{
type: Sequelize.DataTypes.ENUM,
values: ['queued','running','needs_review','completed','failed','cancelled'],
},
{ transaction }
);
await queryInterface.addColumn(
'workflow_runs',
'initiated_byId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'users',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'workflow_runs',
'matterId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'matters',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'workflow_runs',
'tool_usedId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'ai_tools',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'workflow_runs',
'data_sensitivity',
{
type: Sequelize.DataTypes.ENUM,
values: ['public','internal','confidential','privileged','regulated'],
},
{ transaction }
);
await queryInterface.addColumn(
'workflow_runs',
'estimated_minutes_saved',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'workflow_runs',
'input_summary',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'workflow_runs',
'output_summary',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'workflow_runs',
'started_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'workflow_runs',
'ended_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'prompt_audit_logs',
'workflow_runId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'workflow_runs',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'prompt_audit_logs',
'toolId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'ai_tools',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'prompt_audit_logs',
'userId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'users',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'prompt_audit_logs',
'event_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['prompt','output','system_message','redaction','error'],
},
{ transaction }
);
await queryInterface.addColumn(
'prompt_audit_logs',
'content_classification',
{
type: Sequelize.DataTypes.ENUM,
values: ['public','internal','confidential','privileged','regulated'],
},
{ transaction }
);
await queryInterface.addColumn(
'prompt_audit_logs',
'contains_client_identifiers',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'prompt_audit_logs',
'content_preview',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'prompt_audit_logs',
'occurred_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'human_review_tasks',
'workflow_runId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'workflow_runs',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'human_review_tasks',
'use_case_requestId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'ai_use_case_requests',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'human_review_tasks',
'review_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['accuracy','citations','privilege','confidentiality','client_consent','supervision','bias','formatting','other'],
},
{ transaction }
);
await queryInterface.addColumn(
'human_review_tasks',
'status',
{
type: Sequelize.DataTypes.ENUM,
values: ['pending','in_progress','passed','failed','needs_changes','waived'],
},
{ transaction }
);
await queryInterface.addColumn(
'human_review_tasks',
'assigned_toId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'users',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'human_review_tasks',
'completed_byId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'users',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'human_review_tasks',
'checklist_notes',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'human_review_tasks',
'due_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'human_review_tasks',
'completed_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'training_courses',
'course_title',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'training_courses',
'course_description',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'training_courses',
'course_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['ethics','confidentiality','prompting','tool_specific','security','policy_acknowledgement','other'],
},
{ transaction }
);
await queryInterface.addColumn(
'training_courses',
'status',
{
type: Sequelize.DataTypes.ENUM,
values: ['draft','published','retired'],
},
{ transaction }
);
await queryInterface.addColumn(
'training_courses',
'estimated_minutes',
{
type: Sequelize.DataTypes.INTEGER,
},
{ transaction }
);
await queryInterface.addColumn(
'training_courses',
'published_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'training_completions',
'courseId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'training_courses',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'training_completions',
'userId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'users',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'training_completions',
'completion_status',
{
type: Sequelize.DataTypes.ENUM,
values: ['assigned','in_progress','completed','overdue','waived'],
},
{ transaction }
);
await queryInterface.addColumn(
'training_completions',
'score_percent',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'training_completions',
'assigned_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'training_completions',
'completed_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'training_completions',
'expires_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'tool_access_rules',
'toolId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'ai_tools',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'tool_access_rules',
'min_role_allowed',
{
type: Sequelize.DataTypes.ENUM,
values: ['admin','partner_requester','risk_ethics','it_security','associate','billing_ops','viewer'],
},
{ transaction }
);
await queryInterface.addColumn(
'tool_access_rules',
'max_sensitivity_allowed',
{
type: Sequelize.DataTypes.ENUM,
values: ['public','internal','confidential','privileged','regulated'],
},
{ transaction }
);
await queryInterface.addColumn(
'tool_access_rules',
'requires_training',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'tool_access_rules',
'required_courseId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'training_courses',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'tool_access_rules',
'requires_client_consent',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'tool_access_rules',
'restrictions_notes',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'tool_access_rules',
'status',
{
type: Sequelize.DataTypes.ENUM,
values: ['active','inactive'],
},
{ transaction }
);
await queryInterface.addColumn(
'roi_metrics',
'metric_scope',
{
type: Sequelize.DataTypes.ENUM,
values: ['tool','workflow','use_case','practice_group','overall'],
},
{ transaction }
);
await queryInterface.addColumn(
'roi_metrics',
'toolId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'ai_tools',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'roi_metrics',
'workflowId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'ai_workflows',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'roi_metrics',
'use_case_requestId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'ai_use_case_requests',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'roi_metrics',
'practice_group',
{
type: Sequelize.DataTypes.ENUM,
values: ['litigation','corporate','employment','ip','real_estate','privacy','tax','general'],
},
{ transaction }
);
await queryInterface.addColumn(
'roi_metrics',
'period_start_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'roi_metrics',
'period_end_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'roi_metrics',
'hours_saved',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'roi_metrics',
'turnaround_hours_reduced',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'roi_metrics',
'write_offs_avoided_amount',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'roi_metrics',
'revenue_impact_amount',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'roi_metrics',
'subscription_cost_amount',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'roi_metrics',
'adoption_rate_percent',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'roi_metrics',
'run_count',
{
type: Sequelize.DataTypes.INTEGER,
},
{ transaction }
);
await queryInterface.addColumn(
'integrations',
'integration_name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'integrations',
'category',
{
type: Sequelize.DataTypes.ENUM,
values: ['document_system','practice_management','identity_security','workflow_tool','risk_compliance','e_signature','reporting','other'],
},
{ transaction }
);
await queryInterface.addColumn(
'integrations',
'provider',
{
type: Sequelize.DataTypes.ENUM,
values: ['imanage','netdocuments','sharepoint','onedrive','google_drive','box','clio','mycase','practicepanther','smokeball','filevine','litify','elite_3e','aderant','entra_id','okta','saml_sso','mfa','teams','slack','zapier','n8n','make','jira','asana','servicenow','vanta','drata','onetrust','whistic','docusign','adobe_sign','ironclad','linksquares','power_bi','tableau','looker_studio','custom'],
},
{ transaction }
);
await queryInterface.addColumn(
'integrations',
'status',
{
type: Sequelize.DataTypes.ENUM,
values: ['not_configured','configured','disabled'],
},
{ transaction }
);
await queryInterface.addColumn(
'integrations',
'sync_enabled',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'integrations',
'configuration_notes',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'integrations',
'last_sync_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await transaction.commit();
} catch (err) {
await transaction.rollback();
throw err;
}
},
/**
* @param {QueryInterface} queryInterface
* @param {Sequelize} Sequelize
* @returns {Promise<void>}
*/
async down(queryInterface, Sequelize) {
/**
* @type {Transaction}
*/
const transaction = await queryInterface.sequelize.transaction();
try {
await queryInterface.removeColumn(
'integrations',
'last_sync_at',
{ transaction }
);
await queryInterface.removeColumn(
'integrations',
'configuration_notes',
{ transaction }
);
await queryInterface.removeColumn(
'integrations',
'sync_enabled',
{ transaction }
);
await queryInterface.removeColumn(
'integrations',
'status',
{ transaction }
);
await queryInterface.removeColumn(
'integrations',
'provider',
{ transaction }
);
await queryInterface.removeColumn(
'integrations',
'category',
{ transaction }
);
await queryInterface.removeColumn(
'integrations',
'integration_name',
{ transaction }
);
await queryInterface.removeColumn(
'roi_metrics',
'run_count',
{ transaction }
);
await queryInterface.removeColumn(
'roi_metrics',
'adoption_rate_percent',
{ transaction }
);
await queryInterface.removeColumn(
'roi_metrics',
'subscription_cost_amount',
{ transaction }
);
await queryInterface.removeColumn(
'roi_metrics',
'revenue_impact_amount',
{ transaction }
);
await queryInterface.removeColumn(
'roi_metrics',
'write_offs_avoided_amount',
{ transaction }
);
await queryInterface.removeColumn(
'roi_metrics',
'turnaround_hours_reduced',
{ transaction }
);
await queryInterface.removeColumn(
'roi_metrics',
'hours_saved',
{ transaction }
);
await queryInterface.removeColumn(
'roi_metrics',
'period_end_at',
{ transaction }
);
await queryInterface.removeColumn(
'roi_metrics',
'period_start_at',
{ transaction }
);
await queryInterface.removeColumn(
'roi_metrics',
'practice_group',
{ transaction }
);
await queryInterface.removeColumn(
'roi_metrics',
'use_case_requestId',
{ transaction }
);
await queryInterface.removeColumn(
'roi_metrics',
'workflowId',
{ transaction }
);
await queryInterface.removeColumn(
'roi_metrics',
'toolId',
{ transaction }
);
await queryInterface.removeColumn(
'roi_metrics',
'metric_scope',
{ transaction }
);
await queryInterface.removeColumn(
'tool_access_rules',
'status',
{ transaction }
);
await queryInterface.removeColumn(
'tool_access_rules',
'restrictions_notes',
{ transaction }
);
await queryInterface.removeColumn(
'tool_access_rules',
'requires_client_consent',
{ transaction }
);
await queryInterface.removeColumn(
'tool_access_rules',
'required_courseId',
{ transaction }
);
await queryInterface.removeColumn(
'tool_access_rules',
'requires_training',
{ transaction }
);
await queryInterface.removeColumn(
'tool_access_rules',
'max_sensitivity_allowed',
{ transaction }
);
await queryInterface.removeColumn(
'tool_access_rules',
'min_role_allowed',
{ transaction }
);
await queryInterface.removeColumn(
'tool_access_rules',
'toolId',
{ transaction }
);
await queryInterface.removeColumn(
'training_completions',
'expires_at',
{ transaction }
);
await queryInterface.removeColumn(
'training_completions',
'completed_at',
{ transaction }
);
await queryInterface.removeColumn(
'training_completions',
'assigned_at',
{ transaction }
);
await queryInterface.removeColumn(
'training_completions',
'score_percent',
{ transaction }
);
await queryInterface.removeColumn(
'training_completions',
'completion_status',
{ transaction }
);
await queryInterface.removeColumn(
'training_completions',
'userId',
{ transaction }
);
await queryInterface.removeColumn(
'training_completions',
'courseId',
{ transaction }
);
await queryInterface.removeColumn(
'training_courses',
'published_at',
{ transaction }
);
await queryInterface.removeColumn(
'training_courses',
'estimated_minutes',
{ transaction }
);
await queryInterface.removeColumn(
'training_courses',
'status',
{ transaction }
);
await queryInterface.removeColumn(
'training_courses',
'course_type',
{ transaction }
);
await queryInterface.removeColumn(
'training_courses',
'course_description',
{ transaction }
);
await queryInterface.removeColumn(
'training_courses',
'course_title',
{ transaction }
);
await queryInterface.removeColumn(
'human_review_tasks',
'completed_at',
{ transaction }
);
await queryInterface.removeColumn(
'human_review_tasks',
'due_at',
{ transaction }
);
await queryInterface.removeColumn(
'human_review_tasks',
'checklist_notes',
{ transaction }
);
await queryInterface.removeColumn(
'human_review_tasks',
'completed_byId',
{ transaction }
);
await queryInterface.removeColumn(
'human_review_tasks',
'assigned_toId',
{ transaction }
);
await queryInterface.removeColumn(
'human_review_tasks',
'status',
{ transaction }
);
await queryInterface.removeColumn(
'human_review_tasks',
'review_type',
{ transaction }
);
await queryInterface.removeColumn(
'human_review_tasks',
'use_case_requestId',
{ transaction }
);
await queryInterface.removeColumn(
'human_review_tasks',
'workflow_runId',
{ transaction }
);
await queryInterface.removeColumn(
'prompt_audit_logs',
'occurred_at',
{ transaction }
);
await queryInterface.removeColumn(
'prompt_audit_logs',
'content_preview',
{ transaction }
);
await queryInterface.removeColumn(
'prompt_audit_logs',
'contains_client_identifiers',
{ transaction }
);
await queryInterface.removeColumn(
'prompt_audit_logs',
'content_classification',
{ transaction }
);
await queryInterface.removeColumn(
'prompt_audit_logs',
'event_type',
{ transaction }
);
await queryInterface.removeColumn(
'prompt_audit_logs',
'userId',
{ transaction }
);
await queryInterface.removeColumn(
'prompt_audit_logs',
'toolId',
{ transaction }
);
await queryInterface.removeColumn(
'prompt_audit_logs',
'workflow_runId',
{ transaction }
);
await queryInterface.removeColumn(
'workflow_runs',
'ended_at',
{ transaction }
);
await queryInterface.removeColumn(
'workflow_runs',
'started_at',
{ transaction }
);
await queryInterface.removeColumn(
'workflow_runs',
'output_summary',
{ transaction }
);
await queryInterface.removeColumn(
'workflow_runs',
'input_summary',
{ transaction }
);
await queryInterface.removeColumn(
'workflow_runs',
'estimated_minutes_saved',
{ transaction }
);
await queryInterface.removeColumn(
'workflow_runs',
'data_sensitivity',
{ transaction }
);
await queryInterface.removeColumn(
'workflow_runs',
'tool_usedId',
{ transaction }
);
await queryInterface.removeColumn(
'workflow_runs',
'matterId',
{ transaction }
);
await queryInterface.removeColumn(
'workflow_runs',
'initiated_byId',
{ transaction }
);
await queryInterface.removeColumn(
'workflow_runs',
'run_status',
{ transaction }
);
await queryInterface.removeColumn(
'workflow_runs',
'workflowId',
{ transaction }
);
await queryInterface.removeColumn(
'ai_workflows',
'trigger_notes',
{ transaction }
);
await queryInterface.removeColumn(
'ai_workflows',
'default_sensitivity',
{ transaction }
);
await queryInterface.removeColumn(
'ai_workflows',
'default_toolId',
{ transaction }
);
await queryInterface.removeColumn(
'ai_workflows',
'use_case_requestId',
{ transaction }
);
await queryInterface.removeColumn(
'ai_workflows',
'status',
{ transaction }
);
await queryInterface.removeColumn(
'ai_workflows',
'workflow_description',
{ transaction }
);
await queryInterface.removeColumn(
'ai_workflows',
'workflow_name',
{ transaction }
);
await queryInterface.removeColumn(
'policies',
'review_due_at',
{ transaction }
);
await queryInterface.removeColumn(
'policies',
'effective_at',
{ transaction }
);
await queryInterface.removeColumn(
'policies',
'related_matterId',
{ transaction }
);
await queryInterface.removeColumn(
'policies',
'related_toolId',
{ transaction }
);
await queryInterface.removeColumn(
'policies',
'ownerId',
{ transaction }
);
await queryInterface.removeColumn(
'policies',
'policy_body',
{ transaction }
);
await queryInterface.removeColumn(
'policies',
'status',
{ transaction }
);
await queryInterface.removeColumn(
'policies',
'policy_type',
{ transaction }
);
await queryInterface.removeColumn(
'policies',
'policy_title',
{ transaction }
);
await queryInterface.removeColumn(
'approval_steps',
'decided_at',
{ transaction }
);
await queryInterface.removeColumn(
'approval_steps',
'due_at',
{ transaction }
);
await queryInterface.removeColumn(
'approval_steps',
'comments',
{ transaction }
);
await queryInterface.removeColumn(
'approval_steps',
'decided_byId',
{ transaction }
);
await queryInterface.removeColumn(
'approval_steps',
'assigned_toId',
{ transaction }
);
await queryInterface.removeColumn(
'approval_steps',
'decision',
{ transaction }
);
await queryInterface.removeColumn(
'approval_steps',
'step_type',
{ transaction }
);
await queryInterface.removeColumn(
'approval_steps',
'use_case_requestId',
{ transaction }
);
await queryInterface.removeColumn(
'ai_use_case_requests',
'needed_by',
{ transaction }
);
await queryInterface.removeColumn(
'ai_use_case_requests',
'submitted_at',
{ transaction }
);
await queryInterface.removeColumn(
'ai_use_case_requests',
'success_metrics',
{ transaction }
);
await queryInterface.removeColumn(
'ai_use_case_requests',
'estimated_cost_per_month',
{ transaction }
);
await queryInterface.removeColumn(
'ai_use_case_requests',
'estimated_hours_saved_per_month',
{ transaction }
);
await queryInterface.removeColumn(
'ai_use_case_requests',
'proposed_toolId',
{ transaction }
);
await queryInterface.removeColumn(
'ai_use_case_requests',
'matterId',
{ transaction }
);
await queryInterface.removeColumn(
'ai_use_case_requests',
'requested_byId',
{ transaction }
);
await queryInterface.removeColumn(
'ai_use_case_requests',
'status',
{ transaction }
);
await queryInterface.removeColumn(
'ai_use_case_requests',
'involves_financial_data',
{ transaction }
);
await queryInterface.removeColumn(
'ai_use_case_requests',
'involves_health_data',
{ transaction }
);
await queryInterface.removeColumn(
'ai_use_case_requests',
'involves_personal_data',
{ transaction }
);
await queryInterface.removeColumn(
'ai_use_case_requests',
'client_consent_obtained',
{ transaction }
);
await queryInterface.removeColumn(
'ai_use_case_requests',
'client_consent_required',
{ transaction }
);
await queryInterface.removeColumn(
'ai_use_case_requests',
'data_sensitivity',
{ transaction }
);
await queryInterface.removeColumn(
'ai_use_case_requests',
'risk_level',
{ transaction }
);
await queryInterface.removeColumn(
'ai_use_case_requests',
'use_case_type',
{ transaction }
);
await queryInterface.removeColumn(
'ai_use_case_requests',
'request_description',
{ transaction }
);
await queryInterface.removeColumn(
'ai_use_case_requests',
'request_title',
{ transaction }
);
await queryInterface.removeColumn(
'vendor_risk_assessments',
'expires_at',
{ transaction }
);
await queryInterface.removeColumn(
'vendor_risk_assessments',
'completed_at',
{ transaction }
);
await queryInterface.removeColumn(
'vendor_risk_assessments',
'started_at',
{ transaction }
);
await queryInterface.removeColumn(
'vendor_risk_assessments',
'ownerId',
{ transaction }
);
await queryInterface.removeColumn(
'vendor_risk_assessments',
'summary',
{ transaction }
);
await queryInterface.removeColumn(
'vendor_risk_assessments',
'cost_score',
{ transaction }
);
await queryInterface.removeColumn(
'vendor_risk_assessments',
'integration_readiness_score',
{ transaction }
);
await queryInterface.removeColumn(
'vendor_risk_assessments',
'legal_risk_score',
{ transaction }
);
await queryInterface.removeColumn(
'vendor_risk_assessments',
'privacy_score',
{ transaction }
);
await queryInterface.removeColumn(
'vendor_risk_assessments',
'security_score',
{ transaction }
);
await queryInterface.removeColumn(
'vendor_risk_assessments',
'security_certifications_present',
{ transaction }
);
await queryInterface.removeColumn(
'vendor_risk_assessments',
'incident_response_sla',
{ transaction }
);
await queryInterface.removeColumn(
'vendor_risk_assessments',
'audit_logs_available',
{ transaction }
);
await queryInterface.removeColumn(
'vendor_risk_assessments',
'supports_export',
{ transaction }
);
await queryInterface.removeColumn(
'vendor_risk_assessments',
'supports_deletion',
{ transaction }
);
await queryInterface.removeColumn(
'vendor_risk_assessments',
'subprocessors_used',
{ transaction }
);
await queryInterface.removeColumn(
'vendor_risk_assessments',
'data_residency',
{ transaction }
);
await queryInterface.removeColumn(
'vendor_risk_assessments',
'data_retention_policy',
{ transaction }
);
await queryInterface.removeColumn(
'vendor_risk_assessments',
'risk_rating',
{ transaction }
);
await queryInterface.removeColumn(
'vendor_risk_assessments',
'assessment_status',
{ transaction }
);
await queryInterface.removeColumn(
'vendor_risk_assessments',
'toolId',
{ transaction }
);
await queryInterface.removeColumn(
'vendor_risk_assessments',
'vendorId',
{ transaction }
);
await queryInterface.removeColumn(
'vendors',
'notes',
{ transaction }
);
await queryInterface.removeColumn(
'vendors',
'status',
{ transaction }
);
await queryInterface.removeColumn(
'vendors',
'website_url',
{ transaction }
);
await queryInterface.removeColumn(
'vendors',
'primary_contact_email',
{ transaction }
);
await queryInterface.removeColumn(
'vendors',
'primary_contact_name',
{ transaction }
);
await queryInterface.removeColumn(
'vendors',
'vendor_type',
{ transaction }
);
await queryInterface.removeColumn(
'vendors',
'vendor_name',
{ transaction }
);
await queryInterface.removeColumn(
'ai_tools',
'notes',
{ transaction }
);
await queryInterface.removeColumn(
'ai_tools',
'supports_encryption_in_transit',
{ transaction }
);
await queryInterface.removeColumn(
'ai_tools',
'supports_encryption_at_rest',
{ transaction }
);
await queryInterface.removeColumn(
'ai_tools',
'supports_sso',
{ transaction }
);
await queryInterface.removeColumn(
'ai_tools',
'supports_data_residency',
{ transaction }
);
await queryInterface.removeColumn(
'ai_tools',
'supports_audit_logs',
{ transaction }
);
await queryInterface.removeColumn(
'ai_tools',
'training_on_customer_data',
{ transaction }
);
await queryInterface.removeColumn(
'ai_tools',
'data_handling_policy',
{ transaction }
);
await queryInterface.removeColumn(
'ai_tools',
'approval_status',
{ transaction }
);
await queryInterface.removeColumn(
'ai_tools',
'deployment_model',
{ transaction }
);
await queryInterface.removeColumn(
'ai_tools',
'website_url',
{ transaction }
);
await queryInterface.removeColumn(
'ai_tools',
'provider_name',
{ transaction }
);
await queryInterface.removeColumn(
'ai_tools',
'tool_type',
{ transaction }
);
await queryInterface.removeColumn(
'ai_tools',
'tool_name',
{ transaction }
);
await queryInterface.removeColumn(
'matters',
'notes',
{ transaction }
);
await queryInterface.removeColumn(
'matters',
'responsible_lawyerId',
{ transaction }
);
await queryInterface.removeColumn(
'matters',
'closed_at',
{ transaction }
);
await queryInterface.removeColumn(
'matters',
'opened_at',
{ transaction }
);
await queryInterface.removeColumn(
'matters',
'subject_to_hold',
{ transaction }
);
await queryInterface.removeColumn(
'matters',
'has_payment_data',
{ transaction }
);
await queryInterface.removeColumn(
'matters',
'has_health_data',
{ transaction }
);
await queryInterface.removeColumn(
'matters',
'has_personal_data',
{ transaction }
);
await queryInterface.removeColumn(
'matters',
'sensitivity_level',
{ transaction }
);
await queryInterface.removeColumn(
'matters',
'practice_group',
{ transaction }
);
await queryInterface.removeColumn(
'matters',
'client_name',
{ transaction }
);
await queryInterface.removeColumn(
'matters',
'matter_number',
{ transaction }
);
await queryInterface.removeColumn(
'matters',
'matter_name',
{ transaction }
);
await queryInterface.removeColumn(
'permissions',
'name',
{ transaction }
);
await queryInterface.removeColumn(
'roles',
'role_customization',
{ transaction }
);
await queryInterface.removeColumn(
'roles',
'name',
{ transaction }
);
await queryInterface.removeColumn(
'users',
'app_roleId',
{ transaction }
);
await queryInterface.removeColumn(
'users',
'provider',
{ transaction }
);
await queryInterface.removeColumn(
'users',
'passwordResetTokenExpiresAt',
{ transaction }
);
await queryInterface.removeColumn(
'users',
'passwordResetToken',
{ transaction }
);
await queryInterface.removeColumn(
'users',
'emailVerificationTokenExpiresAt',
{ transaction }
);
await queryInterface.removeColumn(
'users',
'emailVerificationToken',
{ transaction }
);
await queryInterface.removeColumn(
'users',
'emailVerified',
{ transaction }
);
await queryInterface.removeColumn(
'users',
'password',
{ transaction }
);
await queryInterface.removeColumn(
'users',
'disabled',
{ transaction }
);
await queryInterface.removeColumn(
'users',
'email',
{ transaction }
);
await queryInterface.removeColumn(
'users',
'phoneNumber',
{ transaction }
);
await queryInterface.removeColumn(
'users',
'lastName',
{ transaction }
);
await queryInterface.removeColumn(
'users',
'firstName',
{ transaction }
);
await queryInterface.dropTable('integrations', { transaction });
await queryInterface.dropTable('roi_metrics', { transaction });
await queryInterface.dropTable('tool_access_rules', { transaction });
await queryInterface.dropTable('training_completions', { transaction });
await queryInterface.dropTable('training_courses', { transaction });
await queryInterface.dropTable('human_review_tasks', { transaction });
await queryInterface.dropTable('prompt_audit_logs', { transaction });
await queryInterface.dropTable('workflow_runs', { transaction });
await queryInterface.dropTable('ai_workflows', { transaction });
await queryInterface.dropTable('policies', { transaction });
await queryInterface.dropTable('approval_steps', { transaction });
await queryInterface.dropTable('ai_use_case_requests', { transaction });
await queryInterface.dropTable('vendor_risk_assessments', { transaction });
await queryInterface.dropTable('vendors', { transaction });
await queryInterface.dropTable('ai_tools', { transaction });
await queryInterface.dropTable('matters', { transaction });
await queryInterface.dropTable('permissions', { transaction });
await queryInterface.dropTable('roles', { transaction });
await queryInterface.dropTable('users', { transaction });
await transaction.commit();
} catch (err) {
await transaction.rollback();
throw err;
}
}
};