39289-vm/backend/src/db/migrations/1774346060832.js
2026-03-24 09:55:44 +00:00

5377 lines
171 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('data_sources', {
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('assets', {
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('time_series', {
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('mining_companies', {
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('mining_fundamentals', {
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('macro_indicators', {
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('geopolitical_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.createTable('geopolitical_scores', {
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('feature_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('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('model_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('forecasts', {
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('factor_attributions', {
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('scenarios', {
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('scenario_shocks', {
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('scenario_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('alerts', {
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('alert_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.createTable('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('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(
'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(
'data_sources',
'name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'data_sources',
'category',
{
type: Sequelize.DataTypes.ENUM,
values: ['spot_prices','gold_miners','macroeconomic','geopolitical','additional_variables'],
},
{ transaction }
);
await queryInterface.addColumn(
'data_sources',
'ingestion_mode',
{
type: Sequelize.DataTypes.ENUM,
values: ['streaming','batch','hybrid'],
},
{ transaction }
);
await queryInterface.addColumn(
'data_sources',
'connection_type',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'data_sources',
'coverage_description',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'data_sources',
'refresh_rate',
{
type: Sequelize.DataTypes.ENUM,
values: ['real_time','minute','hourly','daily','weekly','monthly','quarterly','event_driven'],
},
{ transaction }
);
await queryInterface.addColumn(
'data_sources',
'is_enabled',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'data_sources',
'last_success_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'data_sources',
'last_failure_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'data_sources',
'last_failure_reason',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'assets',
'symbol',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'assets',
'name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'assets',
'asset_class',
{
type: Sequelize.DataTypes.ENUM,
values: ['commodity_spot','commodity_future','equity','equity_index','fx','rate','macro_series','risk_index','sentiment_index','energy','crypto','other'],
},
{ transaction }
);
await queryInterface.addColumn(
'assets',
'currency',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'assets',
'exchange_venue',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'assets',
'is_active',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'assets',
'primary_data_sourceId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'data_sources',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'time_series',
'assetId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'assets',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'time_series',
'timestamp',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'time_series',
'bar_size',
{
type: Sequelize.DataTypes.ENUM,
values: ['tick','1m','5m','15m','1h','1d','1w','1mo','1q','1y'],
},
{ transaction }
);
await queryInterface.addColumn(
'time_series',
'open',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'time_series',
'high',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'time_series',
'low',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'time_series',
'close',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'time_series',
'volume',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'time_series',
'vwap',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'time_series',
'is_imputed',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'time_series',
'quality_flag',
{
type: Sequelize.DataTypes.ENUM,
values: ['ok','warning','bad'],
},
{ transaction }
);
await queryInterface.addColumn(
'mining_companies',
'ticker',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'mining_companies',
'company_name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'mining_companies',
'country',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'mining_companies',
'primary_mines',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'mining_companies',
'is_major_producer',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'mining_companies',
'equity_assetId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'assets',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'mining_fundamentals',
'mining_companyId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'mining_companies',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'mining_fundamentals',
'reporting_period',
{
type: Sequelize.DataTypes.ENUM,
values: ['quarterly','annual'],
},
{ transaction }
);
await queryInterface.addColumn(
'mining_fundamentals',
'period_end_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'mining_fundamentals',
'production_oz',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'mining_fundamentals',
'all_in_sustaining_cost',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'mining_fundamentals',
'cash_cost',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'mining_fundamentals',
'reserves_oz',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'mining_fundamentals',
'revenue',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'mining_fundamentals',
'ebitda',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'mining_fundamentals',
'free_cash_flow',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'mining_fundamentals',
'debt_to_equity',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'mining_fundamentals',
'operating_margin',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'mining_fundamentals',
'notes',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'macro_indicators',
'code',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'macro_indicators',
'name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'macro_indicators',
'indicator_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['interest_rate','inflation','currency_strength','gdp','employment','pmi','liquidity','credit_spread','real_rate','other'],
},
{ transaction }
);
await queryInterface.addColumn(
'macro_indicators',
'frequency',
{
type: Sequelize.DataTypes.ENUM,
values: ['daily','weekly','monthly','quarterly','annual'],
},
{ transaction }
);
await queryInterface.addColumn(
'macro_indicators',
'unit',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'macro_indicators',
'region',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'macro_indicators',
'data_sourceId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'data_sources',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'macro_indicators',
'series_assetId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'assets',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'macro_indicators',
'is_active',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'geopolitical_events',
'title',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'geopolitical_events',
'focus_area',
{
type: Sequelize.DataTypes.ENUM,
values: ['iran_conflict','middle_east','europe','asia_pacific','americas','global'],
},
{ transaction }
);
await queryInterface.addColumn(
'geopolitical_events',
'event_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['military','sanctions','diplomatic','election','terrorism','shipping_disruption','energy_shock','cyber','other'],
},
{ transaction }
);
await queryInterface.addColumn(
'geopolitical_events',
'severity',
{
type: Sequelize.DataTypes.ENUM,
values: ['low','medium','high','critical'],
},
{ transaction }
);
await queryInterface.addColumn(
'geopolitical_events',
'event_start_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'geopolitical_events',
'event_end_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'geopolitical_events',
'summary',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'geopolitical_events',
'source_summary',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'geopolitical_events',
'confidence_score',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'geopolitical_events',
'data_sourceId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'data_sources',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'geopolitical_scores',
'as_of_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'geopolitical_scores',
'score_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['news_sentiment','event_intensity','expert_overlay','composite_risk'],
},
{ transaction }
);
await queryInterface.addColumn(
'geopolitical_scores',
'horizon',
{
type: Sequelize.DataTypes.ENUM,
values: ['intraday','daily','weekly','monthly'],
},
{ transaction }
);
await queryInterface.addColumn(
'geopolitical_scores',
'score_value',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'geopolitical_scores',
'iran_conflict_weight',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'geopolitical_scores',
'methodology_note',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'geopolitical_scores',
'related_eventId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'geopolitical_events',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'geopolitical_scores',
'data_sourceId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'data_sources',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'feature_sets',
'name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'feature_sets',
'description',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'feature_sets',
'version_stage',
{
type: Sequelize.DataTypes.ENUM,
values: ['research','staging','production','deprecated'],
},
{ transaction }
);
await queryInterface.addColumn(
'feature_sets',
'effective_from_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'feature_sets',
'effective_to_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'models',
'name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'models',
'model_family',
{
type: Sequelize.DataTypes.ENUM,
values: ['time_series','traditional_ml','deep_learning','bayesian','hybrid'],
},
{ transaction }
);
await queryInterface.addColumn(
'models',
'training_mode',
{
type: Sequelize.DataTypes.ENUM,
values: ['batch','incremental'],
},
{ transaction }
);
await queryInterface.addColumn(
'models',
'status',
{
type: Sequelize.DataTypes.ENUM,
values: ['research','staging','production','retired'],
},
{ transaction }
);
await queryInterface.addColumn(
'models',
'objective',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'models',
'target_metric_value',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'models',
'last_trained_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'models',
'artifact_uri',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'models',
'config_snapshot',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'models',
'feature_setId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'feature_sets',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'models',
'ownerId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'users',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'model_runs',
'modelId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'models',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'model_runs',
'run_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['training','backtest','walk_forward','stress_test','inference_validation'],
},
{ transaction }
);
await queryInterface.addColumn(
'model_runs',
'run_status',
{
type: Sequelize.DataTypes.ENUM,
values: ['queued','running','succeeded','failed','canceled'],
},
{ transaction }
);
await queryInterface.addColumn(
'model_runs',
'started_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'model_runs',
'ended_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'model_runs',
'data_window',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'model_runs',
'metrics_summary',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'model_runs',
'error_details',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'forecasts',
'modelId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'models',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'forecasts',
'target_assetId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'assets',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'forecasts',
'as_of_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'forecasts',
'horizon',
{
type: Sequelize.DataTypes.ENUM,
values: ['daily','weekly','monthly','quarterly','annual'],
},
{ transaction }
);
await queryInterface.addColumn(
'forecasts',
'target_time_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'forecasts',
'point_estimate',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'forecasts',
'p10',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'forecasts',
'p50',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'forecasts',
'p90',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'forecasts',
'volatility_forecast',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'forecasts',
'signal_direction',
{
type: Sequelize.DataTypes.ENUM,
values: ['strong_buy','buy','neutral','sell','strong_sell'],
},
{ transaction }
);
await queryInterface.addColumn(
'forecasts',
'signal_confidence',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'forecasts',
'explainability_summary',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'factor_attributions',
'forecastId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'forecasts',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'factor_attributions',
'factor_name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'factor_attributions',
'factor_category',
{
type: Sequelize.DataTypes.ENUM,
values: ['spot_prices','gold_miners','macroeconomic','geopolitical','additional_variables','technical','model_internal'],
},
{ transaction }
);
await queryInterface.addColumn(
'factor_attributions',
'contribution',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'factor_attributions',
'importance',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'factor_attributions',
'notes',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'scenarios',
'name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'scenarios',
'scenario_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['macro_shock','geopolitical_shock','rates_shift','inflation_shift','fx_shift','energy_shock','central_bank_activity','custom'],
},
{ transaction }
);
await queryInterface.addColumn(
'scenarios',
'status',
{
type: Sequelize.DataTypes.ENUM,
values: ['draft','approved','archived'],
},
{ transaction }
);
await queryInterface.addColumn(
'scenarios',
'description',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'scenarios',
'valid_from_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'scenarios',
'valid_to_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'scenarios',
'probability_weight',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'scenarios',
'ownerId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'users',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'scenario_shocks',
'scenarioId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'scenarios',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'scenario_shocks',
'assetId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'assets',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'scenario_shocks',
'shock_style',
{
type: Sequelize.DataTypes.ENUM,
values: ['absolute','percent','path'],
},
{ transaction }
);
await queryInterface.addColumn(
'scenario_shocks',
'shock_value',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'scenario_shocks',
'shock_start_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'scenario_shocks',
'shock_end_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'scenario_shocks',
'shock_path_note',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'scenario_results',
'scenarioId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'scenarios',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'scenario_results',
'forecastId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'forecasts',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'scenario_results',
'delta_point_estimate',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'scenario_results',
'delta_p50',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'scenario_results',
'delta_volatility',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'scenario_results',
'pnl_proxy',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'scenario_results',
'narrative',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'alerts',
'name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'alerts',
'alert_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['forecast_change','signal_change','volatility_spike','data_quality','model_health','geopolitical_severity'],
},
{ transaction }
);
await queryInterface.addColumn(
'alerts',
'severity',
{
type: Sequelize.DataTypes.ENUM,
values: ['info','warning','critical'],
},
{ transaction }
);
await queryInterface.addColumn(
'alerts',
'delivery_channel',
{
type: Sequelize.DataTypes.ENUM,
values: ['in_app','email','webhook'],
},
{ transaction }
);
await queryInterface.addColumn(
'alerts',
'is_enabled',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'alerts',
'threshold_value',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'alerts',
'rule_description',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'alerts',
'target_assetId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'assets',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'alerts',
'target_modelId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'models',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'alerts',
'ownerId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'users',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'alert_events',
'alertId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'alerts',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'alert_events',
'triggered_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'alert_events',
'state',
{
type: Sequelize.DataTypes.ENUM,
values: ['open','acknowledged','resolved'],
},
{ transaction }
);
await queryInterface.addColumn(
'alert_events',
'message',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'alert_events',
'observed_value',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'alert_events',
'acknowledged_byId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'users',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'api_keys',
'name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'api_keys',
'scope',
{
type: Sequelize.DataTypes.ENUM,
values: ['read_only','read_forecasts','read_analytics','admin'],
},
{ transaction }
);
await queryInterface.addColumn(
'api_keys',
'is_active',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'api_keys',
'expires_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'api_keys',
'key_fingerprint',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'api_keys',
'ownerId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'users',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'audit_events',
'occurred_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'audit_events',
'event_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['auth_login','auth_logout','data_ingestion','data_quality','model_change','model_run','forecast_publish','scenario_change','permission_change','api_access','export'],
},
{ transaction }
);
await queryInterface.addColumn(
'audit_events',
'outcome',
{
type: Sequelize.DataTypes.ENUM,
values: ['success','failure'],
},
{ transaction }
);
await queryInterface.addColumn(
'audit_events',
'resource_type',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'audit_events',
'resource_identifier',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'audit_events',
'details',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'audit_events',
'ip_address',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'audit_events',
'actorId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'users',
key: 'id',
},
},
{ 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',
'actorId',
{ transaction }
);
await queryInterface.removeColumn(
'audit_events',
'ip_address',
{ transaction }
);
await queryInterface.removeColumn(
'audit_events',
'details',
{ transaction }
);
await queryInterface.removeColumn(
'audit_events',
'resource_identifier',
{ transaction }
);
await queryInterface.removeColumn(
'audit_events',
'resource_type',
{ transaction }
);
await queryInterface.removeColumn(
'audit_events',
'outcome',
{ transaction }
);
await queryInterface.removeColumn(
'audit_events',
'event_type',
{ transaction }
);
await queryInterface.removeColumn(
'audit_events',
'occurred_at',
{ transaction }
);
await queryInterface.removeColumn(
'api_keys',
'ownerId',
{ transaction }
);
await queryInterface.removeColumn(
'api_keys',
'key_fingerprint',
{ transaction }
);
await queryInterface.removeColumn(
'api_keys',
'expires_at',
{ transaction }
);
await queryInterface.removeColumn(
'api_keys',
'is_active',
{ transaction }
);
await queryInterface.removeColumn(
'api_keys',
'scope',
{ transaction }
);
await queryInterface.removeColumn(
'api_keys',
'name',
{ transaction }
);
await queryInterface.removeColumn(
'alert_events',
'acknowledged_byId',
{ transaction }
);
await queryInterface.removeColumn(
'alert_events',
'observed_value',
{ transaction }
);
await queryInterface.removeColumn(
'alert_events',
'message',
{ transaction }
);
await queryInterface.removeColumn(
'alert_events',
'state',
{ transaction }
);
await queryInterface.removeColumn(
'alert_events',
'triggered_at',
{ transaction }
);
await queryInterface.removeColumn(
'alert_events',
'alertId',
{ transaction }
);
await queryInterface.removeColumn(
'alerts',
'ownerId',
{ transaction }
);
await queryInterface.removeColumn(
'alerts',
'target_modelId',
{ transaction }
);
await queryInterface.removeColumn(
'alerts',
'target_assetId',
{ transaction }
);
await queryInterface.removeColumn(
'alerts',
'rule_description',
{ transaction }
);
await queryInterface.removeColumn(
'alerts',
'threshold_value',
{ transaction }
);
await queryInterface.removeColumn(
'alerts',
'is_enabled',
{ transaction }
);
await queryInterface.removeColumn(
'alerts',
'delivery_channel',
{ transaction }
);
await queryInterface.removeColumn(
'alerts',
'severity',
{ transaction }
);
await queryInterface.removeColumn(
'alerts',
'alert_type',
{ transaction }
);
await queryInterface.removeColumn(
'alerts',
'name',
{ transaction }
);
await queryInterface.removeColumn(
'scenario_results',
'narrative',
{ transaction }
);
await queryInterface.removeColumn(
'scenario_results',
'pnl_proxy',
{ transaction }
);
await queryInterface.removeColumn(
'scenario_results',
'delta_volatility',
{ transaction }
);
await queryInterface.removeColumn(
'scenario_results',
'delta_p50',
{ transaction }
);
await queryInterface.removeColumn(
'scenario_results',
'delta_point_estimate',
{ transaction }
);
await queryInterface.removeColumn(
'scenario_results',
'forecastId',
{ transaction }
);
await queryInterface.removeColumn(
'scenario_results',
'scenarioId',
{ transaction }
);
await queryInterface.removeColumn(
'scenario_shocks',
'shock_path_note',
{ transaction }
);
await queryInterface.removeColumn(
'scenario_shocks',
'shock_end_at',
{ transaction }
);
await queryInterface.removeColumn(
'scenario_shocks',
'shock_start_at',
{ transaction }
);
await queryInterface.removeColumn(
'scenario_shocks',
'shock_value',
{ transaction }
);
await queryInterface.removeColumn(
'scenario_shocks',
'shock_style',
{ transaction }
);
await queryInterface.removeColumn(
'scenario_shocks',
'assetId',
{ transaction }
);
await queryInterface.removeColumn(
'scenario_shocks',
'scenarioId',
{ transaction }
);
await queryInterface.removeColumn(
'scenarios',
'ownerId',
{ transaction }
);
await queryInterface.removeColumn(
'scenarios',
'probability_weight',
{ transaction }
);
await queryInterface.removeColumn(
'scenarios',
'valid_to_at',
{ transaction }
);
await queryInterface.removeColumn(
'scenarios',
'valid_from_at',
{ transaction }
);
await queryInterface.removeColumn(
'scenarios',
'description',
{ transaction }
);
await queryInterface.removeColumn(
'scenarios',
'status',
{ transaction }
);
await queryInterface.removeColumn(
'scenarios',
'scenario_type',
{ transaction }
);
await queryInterface.removeColumn(
'scenarios',
'name',
{ transaction }
);
await queryInterface.removeColumn(
'factor_attributions',
'notes',
{ transaction }
);
await queryInterface.removeColumn(
'factor_attributions',
'importance',
{ transaction }
);
await queryInterface.removeColumn(
'factor_attributions',
'contribution',
{ transaction }
);
await queryInterface.removeColumn(
'factor_attributions',
'factor_category',
{ transaction }
);
await queryInterface.removeColumn(
'factor_attributions',
'factor_name',
{ transaction }
);
await queryInterface.removeColumn(
'factor_attributions',
'forecastId',
{ transaction }
);
await queryInterface.removeColumn(
'forecasts',
'explainability_summary',
{ transaction }
);
await queryInterface.removeColumn(
'forecasts',
'signal_confidence',
{ transaction }
);
await queryInterface.removeColumn(
'forecasts',
'signal_direction',
{ transaction }
);
await queryInterface.removeColumn(
'forecasts',
'volatility_forecast',
{ transaction }
);
await queryInterface.removeColumn(
'forecasts',
'p90',
{ transaction }
);
await queryInterface.removeColumn(
'forecasts',
'p50',
{ transaction }
);
await queryInterface.removeColumn(
'forecasts',
'p10',
{ transaction }
);
await queryInterface.removeColumn(
'forecasts',
'point_estimate',
{ transaction }
);
await queryInterface.removeColumn(
'forecasts',
'target_time_at',
{ transaction }
);
await queryInterface.removeColumn(
'forecasts',
'horizon',
{ transaction }
);
await queryInterface.removeColumn(
'forecasts',
'as_of_at',
{ transaction }
);
await queryInterface.removeColumn(
'forecasts',
'target_assetId',
{ transaction }
);
await queryInterface.removeColumn(
'forecasts',
'modelId',
{ transaction }
);
await queryInterface.removeColumn(
'model_runs',
'error_details',
{ transaction }
);
await queryInterface.removeColumn(
'model_runs',
'metrics_summary',
{ transaction }
);
await queryInterface.removeColumn(
'model_runs',
'data_window',
{ transaction }
);
await queryInterface.removeColumn(
'model_runs',
'ended_at',
{ transaction }
);
await queryInterface.removeColumn(
'model_runs',
'started_at',
{ transaction }
);
await queryInterface.removeColumn(
'model_runs',
'run_status',
{ transaction }
);
await queryInterface.removeColumn(
'model_runs',
'run_type',
{ transaction }
);
await queryInterface.removeColumn(
'model_runs',
'modelId',
{ transaction }
);
await queryInterface.removeColumn(
'models',
'ownerId',
{ transaction }
);
await queryInterface.removeColumn(
'models',
'feature_setId',
{ transaction }
);
await queryInterface.removeColumn(
'models',
'config_snapshot',
{ transaction }
);
await queryInterface.removeColumn(
'models',
'artifact_uri',
{ transaction }
);
await queryInterface.removeColumn(
'models',
'last_trained_at',
{ transaction }
);
await queryInterface.removeColumn(
'models',
'target_metric_value',
{ transaction }
);
await queryInterface.removeColumn(
'models',
'objective',
{ transaction }
);
await queryInterface.removeColumn(
'models',
'status',
{ transaction }
);
await queryInterface.removeColumn(
'models',
'training_mode',
{ transaction }
);
await queryInterface.removeColumn(
'models',
'model_family',
{ transaction }
);
await queryInterface.removeColumn(
'models',
'name',
{ transaction }
);
await queryInterface.removeColumn(
'feature_sets',
'effective_to_at',
{ transaction }
);
await queryInterface.removeColumn(
'feature_sets',
'effective_from_at',
{ transaction }
);
await queryInterface.removeColumn(
'feature_sets',
'version_stage',
{ transaction }
);
await queryInterface.removeColumn(
'feature_sets',
'description',
{ transaction }
);
await queryInterface.removeColumn(
'feature_sets',
'name',
{ transaction }
);
await queryInterface.removeColumn(
'geopolitical_scores',
'data_sourceId',
{ transaction }
);
await queryInterface.removeColumn(
'geopolitical_scores',
'related_eventId',
{ transaction }
);
await queryInterface.removeColumn(
'geopolitical_scores',
'methodology_note',
{ transaction }
);
await queryInterface.removeColumn(
'geopolitical_scores',
'iran_conflict_weight',
{ transaction }
);
await queryInterface.removeColumn(
'geopolitical_scores',
'score_value',
{ transaction }
);
await queryInterface.removeColumn(
'geopolitical_scores',
'horizon',
{ transaction }
);
await queryInterface.removeColumn(
'geopolitical_scores',
'score_type',
{ transaction }
);
await queryInterface.removeColumn(
'geopolitical_scores',
'as_of_at',
{ transaction }
);
await queryInterface.removeColumn(
'geopolitical_events',
'data_sourceId',
{ transaction }
);
await queryInterface.removeColumn(
'geopolitical_events',
'confidence_score',
{ transaction }
);
await queryInterface.removeColumn(
'geopolitical_events',
'source_summary',
{ transaction }
);
await queryInterface.removeColumn(
'geopolitical_events',
'summary',
{ transaction }
);
await queryInterface.removeColumn(
'geopolitical_events',
'event_end_at',
{ transaction }
);
await queryInterface.removeColumn(
'geopolitical_events',
'event_start_at',
{ transaction }
);
await queryInterface.removeColumn(
'geopolitical_events',
'severity',
{ transaction }
);
await queryInterface.removeColumn(
'geopolitical_events',
'event_type',
{ transaction }
);
await queryInterface.removeColumn(
'geopolitical_events',
'focus_area',
{ transaction }
);
await queryInterface.removeColumn(
'geopolitical_events',
'title',
{ transaction }
);
await queryInterface.removeColumn(
'macro_indicators',
'is_active',
{ transaction }
);
await queryInterface.removeColumn(
'macro_indicators',
'series_assetId',
{ transaction }
);
await queryInterface.removeColumn(
'macro_indicators',
'data_sourceId',
{ transaction }
);
await queryInterface.removeColumn(
'macro_indicators',
'region',
{ transaction }
);
await queryInterface.removeColumn(
'macro_indicators',
'unit',
{ transaction }
);
await queryInterface.removeColumn(
'macro_indicators',
'frequency',
{ transaction }
);
await queryInterface.removeColumn(
'macro_indicators',
'indicator_type',
{ transaction }
);
await queryInterface.removeColumn(
'macro_indicators',
'name',
{ transaction }
);
await queryInterface.removeColumn(
'macro_indicators',
'code',
{ transaction }
);
await queryInterface.removeColumn(
'mining_fundamentals',
'notes',
{ transaction }
);
await queryInterface.removeColumn(
'mining_fundamentals',
'operating_margin',
{ transaction }
);
await queryInterface.removeColumn(
'mining_fundamentals',
'debt_to_equity',
{ transaction }
);
await queryInterface.removeColumn(
'mining_fundamentals',
'free_cash_flow',
{ transaction }
);
await queryInterface.removeColumn(
'mining_fundamentals',
'ebitda',
{ transaction }
);
await queryInterface.removeColumn(
'mining_fundamentals',
'revenue',
{ transaction }
);
await queryInterface.removeColumn(
'mining_fundamentals',
'reserves_oz',
{ transaction }
);
await queryInterface.removeColumn(
'mining_fundamentals',
'cash_cost',
{ transaction }
);
await queryInterface.removeColumn(
'mining_fundamentals',
'all_in_sustaining_cost',
{ transaction }
);
await queryInterface.removeColumn(
'mining_fundamentals',
'production_oz',
{ transaction }
);
await queryInterface.removeColumn(
'mining_fundamentals',
'period_end_at',
{ transaction }
);
await queryInterface.removeColumn(
'mining_fundamentals',
'reporting_period',
{ transaction }
);
await queryInterface.removeColumn(
'mining_fundamentals',
'mining_companyId',
{ transaction }
);
await queryInterface.removeColumn(
'mining_companies',
'equity_assetId',
{ transaction }
);
await queryInterface.removeColumn(
'mining_companies',
'is_major_producer',
{ transaction }
);
await queryInterface.removeColumn(
'mining_companies',
'primary_mines',
{ transaction }
);
await queryInterface.removeColumn(
'mining_companies',
'country',
{ transaction }
);
await queryInterface.removeColumn(
'mining_companies',
'company_name',
{ transaction }
);
await queryInterface.removeColumn(
'mining_companies',
'ticker',
{ transaction }
);
await queryInterface.removeColumn(
'time_series',
'quality_flag',
{ transaction }
);
await queryInterface.removeColumn(
'time_series',
'is_imputed',
{ transaction }
);
await queryInterface.removeColumn(
'time_series',
'vwap',
{ transaction }
);
await queryInterface.removeColumn(
'time_series',
'volume',
{ transaction }
);
await queryInterface.removeColumn(
'time_series',
'close',
{ transaction }
);
await queryInterface.removeColumn(
'time_series',
'low',
{ transaction }
);
await queryInterface.removeColumn(
'time_series',
'high',
{ transaction }
);
await queryInterface.removeColumn(
'time_series',
'open',
{ transaction }
);
await queryInterface.removeColumn(
'time_series',
'bar_size',
{ transaction }
);
await queryInterface.removeColumn(
'time_series',
'timestamp',
{ transaction }
);
await queryInterface.removeColumn(
'time_series',
'assetId',
{ transaction }
);
await queryInterface.removeColumn(
'assets',
'primary_data_sourceId',
{ transaction }
);
await queryInterface.removeColumn(
'assets',
'is_active',
{ transaction }
);
await queryInterface.removeColumn(
'assets',
'exchange_venue',
{ transaction }
);
await queryInterface.removeColumn(
'assets',
'currency',
{ transaction }
);
await queryInterface.removeColumn(
'assets',
'asset_class',
{ transaction }
);
await queryInterface.removeColumn(
'assets',
'name',
{ transaction }
);
await queryInterface.removeColumn(
'assets',
'symbol',
{ transaction }
);
await queryInterface.removeColumn(
'data_sources',
'last_failure_reason',
{ transaction }
);
await queryInterface.removeColumn(
'data_sources',
'last_failure_at',
{ transaction }
);
await queryInterface.removeColumn(
'data_sources',
'last_success_at',
{ transaction }
);
await queryInterface.removeColumn(
'data_sources',
'is_enabled',
{ transaction }
);
await queryInterface.removeColumn(
'data_sources',
'refresh_rate',
{ transaction }
);
await queryInterface.removeColumn(
'data_sources',
'coverage_description',
{ transaction }
);
await queryInterface.removeColumn(
'data_sources',
'connection_type',
{ transaction }
);
await queryInterface.removeColumn(
'data_sources',
'ingestion_mode',
{ transaction }
);
await queryInterface.removeColumn(
'data_sources',
'category',
{ transaction }
);
await queryInterface.removeColumn(
'data_sources',
'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('audit_events', { transaction });
await queryInterface.dropTable('api_keys', { transaction });
await queryInterface.dropTable('alert_events', { transaction });
await queryInterface.dropTable('alerts', { transaction });
await queryInterface.dropTable('scenario_results', { transaction });
await queryInterface.dropTable('scenario_shocks', { transaction });
await queryInterface.dropTable('scenarios', { transaction });
await queryInterface.dropTable('factor_attributions', { transaction });
await queryInterface.dropTable('forecasts', { transaction });
await queryInterface.dropTable('model_runs', { transaction });
await queryInterface.dropTable('models', { transaction });
await queryInterface.dropTable('feature_sets', { transaction });
await queryInterface.dropTable('geopolitical_scores', { transaction });
await queryInterface.dropTable('geopolitical_events', { transaction });
await queryInterface.dropTable('macro_indicators', { transaction });
await queryInterface.dropTable('mining_fundamentals', { transaction });
await queryInterface.dropTable('mining_companies', { transaction });
await queryInterface.dropTable('time_series', { transaction });
await queryInterface.dropTable('assets', { transaction });
await queryInterface.dropTable('data_sources', { 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;
}
}
};