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( 'audit_logs', { id: { type: Sequelize.DataTypes.UUID, defaultValue: Sequelize.DataTypes.UUIDV4, primaryKey: true, }, createdById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, updatedById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, createdAt: { type: Sequelize.DataTypes.DATE }, updatedAt: { type: Sequelize.DataTypes.DATE }, deletedAt: { type: Sequelize.DataTypes.DATE }, importHash: { type: Sequelize.DataTypes.STRING(255), allowNull: true, unique: true, }, }, { transaction }, ); await queryInterface.createTable( 'audit_packs', { 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( 'contexts', { 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( 'evidence_files', { id: { type: Sequelize.DataTypes.UUID, defaultValue: Sequelize.DataTypes.UUIDV4, primaryKey: true, }, createdById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, updatedById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, createdAt: { type: Sequelize.DataTypes.DATE }, updatedAt: { type: Sequelize.DataTypes.DATE }, deletedAt: { type: Sequelize.DataTypes.DATE }, importHash: { type: Sequelize.DataTypes.STRING(255), allowNull: true, unique: true, }, }, { transaction }, ); await queryInterface.createTable( 'jobs', { id: { type: Sequelize.DataTypes.UUID, defaultValue: Sequelize.DataTypes.UUIDV4, primaryKey: true, }, createdById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, updatedById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, createdAt: { type: Sequelize.DataTypes.DATE }, updatedAt: { type: Sequelize.DataTypes.DATE }, deletedAt: { type: Sequelize.DataTypes.DATE }, importHash: { type: Sequelize.DataTypes.STRING(255), allowNull: true, unique: true, }, }, { transaction }, ); await queryInterface.createTable( 'mappings', { 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( 'metric_values', { 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( 'narratives', { 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( 'org_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( 'projects', { id: { type: Sequelize.DataTypes.UUID, defaultValue: Sequelize.DataTypes.UUIDV4, primaryKey: true, }, createdById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, updatedById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, createdAt: { type: Sequelize.DataTypes.DATE }, updatedAt: { type: Sequelize.DataTypes.DATE }, deletedAt: { type: Sequelize.DataTypes.DATE }, importHash: { type: Sequelize.DataTypes.STRING(255), allowNull: true, unique: true, }, }, { transaction }, ); await queryInterface.createTable( 'taxonomies', { 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( 'units', { 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( 'validation_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( 'xbrl_instances', { id: { type: Sequelize.DataTypes.UUID, defaultValue: Sequelize.DataTypes.UUIDV4, primaryKey: true, }, createdById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, updatedById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, createdAt: { type: Sequelize.DataTypes.DATE }, updatedAt: { type: Sequelize.DataTypes.DATE }, deletedAt: { type: Sequelize.DataTypes.DATE }, importHash: { type: Sequelize.DataTypes.STRING(255), allowNull: true, unique: true, }, }, { transaction }, ); await queryInterface.createTable( 'roles', { id: { type: Sequelize.DataTypes.UUID, defaultValue: Sequelize.DataTypes.UUIDV4, primaryKey: true, }, createdById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, updatedById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, createdAt: { type: Sequelize.DataTypes.DATE }, updatedAt: { type: Sequelize.DataTypes.DATE }, deletedAt: { type: Sequelize.DataTypes.DATE }, importHash: { type: Sequelize.DataTypes.STRING(255), allowNull: true, unique: true, }, }, { transaction }, ); await queryInterface.createTable( 'permissions', { id: { type: Sequelize.DataTypes.UUID, defaultValue: Sequelize.DataTypes.UUIDV4, primaryKey: true, }, createdById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, updatedById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, createdAt: { type: Sequelize.DataTypes.DATE }, updatedAt: { type: Sequelize.DataTypes.DATE }, deletedAt: { type: Sequelize.DataTypes.DATE }, importHash: { type: Sequelize.DataTypes.STRING(255), allowNull: true, unique: true, }, }, { transaction }, ); await queryInterface.createTable( 'organizations', { id: { type: Sequelize.DataTypes.UUID, defaultValue: Sequelize.DataTypes.UUIDV4, primaryKey: true, }, createdById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, updatedById: { type: Sequelize.DataTypes.UUID, references: { key: 'id', model: 'users', }, }, createdAt: { type: Sequelize.DataTypes.DATE }, updatedAt: { type: Sequelize.DataTypes.DATE }, deletedAt: { type: Sequelize.DataTypes.DATE }, importHash: { type: Sequelize.DataTypes.STRING(255), allowNull: true, unique: true, }, }, { transaction }, ); await queryInterface.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( 'audit_logs', 'orgId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'audit_logs', 'actor_userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'audit_logs', 'action', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'audit_logs', 'entity_type', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'audit_logs', 'entity_id', { type: Sequelize.DataTypes.INTEGER, }, { transaction }, ); await queryInterface.addColumn( 'audit_logs', 'diff_json', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'audit_packs', 'projectId', { type: Sequelize.DataTypes.UUID, references: { model: 'projects', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'audit_packs', 'xbrl_instanceId', { type: Sequelize.DataTypes.UUID, references: { model: 'xbrl_instances', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'audit_packs', 'zip_uri', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'contexts', 'projectId', { type: Sequelize.DataTypes.UUID, references: { model: 'projects', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'contexts', 'identifier_scheme', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'contexts', 'identifier_value', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'contexts', 'period_start', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'contexts', 'period_end', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'contexts', 'scenario', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'contexts', 'segment', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'evidence_files', 'projectId', { type: Sequelize.DataTypes.UUID, references: { model: 'projects', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'evidence_files', 'file_name', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'evidence_files', 'mime_type', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'evidence_files', 'gcs_uri', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'evidence_files', 'checksum', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'evidence_files', 'uploaded_byId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'evidence_files', 'uploaded_at', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'jobs', 'projectId', { type: Sequelize.DataTypes.UUID, references: { model: 'projects', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'jobs', 'type', { type: Sequelize.DataTypes.ENUM, values: ['GENERATE_XBRL', 'VALIDATE_XBRL', 'BUILD_AUDIT_PACK'], }, { transaction }, ); await queryInterface.addColumn( 'jobs', 'status', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'jobs', 'payload', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'jobs', 'result', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'jobs', 'started_at', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'jobs', 'finished_at', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'jobs', 'error_text', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'mappings', 'projectId', { type: Sequelize.DataTypes.UUID, references: { model: 'projects', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'mappings', 'source_type', { type: Sequelize.DataTypes.ENUM, values: ['CSV_FIELD', 'MANUAL'], }, { transaction }, ); await queryInterface.addColumn( 'mappings', 'source_path', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'mappings', 'target_concept_qname', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'mappings', 'default_unitId', { type: Sequelize.DataTypes.UUID, references: { model: 'units', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'mappings', 'default_contextId', { type: Sequelize.DataTypes.UUID, references: { model: 'contexts', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'mappings', 'last_mapped_byId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'metric_values', 'projectId', { type: Sequelize.DataTypes.UUID, references: { model: 'projects', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'metric_values', 'concept_qname', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'metric_values', 'contextId', { type: Sequelize.DataTypes.UUID, references: { model: 'contexts', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'metric_values', 'unitId', { type: Sequelize.DataTypes.UUID, references: { model: 'units', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'metric_values', 'value_numeric', { type: Sequelize.DataTypes.DECIMAL, }, { transaction }, ); await queryInterface.addColumn( 'metric_values', 'value_text', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'metric_values', 'decimals', { type: Sequelize.DataTypes.INTEGER, }, { transaction }, ); await queryInterface.addColumn( 'metric_values', 'source_refId', { type: Sequelize.DataTypes.UUID, references: { model: 'evidence_files', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'metric_values', 'note', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'narratives', 'projectId', { type: Sequelize.DataTypes.UUID, references: { model: 'projects', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'narratives', 'concept_qname', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'narratives', 'contextId', { type: Sequelize.DataTypes.UUID, references: { model: 'contexts', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'narratives', 'value_text', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'narratives', 'source_refId', { type: Sequelize.DataTypes.UUID, references: { model: 'evidence_files', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'narratives', 'note', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'org_users', 'orgId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'org_users', 'userId', { type: Sequelize.DataTypes.UUID, references: { model: 'users', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'org_users', 'role', { type: Sequelize.DataTypes.ENUM, values: [ 'OrgOwner', 'Controller', 'SustainabilityMgr', 'Auditor', 'Viewer', ], }, { transaction }, ); await queryInterface.addColumn( 'org_users', 'status', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'projects', 'orgId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'projects', 'name', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'projects', 'fiscal_year_start', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'projects', 'fiscal_year_end', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'projects', 'reporting_scope', { type: Sequelize.DataTypes.ENUM, values: ['ESRS_SET1', 'VSME'], }, { transaction }, ); await queryInterface.addColumn( 'projects', 'status', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'taxonomies', 'code', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'taxonomies', 'label', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'taxonomies', 'version', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'taxonomies', 'entry_point_url', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'units', 'projectId', { type: Sequelize.DataTypes.UUID, references: { model: 'projects', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'units', 'unit_id', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'units', 'numerator', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'units', 'denominator', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'validation_runs', 'xbrl_instanceId', { type: Sequelize.DataTypes.UUID, references: { model: 'xbrl_instances', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'validation_runs', 'status', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'validation_runs', 'started_at', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'validation_runs', 'finished_at', { type: Sequelize.DataTypes.DATE, }, { transaction }, ); await queryInterface.addColumn( 'validation_runs', 'engine', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'validation_runs', 'error_count', { type: Sequelize.DataTypes.INTEGER, }, { transaction }, ); await queryInterface.addColumn( 'validation_runs', 'warning_count', { type: Sequelize.DataTypes.INTEGER, }, { transaction }, ); await queryInterface.addColumn( 'validation_runs', 'report_json', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'xbrl_instances', 'projectId', { type: Sequelize.DataTypes.UUID, references: { model: 'projects', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'xbrl_instances', 'taxonomyId', { type: Sequelize.DataTypes.UUID, references: { model: 'taxonomies', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'xbrl_instances', 'build_status', { type: Sequelize.DataTypes.ENUM, values: ['QUEUED', 'RUNNING', 'SUCCEEDED', 'FAILED'], }, { transaction }, ); await queryInterface.addColumn( 'xbrl_instances', 'build_log', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'xbrl_instances', 'instance_uri', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'xbrl_instances', 'ixbrl_uri', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'permissions', 'name', { type: Sequelize.DataTypes.TEXT, }, { 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( 'users', 'app_roleId', { type: Sequelize.DataTypes.UUID, references: { model: 'roles', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'organizations', 'name', { type: Sequelize.DataTypes.TEXT, }, { transaction }, ); await queryInterface.addColumn( 'roles', 'globalAccess', { type: Sequelize.DataTypes.BOOLEAN, defaultValue: false, allowNull: false, }, { transaction }, ); await queryInterface.addColumn( 'users', 'organizationsId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'audit_logs', 'organizationsId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'audit_packs', 'organizationsId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'contexts', 'organizationsId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'evidence_files', 'organizationsId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'jobs', 'organizationsId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'mappings', 'organizationsId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'metric_values', 'organizationsId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'narratives', 'organizationsId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'org_users', 'organizationsId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'projects', 'organizationsId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'taxonomies', 'organizationsId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'units', 'organizationsId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'validation_runs', 'organizationsId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', key: 'id', }, }, { transaction }, ); await queryInterface.addColumn( 'xbrl_instances', 'organizationsId', { type: Sequelize.DataTypes.UUID, references: { model: 'organizations', 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('xbrl_instances', 'organizationsId', { transaction, }); await queryInterface.removeColumn('validation_runs', 'organizationsId', { transaction, }); await queryInterface.removeColumn('units', 'organizationsId', { transaction, }); await queryInterface.removeColumn('taxonomies', 'organizationsId', { transaction, }); await queryInterface.removeColumn('projects', 'organizationsId', { transaction, }); await queryInterface.removeColumn('org_users', 'organizationsId', { transaction, }); await queryInterface.removeColumn('narratives', 'organizationsId', { transaction, }); await queryInterface.removeColumn('metric_values', 'organizationsId', { transaction, }); await queryInterface.removeColumn('mappings', 'organizationsId', { transaction, }); await queryInterface.removeColumn('jobs', 'organizationsId', { transaction, }); await queryInterface.removeColumn('evidence_files', 'organizationsId', { transaction, }); await queryInterface.removeColumn('contexts', 'organizationsId', { transaction, }); await queryInterface.removeColumn('audit_packs', 'organizationsId', { transaction, }); await queryInterface.removeColumn('audit_logs', 'organizationsId', { transaction, }); await queryInterface.removeColumn('users', 'organizationsId', { transaction, }); await queryInterface.removeColumn('roles', 'globalAccess', { transaction, }); await queryInterface.removeColumn('organizations', 'name', { transaction, }); await queryInterface.removeColumn('users', 'app_roleId', { transaction }); await queryInterface.removeColumn('roles', 'role_customization', { transaction, }); await queryInterface.removeColumn('roles', 'name', { transaction }); await queryInterface.removeColumn('permissions', 'name', { transaction }); await queryInterface.removeColumn('xbrl_instances', 'ixbrl_uri', { transaction, }); await queryInterface.removeColumn('xbrl_instances', 'instance_uri', { transaction, }); await queryInterface.removeColumn('xbrl_instances', 'build_log', { transaction, }); await queryInterface.removeColumn('xbrl_instances', 'build_status', { transaction, }); await queryInterface.removeColumn('xbrl_instances', 'taxonomyId', { transaction, }); await queryInterface.removeColumn('xbrl_instances', 'projectId', { transaction, }); await queryInterface.removeColumn('validation_runs', 'report_json', { transaction, }); await queryInterface.removeColumn('validation_runs', 'warning_count', { transaction, }); await queryInterface.removeColumn('validation_runs', 'error_count', { transaction, }); await queryInterface.removeColumn('validation_runs', 'engine', { transaction, }); await queryInterface.removeColumn('validation_runs', 'finished_at', { transaction, }); await queryInterface.removeColumn('validation_runs', 'started_at', { transaction, }); await queryInterface.removeColumn('validation_runs', 'status', { transaction, }); await queryInterface.removeColumn('validation_runs', 'xbrl_instanceId', { transaction, }); await queryInterface.removeColumn('units', 'denominator', { transaction, }); await queryInterface.removeColumn('units', 'numerator', { transaction }); await queryInterface.removeColumn('units', 'unit_id', { transaction }); await queryInterface.removeColumn('units', 'projectId', { transaction }); await queryInterface.removeColumn('taxonomies', 'entry_point_url', { transaction, }); await queryInterface.removeColumn('taxonomies', 'version', { transaction, }); await queryInterface.removeColumn('taxonomies', 'label', { transaction }); await queryInterface.removeColumn('taxonomies', 'code', { transaction }); await queryInterface.removeColumn('projects', 'status', { transaction }); await queryInterface.removeColumn('projects', 'reporting_scope', { transaction, }); await queryInterface.removeColumn('projects', 'fiscal_year_end', { transaction, }); await queryInterface.removeColumn('projects', 'fiscal_year_start', { transaction, }); await queryInterface.removeColumn('projects', 'name', { transaction }); await queryInterface.removeColumn('projects', 'orgId', { transaction }); await queryInterface.removeColumn('org_users', 'status', { transaction }); await queryInterface.removeColumn('org_users', 'role', { transaction }); await queryInterface.removeColumn('org_users', 'userId', { transaction }); await queryInterface.removeColumn('org_users', 'orgId', { transaction }); await queryInterface.removeColumn('narratives', 'note', { transaction }); await queryInterface.removeColumn('narratives', 'source_refId', { transaction, }); await queryInterface.removeColumn('narratives', 'value_text', { transaction, }); await queryInterface.removeColumn('narratives', 'contextId', { transaction, }); await queryInterface.removeColumn('narratives', 'concept_qname', { transaction, }); await queryInterface.removeColumn('narratives', 'projectId', { transaction, }); await queryInterface.removeColumn('metric_values', 'note', { transaction, }); await queryInterface.removeColumn('metric_values', 'source_refId', { transaction, }); await queryInterface.removeColumn('metric_values', 'decimals', { transaction, }); await queryInterface.removeColumn('metric_values', 'value_text', { transaction, }); await queryInterface.removeColumn('metric_values', 'value_numeric', { transaction, }); await queryInterface.removeColumn('metric_values', 'unitId', { transaction, }); await queryInterface.removeColumn('metric_values', 'contextId', { transaction, }); await queryInterface.removeColumn('metric_values', 'concept_qname', { transaction, }); await queryInterface.removeColumn('metric_values', 'projectId', { transaction, }); await queryInterface.removeColumn('mappings', 'last_mapped_byId', { transaction, }); await queryInterface.removeColumn('mappings', 'default_contextId', { transaction, }); await queryInterface.removeColumn('mappings', 'default_unitId', { transaction, }); await queryInterface.removeColumn('mappings', 'target_concept_qname', { transaction, }); await queryInterface.removeColumn('mappings', 'source_path', { transaction, }); await queryInterface.removeColumn('mappings', 'source_type', { transaction, }); await queryInterface.removeColumn('mappings', 'projectId', { transaction, }); await queryInterface.removeColumn('jobs', 'error_text', { transaction }); await queryInterface.removeColumn('jobs', 'finished_at', { transaction }); await queryInterface.removeColumn('jobs', 'started_at', { transaction }); await queryInterface.removeColumn('jobs', 'result', { transaction }); await queryInterface.removeColumn('jobs', 'payload', { transaction }); await queryInterface.removeColumn('jobs', 'status', { transaction }); await queryInterface.removeColumn('jobs', 'type', { transaction }); await queryInterface.removeColumn('jobs', 'projectId', { transaction }); await queryInterface.removeColumn('evidence_files', 'uploaded_at', { transaction, }); await queryInterface.removeColumn('evidence_files', 'uploaded_byId', { transaction, }); await queryInterface.removeColumn('evidence_files', 'checksum', { transaction, }); await queryInterface.removeColumn('evidence_files', 'gcs_uri', { transaction, }); await queryInterface.removeColumn('evidence_files', 'mime_type', { transaction, }); await queryInterface.removeColumn('evidence_files', 'file_name', { transaction, }); await queryInterface.removeColumn('evidence_files', 'projectId', { transaction, }); await queryInterface.removeColumn('contexts', 'segment', { transaction }); await queryInterface.removeColumn('contexts', 'scenario', { transaction, }); await queryInterface.removeColumn('contexts', 'period_end', { transaction, }); await queryInterface.removeColumn('contexts', 'period_start', { transaction, }); await queryInterface.removeColumn('contexts', 'identifier_value', { transaction, }); await queryInterface.removeColumn('contexts', 'identifier_scheme', { transaction, }); await queryInterface.removeColumn('contexts', 'projectId', { transaction, }); await queryInterface.removeColumn('audit_packs', 'zip_uri', { transaction, }); await queryInterface.removeColumn('audit_packs', 'xbrl_instanceId', { transaction, }); await queryInterface.removeColumn('audit_packs', 'projectId', { transaction, }); await queryInterface.removeColumn('audit_logs', 'diff_json', { transaction, }); await queryInterface.removeColumn('audit_logs', 'entity_id', { transaction, }); await queryInterface.removeColumn('audit_logs', 'entity_type', { transaction, }); await queryInterface.removeColumn('audit_logs', 'action', { transaction, }); await queryInterface.removeColumn('audit_logs', 'actor_userId', { transaction, }); await queryInterface.removeColumn('audit_logs', 'orgId', { 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('organizations', { transaction }); await queryInterface.dropTable('permissions', { transaction }); await queryInterface.dropTable('roles', { transaction }); await queryInterface.dropTable('xbrl_instances', { transaction }); await queryInterface.dropTable('validation_runs', { transaction }); await queryInterface.dropTable('units', { transaction }); await queryInterface.dropTable('taxonomies', { transaction }); await queryInterface.dropTable('projects', { transaction }); await queryInterface.dropTable('org_users', { transaction }); await queryInterface.dropTable('narratives', { transaction }); await queryInterface.dropTable('metric_values', { transaction }); await queryInterface.dropTable('mappings', { transaction }); await queryInterface.dropTable('jobs', { transaction }); await queryInterface.dropTable('evidence_files', { transaction }); await queryInterface.dropTable('contexts', { transaction }); await queryInterface.dropTable('audit_packs', { transaction }); await queryInterface.dropTable('audit_logs', { transaction }); await queryInterface.dropTable('users', { transaction }); await transaction.commit(); } catch (err) { await transaction.rollback(); throw err; } }, };