module.exports = { /** * @param {QueryInterface} queryInterface * @param {Sequelize} Sequelize * @returns {Promise} */ 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} */ 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; } } };