5353 lines
172 KiB
JavaScript
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;
|
|
}
|
|
}
|
|
};
|