39403-vm/backend/src/db/migrations/1774898157816.js
2026-03-30 19:17:28 +00:00

5776 lines
184 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('organizations', {
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('organization_memberships', {
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('projects', {
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('workspaces', {
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('llm_providers', {
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('llm_models', {
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('llm_api_keys', {
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('key_rotation_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('prompt_templates', {
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('chats', {
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('chat_messages', {
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('encryption_sessions', {
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('code_repositories', {
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('code_files', {
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('code_change_sets', {
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('code_patches', {
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('build_jobs', {
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('build_pipelines', {
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('build_artifacts', {
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('web_search_queries', {
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('web_search_results', {
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('system_health_checks', {
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('audit_events', {
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(
'users',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
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(
'roles',
'globalAccess',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'permissions',
'name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'organizations',
'name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'organization_memberships',
'organizationId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'organization_memberships',
'userId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'users',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'organization_memberships',
'member_role',
{
type: Sequelize.DataTypes.ENUM,
values: ['owner','admin','member','billing'],
},
{ transaction }
);
await queryInterface.addColumn(
'organization_memberships',
'joined_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'organization_memberships',
'is_active',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'projects',
'organizationId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'projects',
'name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'projects',
'description',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'projects',
'visibility',
{
type: Sequelize.DataTypes.ENUM,
values: ['private','internal','public'],
},
{ transaction }
);
await queryInterface.addColumn(
'projects',
'status',
{
type: Sequelize.DataTypes.ENUM,
values: ['active','archived'],
},
{ transaction }
);
await queryInterface.addColumn(
'projects',
'last_activity_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'workspaces',
'projectId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'projects',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'workspaces',
'name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'workspaces',
'status',
{
type: Sequelize.DataTypes.ENUM,
values: ['active','paused','archived'],
},
{ transaction }
);
await queryInterface.addColumn(
'workspaces',
'last_opened_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'workspaces',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'llm_providers',
'name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'llm_providers',
'base_url',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'llm_providers',
'provider_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['deepseek','queen','openai_compatible','custom'],
},
{ transaction }
);
await queryInterface.addColumn(
'llm_providers',
'region_policy',
{
type: Sequelize.DataTypes.ENUM,
values: ['allowed','blocked','unknown'],
},
{ transaction }
);
await queryInterface.addColumn(
'llm_providers',
'supports_streaming',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'llm_providers',
'supports_tools',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'llm_providers',
'is_active',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'llm_providers',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'llm_models',
'providerId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'llm_providers',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'llm_models',
'name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'llm_models',
'model_code',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'llm_models',
'max_input_tokens',
{
type: Sequelize.DataTypes.INTEGER,
},
{ transaction }
);
await queryInterface.addColumn(
'llm_models',
'max_output_tokens',
{
type: Sequelize.DataTypes.INTEGER,
},
{ transaction }
);
await queryInterface.addColumn(
'llm_models',
'supports_vision',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'llm_models',
'supports_function_calling',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'llm_models',
'price_per_million_input_tokens',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'llm_models',
'price_per_million_output_tokens',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'llm_models',
'is_active',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'llm_models',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'llm_api_keys',
'providerId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'llm_providers',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'llm_api_keys',
'label',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'llm_api_keys',
'key_fingerprint',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'llm_api_keys',
'key_status',
{
type: Sequelize.DataTypes.ENUM,
values: ['active','disabled','rate_limited','compromised'],
},
{ transaction }
);
await queryInterface.addColumn(
'llm_api_keys',
'last_rotated_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'llm_api_keys',
'expires_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'llm_api_keys',
'is_primary',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'llm_api_keys',
'requests_per_minute_limit',
{
type: Sequelize.DataTypes.INTEGER,
},
{ transaction }
);
await queryInterface.addColumn(
'llm_api_keys',
'daily_request_limit',
{
type: Sequelize.DataTypes.INTEGER,
},
{ transaction }
);
await queryInterface.addColumn(
'llm_api_keys',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'key_rotation_policies',
'providerId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'llm_providers',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'key_rotation_policies',
'name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'key_rotation_policies',
'strategy',
{
type: Sequelize.DataTypes.ENUM,
values: ['round_robin','least_used','health_based','priority_weighted'],
},
{ transaction }
);
await queryInterface.addColumn(
'key_rotation_policies',
'rotate_every_seconds',
{
type: Sequelize.DataTypes.INTEGER,
},
{ transaction }
);
await queryInterface.addColumn(
'key_rotation_policies',
'auto_disable_on_errors',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'key_rotation_policies',
'error_threshold',
{
type: Sequelize.DataTypes.INTEGER,
},
{ transaction }
);
await queryInterface.addColumn(
'key_rotation_policies',
'cooldown_seconds',
{
type: Sequelize.DataTypes.INTEGER,
},
{ transaction }
);
await queryInterface.addColumn(
'key_rotation_policies',
'is_active',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'key_rotation_policies',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'prompt_templates',
'organizationId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'prompt_templates',
'name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'prompt_templates',
'category',
{
type: Sequelize.DataTypes.ENUM,
values: ['system','developer','user','tooling','safety','codegen','review','debug'],
},
{ transaction }
);
await queryInterface.addColumn(
'prompt_templates',
'content',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'prompt_templates',
'is_active',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'prompt_templates',
'version',
{
type: Sequelize.DataTypes.INTEGER,
},
{ transaction }
);
await queryInterface.addColumn(
'prompt_templates',
'published_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'chats',
'workspaceId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'workspaces',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'chats',
'userId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'users',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'chats',
'title',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'chats',
'chat_status',
{
type: Sequelize.DataTypes.ENUM,
values: ['active','closed','archived'],
},
{ transaction }
);
await queryInterface.addColumn(
'chats',
'modelId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'llm_models',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'chats',
'is_encrypted_e2ee',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'chats',
'started_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'chats',
'last_message_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'chats',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'chat_messages',
'chatId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'chats',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'chat_messages',
'sender_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['user','assistant','system','tool'],
},
{ transaction }
);
await queryInterface.addColumn(
'chat_messages',
'sender_label',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'chat_messages',
'content_ciphertext',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'chat_messages',
'content_preview',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'chat_messages',
'encryption_key_id',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'chat_messages',
'sent_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'chat_messages',
'token_count_input',
{
type: Sequelize.DataTypes.INTEGER,
},
{ transaction }
);
await queryInterface.addColumn(
'chat_messages',
'token_count_output',
{
type: Sequelize.DataTypes.INTEGER,
},
{ transaction }
);
await queryInterface.addColumn(
'chat_messages',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'encryption_sessions',
'chatId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'chats',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'encryption_sessions',
'session_key_id',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'encryption_sessions',
'algorithm',
{
type: Sequelize.DataTypes.ENUM,
values: ['rsa','ecdh','aes_gcm','xchacha20_poly1305'],
},
{ transaction }
);
await queryInterface.addColumn(
'encryption_sessions',
'key_length_bits',
{
type: Sequelize.DataTypes.INTEGER,
},
{ transaction }
);
await queryInterface.addColumn(
'encryption_sessions',
'valid_from',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'encryption_sessions',
'valid_until',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'encryption_sessions',
'is_discarded',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'encryption_sessions',
'discarded_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'encryption_sessions',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'code_repositories',
'workspaceId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'workspaces',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'code_repositories',
'name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'code_repositories',
'repo_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['local','git','generated'],
},
{ transaction }
);
await queryInterface.addColumn(
'code_repositories',
'remote_url',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'code_repositories',
'default_branch',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'code_repositories',
'status',
{
type: Sequelize.DataTypes.ENUM,
values: ['ready','syncing','error'],
},
{ transaction }
);
await queryInterface.addColumn(
'code_repositories',
'last_sync_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'code_repositories',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'code_files',
'repositoryId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'code_repositories',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'code_files',
'path',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'code_files',
'language',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'code_files',
'content',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'code_files',
'content_hash',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'code_files',
'last_modified_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'code_files',
'is_binary',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'code_files',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'code_change_sets',
'workspaceId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'workspaces',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'code_change_sets',
'userId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'users',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'code_change_sets',
'title',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'code_change_sets',
'summary',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'code_change_sets',
'status',
{
type: Sequelize.DataTypes.ENUM,
values: ['draft','proposed','applied','rolled_back','failed'],
},
{ transaction }
);
await queryInterface.addColumn(
'code_change_sets',
'created_at_time',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'code_change_sets',
'applied_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'code_change_sets',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'code_patches',
'change_setId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'code_change_sets',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'code_patches',
'file_path',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'code_patches',
'change_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['create','update','delete','rename'],
},
{ transaction }
);
await queryInterface.addColumn(
'code_patches',
'diff_text',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'code_patches',
'applied_successfully',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'code_patches',
'error_message',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'code_patches',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'build_jobs',
'workspaceId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'workspaces',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'build_jobs',
'userId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'users',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'build_jobs',
'name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'build_jobs',
'target_platform',
{
type: Sequelize.DataTypes.ENUM,
values: ['android_apk','android_aab','docker_image','web_preview'],
},
{ transaction }
);
await queryInterface.addColumn(
'build_jobs',
'status',
{
type: Sequelize.DataTypes.ENUM,
values: ['queued','running','succeeded','failed','canceled'],
},
{ transaction }
);
await queryInterface.addColumn(
'build_jobs',
'queued_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'build_jobs',
'started_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'build_jobs',
'finished_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'build_jobs',
'pipelineId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'build_pipelines',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'build_jobs',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'build_pipelines',
'organizationId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'build_pipelines',
'name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'build_pipelines',
'description',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'build_pipelines',
'pipeline_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['apk_build','test','deploy','full_ci_cd'],
},
{ transaction }
);
await queryInterface.addColumn(
'build_pipelines',
'is_active',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'build_pipelines',
'config_yaml',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'build_artifacts',
'build_jobId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'build_jobs',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'build_artifacts',
'artifact_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['apk','aab','zip','log','report','preview_url'],
},
{ transaction }
);
await queryInterface.addColumn(
'build_artifacts',
'file_name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'build_artifacts',
'download_url',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'build_artifacts',
'checksum_sha256',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'build_artifacts',
'generated_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'build_artifacts',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'web_search_queries',
'workspaceId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'workspaces',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'web_search_queries',
'userId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'users',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'web_search_queries',
'query_text',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'web_search_queries',
'status',
{
type: Sequelize.DataTypes.ENUM,
values: ['queued','running','succeeded','failed'],
},
{ transaction }
);
await queryInterface.addColumn(
'web_search_queries',
'requested_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'web_search_queries',
'completed_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'web_search_queries',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'web_search_results',
'queryId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'web_search_queries',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'web_search_results',
'title',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'web_search_results',
'url',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'web_search_results',
'snippet',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'web_search_results',
'fetched_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'web_search_results',
'rank',
{
type: Sequelize.DataTypes.INTEGER,
},
{ transaction }
);
await queryInterface.addColumn(
'web_search_results',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'system_health_checks',
'component',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'system_health_checks',
'status',
{
type: Sequelize.DataTypes.ENUM,
values: ['healthy','degraded','down'],
},
{ transaction }
);
await queryInterface.addColumn(
'system_health_checks',
'latency_ms',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'system_health_checks',
'error_rate_percent',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'system_health_checks',
'checked_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'system_health_checks',
'details',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'system_health_checks',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'audit_events',
'organizationId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'audit_events',
'actorId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'users',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'audit_events',
'action',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'audit_events',
'entity_name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'audit_events',
'entity_key',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'audit_events',
'severity',
{
type: Sequelize.DataTypes.ENUM,
values: ['info','warning','critical'],
},
{ transaction }
);
await queryInterface.addColumn(
'audit_events',
'occurred_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'audit_events',
'metadata_json',
{
type: Sequelize.DataTypes.TEXT,
},
{ 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(
'audit_events',
'metadata_json',
{ transaction }
);
await queryInterface.removeColumn(
'audit_events',
'occurred_at',
{ transaction }
);
await queryInterface.removeColumn(
'audit_events',
'severity',
{ transaction }
);
await queryInterface.removeColumn(
'audit_events',
'entity_key',
{ transaction }
);
await queryInterface.removeColumn(
'audit_events',
'entity_name',
{ transaction }
);
await queryInterface.removeColumn(
'audit_events',
'action',
{ transaction }
);
await queryInterface.removeColumn(
'audit_events',
'actorId',
{ transaction }
);
await queryInterface.removeColumn(
'audit_events',
'organizationId',
{ transaction }
);
await queryInterface.removeColumn(
'system_health_checks',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'system_health_checks',
'details',
{ transaction }
);
await queryInterface.removeColumn(
'system_health_checks',
'checked_at',
{ transaction }
);
await queryInterface.removeColumn(
'system_health_checks',
'error_rate_percent',
{ transaction }
);
await queryInterface.removeColumn(
'system_health_checks',
'latency_ms',
{ transaction }
);
await queryInterface.removeColumn(
'system_health_checks',
'status',
{ transaction }
);
await queryInterface.removeColumn(
'system_health_checks',
'component',
{ transaction }
);
await queryInterface.removeColumn(
'web_search_results',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'web_search_results',
'rank',
{ transaction }
);
await queryInterface.removeColumn(
'web_search_results',
'fetched_at',
{ transaction }
);
await queryInterface.removeColumn(
'web_search_results',
'snippet',
{ transaction }
);
await queryInterface.removeColumn(
'web_search_results',
'url',
{ transaction }
);
await queryInterface.removeColumn(
'web_search_results',
'title',
{ transaction }
);
await queryInterface.removeColumn(
'web_search_results',
'queryId',
{ transaction }
);
await queryInterface.removeColumn(
'web_search_queries',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'web_search_queries',
'completed_at',
{ transaction }
);
await queryInterface.removeColumn(
'web_search_queries',
'requested_at',
{ transaction }
);
await queryInterface.removeColumn(
'web_search_queries',
'status',
{ transaction }
);
await queryInterface.removeColumn(
'web_search_queries',
'query_text',
{ transaction }
);
await queryInterface.removeColumn(
'web_search_queries',
'userId',
{ transaction }
);
await queryInterface.removeColumn(
'web_search_queries',
'workspaceId',
{ transaction }
);
await queryInterface.removeColumn(
'build_artifacts',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'build_artifacts',
'generated_at',
{ transaction }
);
await queryInterface.removeColumn(
'build_artifacts',
'checksum_sha256',
{ transaction }
);
await queryInterface.removeColumn(
'build_artifacts',
'download_url',
{ transaction }
);
await queryInterface.removeColumn(
'build_artifacts',
'file_name',
{ transaction }
);
await queryInterface.removeColumn(
'build_artifacts',
'artifact_type',
{ transaction }
);
await queryInterface.removeColumn(
'build_artifacts',
'build_jobId',
{ transaction }
);
await queryInterface.removeColumn(
'build_pipelines',
'config_yaml',
{ transaction }
);
await queryInterface.removeColumn(
'build_pipelines',
'is_active',
{ transaction }
);
await queryInterface.removeColumn(
'build_pipelines',
'pipeline_type',
{ transaction }
);
await queryInterface.removeColumn(
'build_pipelines',
'description',
{ transaction }
);
await queryInterface.removeColumn(
'build_pipelines',
'name',
{ transaction }
);
await queryInterface.removeColumn(
'build_pipelines',
'organizationId',
{ transaction }
);
await queryInterface.removeColumn(
'build_jobs',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'build_jobs',
'pipelineId',
{ transaction }
);
await queryInterface.removeColumn(
'build_jobs',
'finished_at',
{ transaction }
);
await queryInterface.removeColumn(
'build_jobs',
'started_at',
{ transaction }
);
await queryInterface.removeColumn(
'build_jobs',
'queued_at',
{ transaction }
);
await queryInterface.removeColumn(
'build_jobs',
'status',
{ transaction }
);
await queryInterface.removeColumn(
'build_jobs',
'target_platform',
{ transaction }
);
await queryInterface.removeColumn(
'build_jobs',
'name',
{ transaction }
);
await queryInterface.removeColumn(
'build_jobs',
'userId',
{ transaction }
);
await queryInterface.removeColumn(
'build_jobs',
'workspaceId',
{ transaction }
);
await queryInterface.removeColumn(
'code_patches',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'code_patches',
'error_message',
{ transaction }
);
await queryInterface.removeColumn(
'code_patches',
'applied_successfully',
{ transaction }
);
await queryInterface.removeColumn(
'code_patches',
'diff_text',
{ transaction }
);
await queryInterface.removeColumn(
'code_patches',
'change_type',
{ transaction }
);
await queryInterface.removeColumn(
'code_patches',
'file_path',
{ transaction }
);
await queryInterface.removeColumn(
'code_patches',
'change_setId',
{ transaction }
);
await queryInterface.removeColumn(
'code_change_sets',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'code_change_sets',
'applied_at',
{ transaction }
);
await queryInterface.removeColumn(
'code_change_sets',
'created_at_time',
{ transaction }
);
await queryInterface.removeColumn(
'code_change_sets',
'status',
{ transaction }
);
await queryInterface.removeColumn(
'code_change_sets',
'summary',
{ transaction }
);
await queryInterface.removeColumn(
'code_change_sets',
'title',
{ transaction }
);
await queryInterface.removeColumn(
'code_change_sets',
'userId',
{ transaction }
);
await queryInterface.removeColumn(
'code_change_sets',
'workspaceId',
{ transaction }
);
await queryInterface.removeColumn(
'code_files',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'code_files',
'is_binary',
{ transaction }
);
await queryInterface.removeColumn(
'code_files',
'last_modified_at',
{ transaction }
);
await queryInterface.removeColumn(
'code_files',
'content_hash',
{ transaction }
);
await queryInterface.removeColumn(
'code_files',
'content',
{ transaction }
);
await queryInterface.removeColumn(
'code_files',
'language',
{ transaction }
);
await queryInterface.removeColumn(
'code_files',
'path',
{ transaction }
);
await queryInterface.removeColumn(
'code_files',
'repositoryId',
{ transaction }
);
await queryInterface.removeColumn(
'code_repositories',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'code_repositories',
'last_sync_at',
{ transaction }
);
await queryInterface.removeColumn(
'code_repositories',
'status',
{ transaction }
);
await queryInterface.removeColumn(
'code_repositories',
'default_branch',
{ transaction }
);
await queryInterface.removeColumn(
'code_repositories',
'remote_url',
{ transaction }
);
await queryInterface.removeColumn(
'code_repositories',
'repo_type',
{ transaction }
);
await queryInterface.removeColumn(
'code_repositories',
'name',
{ transaction }
);
await queryInterface.removeColumn(
'code_repositories',
'workspaceId',
{ transaction }
);
await queryInterface.removeColumn(
'encryption_sessions',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'encryption_sessions',
'discarded_at',
{ transaction }
);
await queryInterface.removeColumn(
'encryption_sessions',
'is_discarded',
{ transaction }
);
await queryInterface.removeColumn(
'encryption_sessions',
'valid_until',
{ transaction }
);
await queryInterface.removeColumn(
'encryption_sessions',
'valid_from',
{ transaction }
);
await queryInterface.removeColumn(
'encryption_sessions',
'key_length_bits',
{ transaction }
);
await queryInterface.removeColumn(
'encryption_sessions',
'algorithm',
{ transaction }
);
await queryInterface.removeColumn(
'encryption_sessions',
'session_key_id',
{ transaction }
);
await queryInterface.removeColumn(
'encryption_sessions',
'chatId',
{ transaction }
);
await queryInterface.removeColumn(
'chat_messages',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'chat_messages',
'token_count_output',
{ transaction }
);
await queryInterface.removeColumn(
'chat_messages',
'token_count_input',
{ transaction }
);
await queryInterface.removeColumn(
'chat_messages',
'sent_at',
{ transaction }
);
await queryInterface.removeColumn(
'chat_messages',
'encryption_key_id',
{ transaction }
);
await queryInterface.removeColumn(
'chat_messages',
'content_preview',
{ transaction }
);
await queryInterface.removeColumn(
'chat_messages',
'content_ciphertext',
{ transaction }
);
await queryInterface.removeColumn(
'chat_messages',
'sender_label',
{ transaction }
);
await queryInterface.removeColumn(
'chat_messages',
'sender_type',
{ transaction }
);
await queryInterface.removeColumn(
'chat_messages',
'chatId',
{ transaction }
);
await queryInterface.removeColumn(
'chats',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'chats',
'last_message_at',
{ transaction }
);
await queryInterface.removeColumn(
'chats',
'started_at',
{ transaction }
);
await queryInterface.removeColumn(
'chats',
'is_encrypted_e2ee',
{ transaction }
);
await queryInterface.removeColumn(
'chats',
'modelId',
{ transaction }
);
await queryInterface.removeColumn(
'chats',
'chat_status',
{ transaction }
);
await queryInterface.removeColumn(
'chats',
'title',
{ transaction }
);
await queryInterface.removeColumn(
'chats',
'userId',
{ transaction }
);
await queryInterface.removeColumn(
'chats',
'workspaceId',
{ transaction }
);
await queryInterface.removeColumn(
'prompt_templates',
'published_at',
{ transaction }
);
await queryInterface.removeColumn(
'prompt_templates',
'version',
{ transaction }
);
await queryInterface.removeColumn(
'prompt_templates',
'is_active',
{ transaction }
);
await queryInterface.removeColumn(
'prompt_templates',
'content',
{ transaction }
);
await queryInterface.removeColumn(
'prompt_templates',
'category',
{ transaction }
);
await queryInterface.removeColumn(
'prompt_templates',
'name',
{ transaction }
);
await queryInterface.removeColumn(
'prompt_templates',
'organizationId',
{ transaction }
);
await queryInterface.removeColumn(
'key_rotation_policies',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'key_rotation_policies',
'is_active',
{ transaction }
);
await queryInterface.removeColumn(
'key_rotation_policies',
'cooldown_seconds',
{ transaction }
);
await queryInterface.removeColumn(
'key_rotation_policies',
'error_threshold',
{ transaction }
);
await queryInterface.removeColumn(
'key_rotation_policies',
'auto_disable_on_errors',
{ transaction }
);
await queryInterface.removeColumn(
'key_rotation_policies',
'rotate_every_seconds',
{ transaction }
);
await queryInterface.removeColumn(
'key_rotation_policies',
'strategy',
{ transaction }
);
await queryInterface.removeColumn(
'key_rotation_policies',
'name',
{ transaction }
);
await queryInterface.removeColumn(
'key_rotation_policies',
'providerId',
{ transaction }
);
await queryInterface.removeColumn(
'llm_api_keys',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'llm_api_keys',
'daily_request_limit',
{ transaction }
);
await queryInterface.removeColumn(
'llm_api_keys',
'requests_per_minute_limit',
{ transaction }
);
await queryInterface.removeColumn(
'llm_api_keys',
'is_primary',
{ transaction }
);
await queryInterface.removeColumn(
'llm_api_keys',
'expires_at',
{ transaction }
);
await queryInterface.removeColumn(
'llm_api_keys',
'last_rotated_at',
{ transaction }
);
await queryInterface.removeColumn(
'llm_api_keys',
'key_status',
{ transaction }
);
await queryInterface.removeColumn(
'llm_api_keys',
'key_fingerprint',
{ transaction }
);
await queryInterface.removeColumn(
'llm_api_keys',
'label',
{ transaction }
);
await queryInterface.removeColumn(
'llm_api_keys',
'providerId',
{ transaction }
);
await queryInterface.removeColumn(
'llm_models',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'llm_models',
'is_active',
{ transaction }
);
await queryInterface.removeColumn(
'llm_models',
'price_per_million_output_tokens',
{ transaction }
);
await queryInterface.removeColumn(
'llm_models',
'price_per_million_input_tokens',
{ transaction }
);
await queryInterface.removeColumn(
'llm_models',
'supports_function_calling',
{ transaction }
);
await queryInterface.removeColumn(
'llm_models',
'supports_vision',
{ transaction }
);
await queryInterface.removeColumn(
'llm_models',
'max_output_tokens',
{ transaction }
);
await queryInterface.removeColumn(
'llm_models',
'max_input_tokens',
{ transaction }
);
await queryInterface.removeColumn(
'llm_models',
'model_code',
{ transaction }
);
await queryInterface.removeColumn(
'llm_models',
'name',
{ transaction }
);
await queryInterface.removeColumn(
'llm_models',
'providerId',
{ transaction }
);
await queryInterface.removeColumn(
'llm_providers',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'llm_providers',
'is_active',
{ transaction }
);
await queryInterface.removeColumn(
'llm_providers',
'supports_tools',
{ transaction }
);
await queryInterface.removeColumn(
'llm_providers',
'supports_streaming',
{ transaction }
);
await queryInterface.removeColumn(
'llm_providers',
'region_policy',
{ transaction }
);
await queryInterface.removeColumn(
'llm_providers',
'provider_type',
{ transaction }
);
await queryInterface.removeColumn(
'llm_providers',
'base_url',
{ transaction }
);
await queryInterface.removeColumn(
'llm_providers',
'name',
{ transaction }
);
await queryInterface.removeColumn(
'workspaces',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'workspaces',
'last_opened_at',
{ transaction }
);
await queryInterface.removeColumn(
'workspaces',
'status',
{ transaction }
);
await queryInterface.removeColumn(
'workspaces',
'name',
{ transaction }
);
await queryInterface.removeColumn(
'workspaces',
'projectId',
{ transaction }
);
await queryInterface.removeColumn(
'projects',
'last_activity_at',
{ transaction }
);
await queryInterface.removeColumn(
'projects',
'status',
{ transaction }
);
await queryInterface.removeColumn(
'projects',
'visibility',
{ transaction }
);
await queryInterface.removeColumn(
'projects',
'description',
{ transaction }
);
await queryInterface.removeColumn(
'projects',
'name',
{ transaction }
);
await queryInterface.removeColumn(
'projects',
'organizationId',
{ transaction }
);
await queryInterface.removeColumn(
'organization_memberships',
'is_active',
{ transaction }
);
await queryInterface.removeColumn(
'organization_memberships',
'joined_at',
{ transaction }
);
await queryInterface.removeColumn(
'organization_memberships',
'member_role',
{ transaction }
);
await queryInterface.removeColumn(
'organization_memberships',
'userId',
{ transaction }
);
await queryInterface.removeColumn(
'organization_memberships',
'organizationId',
{ transaction }
);
await queryInterface.removeColumn(
'organizations',
'name',
{ transaction }
);
await queryInterface.removeColumn(
'permissions',
'name',
{ transaction }
);
await queryInterface.removeColumn(
'roles',
'globalAccess',
{ transaction }
);
await queryInterface.removeColumn(
'roles',
'role_customization',
{ transaction }
);
await queryInterface.removeColumn(
'roles',
'name',
{ transaction }
);
await queryInterface.removeColumn(
'users',
'organizationsId',
{ 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('audit_events', { transaction });
await queryInterface.dropTable('system_health_checks', { transaction });
await queryInterface.dropTable('web_search_results', { transaction });
await queryInterface.dropTable('web_search_queries', { transaction });
await queryInterface.dropTable('build_artifacts', { transaction });
await queryInterface.dropTable('build_pipelines', { transaction });
await queryInterface.dropTable('build_jobs', { transaction });
await queryInterface.dropTable('code_patches', { transaction });
await queryInterface.dropTable('code_change_sets', { transaction });
await queryInterface.dropTable('code_files', { transaction });
await queryInterface.dropTable('code_repositories', { transaction });
await queryInterface.dropTable('encryption_sessions', { transaction });
await queryInterface.dropTable('chat_messages', { transaction });
await queryInterface.dropTable('chats', { transaction });
await queryInterface.dropTable('prompt_templates', { transaction });
await queryInterface.dropTable('key_rotation_policies', { transaction });
await queryInterface.dropTable('llm_api_keys', { transaction });
await queryInterface.dropTable('llm_models', { transaction });
await queryInterface.dropTable('llm_providers', { transaction });
await queryInterface.dropTable('workspaces', { transaction });
await queryInterface.dropTable('projects', { transaction });
await queryInterface.dropTable('organization_memberships', { transaction });
await queryInterface.dropTable('organizations', { 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;
}
}
};