38630-vm/backend/src/db/migrations/1771544636884.js
2026-02-19 23:45:10 +00:00

5695 lines
179 KiB
JavaScript

module.exports = {
/**
* @param {QueryInterface} queryInterface
* @param {Sequelize} Sequelize
* @returns {Promise<void>}
*/
async up(queryInterface, Sequelize) {
/**
* @type {Transaction}
*/
const transaction = await queryInterface.sequelize.transaction();
try {
await queryInterface.createTable('users', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('roles', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('permissions', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('site_settings', {
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('contact_locations', {
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('social_links', {
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('hero_slides', {
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('stone_categories', {
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('stone_colors', {
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('finishes', {
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('applications', {
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('stones', {
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('stone_variants', {
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('stone_3d_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('services', {
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('technologies', {
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('service_technologies', {
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('project_media', {
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('team_members', {
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('blog_categories', {
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('blog_posts', {
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('lead_requests', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('quote_items', {
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('inquiries', {
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('seo_pages', {
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('media_library', {
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(
'site_settings',
'site_name_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'site_settings',
'site_tagline_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'site_settings',
'primary_font',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'site_settings',
'direction',
{
type: Sequelize.DataTypes.ENUM,
values: ['rtl','ltr'],
},
{ transaction }
);
await queryInterface.addColumn(
'site_settings',
'primary_color_hex',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'site_settings',
'accent_color_hex',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'site_settings',
'seo_default_title_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'site_settings',
'seo_default_description_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'contact_locations',
'name_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'contact_locations',
'address_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'contact_locations',
'phone',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'contact_locations',
'email',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'contact_locations',
'google_maps_url',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'contact_locations',
'latitude',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'contact_locations',
'longitude',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'contact_locations',
'is_primary',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'social_links',
'platform',
{
type: Sequelize.DataTypes.ENUM,
values: ['instagram','facebook','x','linkedin','youtube','tiktok','snapchat','pinterest','whatsapp'],
},
{ transaction }
);
await queryInterface.addColumn(
'social_links',
'url',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'social_links',
'label_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'social_links',
'sort_order',
{
type: Sequelize.DataTypes.INTEGER,
},
{ transaction }
);
await queryInterface.addColumn(
'social_links',
'is_active',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'hero_slides',
'headline_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'hero_slides',
'subheadline_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'hero_slides',
'cta_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['products','projects','services','quote','contact','custom_url'],
},
{ transaction }
);
await queryInterface.addColumn(
'hero_slides',
'cta_label_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'hero_slides',
'cta_url',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'hero_slides',
'sort_order',
{
type: Sequelize.DataTypes.INTEGER,
},
{ transaction }
);
await queryInterface.addColumn(
'hero_slides',
'is_active',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'stone_categories',
'name_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'stone_categories',
'slug',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'stone_categories',
'description_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'stone_categories',
'sort_order',
{
type: Sequelize.DataTypes.INTEGER,
},
{ transaction }
);
await queryInterface.addColumn(
'stone_categories',
'is_active',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'stone_categories',
'category_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['marble','granite','travertine','onyx','limestone','sandstone','other'],
},
{ transaction }
);
await queryInterface.addColumn(
'stone_colors',
'name_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'stone_colors',
'hex',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'stone_colors',
'sort_order',
{
type: Sequelize.DataTypes.INTEGER,
},
{ transaction }
);
await queryInterface.addColumn(
'stone_colors',
'is_active',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'finishes',
'name_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'finishes',
'description_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'finishes',
'is_active',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'applications',
'name_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'applications',
'application_scope',
{
type: Sequelize.DataTypes.ENUM,
values: ['interior','exterior','commercial','residential','hospitality','public'],
},
{ transaction }
);
await queryInterface.addColumn(
'applications',
'description_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'applications',
'is_active',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'stones',
'name_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'stones',
'slug',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'stones',
'categoryId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'stone_categories',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'stones',
'colorId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'stone_colors',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'stones',
'short_description_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'stones',
'description_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'stones',
'density',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'stones',
'water_absorption',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'stones',
'compressive_strength',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'stones',
'flexural_strength',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'stones',
'origin_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['local','imported','mixed'],
},
{ transaction }
);
await queryInterface.addColumn(
'stones',
'origin_country',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'stones',
'is_featured',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'stones',
'is_active',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'stone_variants',
'stoneId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'stones',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'stone_variants',
'variant_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['slab','tile','stair','countertop','custom'],
},
{ transaction }
);
await queryInterface.addColumn(
'stone_variants',
'sku',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'stone_variants',
'length_mm',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'stone_variants',
'width_mm',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'stone_variants',
'thickness_mm',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'stone_variants',
'weight_kg',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'stone_variants',
'availability_status',
{
type: Sequelize.DataTypes.ENUM,
values: ['in_stock','made_to_order','out_of_stock','discontinued'],
},
{ transaction }
);
await queryInterface.addColumn(
'stone_variants',
'base_price',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'stone_variants',
'price_note_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'stone_variants',
'is_active',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'stone_3d_assets',
'stoneId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'stones',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'stone_3d_assets',
'asset_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['glb','gltf','usdz','texture_set','other'],
},
{ transaction }
);
await queryInterface.addColumn(
'stone_3d_assets',
'viewer_hint_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'stone_3d_assets',
'is_active',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'services',
'name_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'services',
'slug',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'services',
'service_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['cnc_cutting','waterjet_cutting','polishing','profiling','edge_finishing','engraving','installation_support','custom_fabrication','consultation','other'],
},
{ transaction }
);
await queryInterface.addColumn(
'services',
'summary_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'services',
'description_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'services',
'sort_order',
{
type: Sequelize.DataTypes.INTEGER,
},
{ transaction }
);
await queryInterface.addColumn(
'services',
'is_featured',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'services',
'is_active',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'technologies',
'name_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'technologies',
'technology_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['cnc','waterjet','laser_measurement','cad_cam','polishing_line','other'],
},
{ transaction }
);
await queryInterface.addColumn(
'technologies',
'description_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'technologies',
'is_active',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'service_technologies',
'serviceId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'services',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'service_technologies',
'technologyId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'technologies',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'service_technologies',
'note_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'service_technologies',
'sort_order',
{
type: Sequelize.DataTypes.INTEGER,
},
{ transaction }
);
await queryInterface.addColumn(
'projects',
'name_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'projects',
'slug',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'projects',
'project_scope',
{
type: Sequelize.DataTypes.ENUM,
values: ['interior','exterior','commercial','residential'],
},
{ transaction }
);
await queryInterface.addColumn(
'projects',
'location_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'projects',
'summary_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'projects',
'description_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'projects',
'started_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'projects',
'completed_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'projects',
'is_featured',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'projects',
'is_published',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'project_media',
'projectId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'projects',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'project_media',
'media_kind',
{
type: Sequelize.DataTypes.ENUM,
values: ['image','video'],
},
{ transaction }
);
await queryInterface.addColumn(
'project_media',
'media_role',
{
type: Sequelize.DataTypes.ENUM,
values: ['before','after','process','final','detail','other'],
},
{ transaction }
);
await queryInterface.addColumn(
'project_media',
'caption_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'project_media',
'sort_order',
{
type: Sequelize.DataTypes.INTEGER,
},
{ transaction }
);
await queryInterface.addColumn(
'project_media',
'is_active',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'team_members',
'name_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'team_members',
'job_title_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'team_members',
'bio_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'team_members',
'email',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'team_members',
'phone',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'team_members',
'sort_order',
{
type: Sequelize.DataTypes.INTEGER,
},
{ transaction }
);
await queryInterface.addColumn(
'team_members',
'is_active',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'blog_categories',
'name_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'blog_categories',
'slug',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'blog_categories',
'description_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'blog_categories',
'sort_order',
{
type: Sequelize.DataTypes.INTEGER,
},
{ transaction }
);
await queryInterface.addColumn(
'blog_categories',
'is_active',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'blog_posts',
'title_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'blog_posts',
'slug',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'blog_posts',
'categoryId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'blog_categories',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'blog_posts',
'authorId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'users',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'blog_posts',
'excerpt_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'blog_posts',
'content_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'blog_posts',
'publish_status',
{
type: Sequelize.DataTypes.ENUM,
values: ['draft','scheduled','published','archived'],
},
{ transaction }
);
await queryInterface.addColumn(
'blog_posts',
'published_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'blog_posts',
'is_featured',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'lead_requests',
'request_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['quote','callback','information','appointment','custom_order'],
},
{ transaction }
);
await queryInterface.addColumn(
'lead_requests',
'full_name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'lead_requests',
'company_name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'lead_requests',
'email',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'lead_requests',
'phone',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'lead_requests',
'customer_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['architect','interior_designer','contractor','developer','individual','other'],
},
{ transaction }
);
await queryInterface.addColumn(
'lead_requests',
'message_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'lead_requests',
'interested_stoneId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'stones',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'lead_requests',
'interested_serviceId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'services',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'lead_requests',
'related_projectId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'projects',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'lead_requests',
'lead_status',
{
type: Sequelize.DataTypes.ENUM,
values: ['new','qualified','in_progress','quoted','won','lost','closed'],
},
{ transaction }
);
await queryInterface.addColumn(
'lead_requests',
'assigned_toId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'users',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'lead_requests',
'preferred_contact_time',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'lead_requests',
'last_contacted_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'lead_requests',
'internal_notes',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'quote_items',
'lead_requestId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'lead_requests',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'quote_items',
'stone_variantId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'stone_variants',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'quote_items',
'item_description_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'quote_items',
'quantity',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'quote_items',
'unit',
{
type: Sequelize.DataTypes.ENUM,
values: ['sqm','piece','ml','set','job'],
},
{ transaction }
);
await queryInterface.addColumn(
'quote_items',
'unit_price',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'quote_items',
'discount_amount',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'quote_items',
'tax_amount',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'quote_items',
'line_total',
{
type: Sequelize.DataTypes.DECIMAL,
},
{ transaction }
);
await queryInterface.addColumn(
'quote_items',
'sort_order',
{
type: Sequelize.DataTypes.INTEGER,
},
{ transaction }
);
await queryInterface.addColumn(
'inquiries',
'full_name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'inquiries',
'email',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'inquiries',
'phone',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'inquiries',
'subject_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'inquiries',
'message_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'inquiries',
'locationId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'contact_locations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'inquiries',
'status',
{
type: Sequelize.DataTypes.ENUM,
values: ['new','replied','closed'],
},
{ transaction }
);
await queryInterface.addColumn(
'inquiries',
'assigned_toId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'users',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'inquiries',
'received_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'inquiries',
'replied_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'seo_pages',
'page_key',
{
type: Sequelize.DataTypes.ENUM,
values: ['home','products','product_detail','projects','project_detail','services','service_detail','about','contact','blog','post_detail','privacy','terms'],
},
{ transaction }
);
await queryInterface.addColumn(
'seo_pages',
'title_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'seo_pages',
'description_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'seo_pages',
'canonical_url',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'seo_pages',
'indexable',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'media_library',
'media_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['image','video','document'],
},
{ transaction }
);
await queryInterface.addColumn(
'media_library',
'title_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'media_library',
'alt_text_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'media_library',
'source_note_ar',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'media_library',
'is_public',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await transaction.commit();
} catch (err) {
await transaction.rollback();
throw err;
}
},
/**
* @param {QueryInterface} queryInterface
* @param {Sequelize} Sequelize
* @returns {Promise<void>}
*/
async down(queryInterface, Sequelize) {
/**
* @type {Transaction}
*/
const transaction = await queryInterface.sequelize.transaction();
try {
await queryInterface.removeColumn(
'media_library',
'is_public',
{ transaction }
);
await queryInterface.removeColumn(
'media_library',
'source_note_ar',
{ transaction }
);
await queryInterface.removeColumn(
'media_library',
'alt_text_ar',
{ transaction }
);
await queryInterface.removeColumn(
'media_library',
'title_ar',
{ transaction }
);
await queryInterface.removeColumn(
'media_library',
'media_type',
{ transaction }
);
await queryInterface.removeColumn(
'seo_pages',
'indexable',
{ transaction }
);
await queryInterface.removeColumn(
'seo_pages',
'canonical_url',
{ transaction }
);
await queryInterface.removeColumn(
'seo_pages',
'description_ar',
{ transaction }
);
await queryInterface.removeColumn(
'seo_pages',
'title_ar',
{ transaction }
);
await queryInterface.removeColumn(
'seo_pages',
'page_key',
{ transaction }
);
await queryInterface.removeColumn(
'inquiries',
'replied_at',
{ transaction }
);
await queryInterface.removeColumn(
'inquiries',
'received_at',
{ transaction }
);
await queryInterface.removeColumn(
'inquiries',
'assigned_toId',
{ transaction }
);
await queryInterface.removeColumn(
'inquiries',
'status',
{ transaction }
);
await queryInterface.removeColumn(
'inquiries',
'locationId',
{ transaction }
);
await queryInterface.removeColumn(
'inquiries',
'message_ar',
{ transaction }
);
await queryInterface.removeColumn(
'inquiries',
'subject_ar',
{ transaction }
);
await queryInterface.removeColumn(
'inquiries',
'phone',
{ transaction }
);
await queryInterface.removeColumn(
'inquiries',
'email',
{ transaction }
);
await queryInterface.removeColumn(
'inquiries',
'full_name',
{ transaction }
);
await queryInterface.removeColumn(
'quote_items',
'sort_order',
{ transaction }
);
await queryInterface.removeColumn(
'quote_items',
'line_total',
{ transaction }
);
await queryInterface.removeColumn(
'quote_items',
'tax_amount',
{ transaction }
);
await queryInterface.removeColumn(
'quote_items',
'discount_amount',
{ transaction }
);
await queryInterface.removeColumn(
'quote_items',
'unit_price',
{ transaction }
);
await queryInterface.removeColumn(
'quote_items',
'unit',
{ transaction }
);
await queryInterface.removeColumn(
'quote_items',
'quantity',
{ transaction }
);
await queryInterface.removeColumn(
'quote_items',
'item_description_ar',
{ transaction }
);
await queryInterface.removeColumn(
'quote_items',
'stone_variantId',
{ transaction }
);
await queryInterface.removeColumn(
'quote_items',
'lead_requestId',
{ transaction }
);
await queryInterface.removeColumn(
'lead_requests',
'internal_notes',
{ transaction }
);
await queryInterface.removeColumn(
'lead_requests',
'last_contacted_at',
{ transaction }
);
await queryInterface.removeColumn(
'lead_requests',
'preferred_contact_time',
{ transaction }
);
await queryInterface.removeColumn(
'lead_requests',
'assigned_toId',
{ transaction }
);
await queryInterface.removeColumn(
'lead_requests',
'lead_status',
{ transaction }
);
await queryInterface.removeColumn(
'lead_requests',
'related_projectId',
{ transaction }
);
await queryInterface.removeColumn(
'lead_requests',
'interested_serviceId',
{ transaction }
);
await queryInterface.removeColumn(
'lead_requests',
'interested_stoneId',
{ transaction }
);
await queryInterface.removeColumn(
'lead_requests',
'message_ar',
{ transaction }
);
await queryInterface.removeColumn(
'lead_requests',
'customer_type',
{ transaction }
);
await queryInterface.removeColumn(
'lead_requests',
'phone',
{ transaction }
);
await queryInterface.removeColumn(
'lead_requests',
'email',
{ transaction }
);
await queryInterface.removeColumn(
'lead_requests',
'company_name',
{ transaction }
);
await queryInterface.removeColumn(
'lead_requests',
'full_name',
{ transaction }
);
await queryInterface.removeColumn(
'lead_requests',
'request_type',
{ transaction }
);
await queryInterface.removeColumn(
'blog_posts',
'is_featured',
{ transaction }
);
await queryInterface.removeColumn(
'blog_posts',
'published_at',
{ transaction }
);
await queryInterface.removeColumn(
'blog_posts',
'publish_status',
{ transaction }
);
await queryInterface.removeColumn(
'blog_posts',
'content_ar',
{ transaction }
);
await queryInterface.removeColumn(
'blog_posts',
'excerpt_ar',
{ transaction }
);
await queryInterface.removeColumn(
'blog_posts',
'authorId',
{ transaction }
);
await queryInterface.removeColumn(
'blog_posts',
'categoryId',
{ transaction }
);
await queryInterface.removeColumn(
'blog_posts',
'slug',
{ transaction }
);
await queryInterface.removeColumn(
'blog_posts',
'title_ar',
{ transaction }
);
await queryInterface.removeColumn(
'blog_categories',
'is_active',
{ transaction }
);
await queryInterface.removeColumn(
'blog_categories',
'sort_order',
{ transaction }
);
await queryInterface.removeColumn(
'blog_categories',
'description_ar',
{ transaction }
);
await queryInterface.removeColumn(
'blog_categories',
'slug',
{ transaction }
);
await queryInterface.removeColumn(
'blog_categories',
'name_ar',
{ transaction }
);
await queryInterface.removeColumn(
'team_members',
'is_active',
{ transaction }
);
await queryInterface.removeColumn(
'team_members',
'sort_order',
{ transaction }
);
await queryInterface.removeColumn(
'team_members',
'phone',
{ transaction }
);
await queryInterface.removeColumn(
'team_members',
'email',
{ transaction }
);
await queryInterface.removeColumn(
'team_members',
'bio_ar',
{ transaction }
);
await queryInterface.removeColumn(
'team_members',
'job_title_ar',
{ transaction }
);
await queryInterface.removeColumn(
'team_members',
'name_ar',
{ transaction }
);
await queryInterface.removeColumn(
'project_media',
'is_active',
{ transaction }
);
await queryInterface.removeColumn(
'project_media',
'sort_order',
{ transaction }
);
await queryInterface.removeColumn(
'project_media',
'caption_ar',
{ transaction }
);
await queryInterface.removeColumn(
'project_media',
'media_role',
{ transaction }
);
await queryInterface.removeColumn(
'project_media',
'media_kind',
{ transaction }
);
await queryInterface.removeColumn(
'project_media',
'projectId',
{ transaction }
);
await queryInterface.removeColumn(
'projects',
'is_published',
{ transaction }
);
await queryInterface.removeColumn(
'projects',
'is_featured',
{ transaction }
);
await queryInterface.removeColumn(
'projects',
'completed_at',
{ transaction }
);
await queryInterface.removeColumn(
'projects',
'started_at',
{ transaction }
);
await queryInterface.removeColumn(
'projects',
'description_ar',
{ transaction }
);
await queryInterface.removeColumn(
'projects',
'summary_ar',
{ transaction }
);
await queryInterface.removeColumn(
'projects',
'location_ar',
{ transaction }
);
await queryInterface.removeColumn(
'projects',
'project_scope',
{ transaction }
);
await queryInterface.removeColumn(
'projects',
'slug',
{ transaction }
);
await queryInterface.removeColumn(
'projects',
'name_ar',
{ transaction }
);
await queryInterface.removeColumn(
'service_technologies',
'sort_order',
{ transaction }
);
await queryInterface.removeColumn(
'service_technologies',
'note_ar',
{ transaction }
);
await queryInterface.removeColumn(
'service_technologies',
'technologyId',
{ transaction }
);
await queryInterface.removeColumn(
'service_technologies',
'serviceId',
{ transaction }
);
await queryInterface.removeColumn(
'technologies',
'is_active',
{ transaction }
);
await queryInterface.removeColumn(
'technologies',
'description_ar',
{ transaction }
);
await queryInterface.removeColumn(
'technologies',
'technology_type',
{ transaction }
);
await queryInterface.removeColumn(
'technologies',
'name_ar',
{ transaction }
);
await queryInterface.removeColumn(
'services',
'is_active',
{ transaction }
);
await queryInterface.removeColumn(
'services',
'is_featured',
{ transaction }
);
await queryInterface.removeColumn(
'services',
'sort_order',
{ transaction }
);
await queryInterface.removeColumn(
'services',
'description_ar',
{ transaction }
);
await queryInterface.removeColumn(
'services',
'summary_ar',
{ transaction }
);
await queryInterface.removeColumn(
'services',
'service_type',
{ transaction }
);
await queryInterface.removeColumn(
'services',
'slug',
{ transaction }
);
await queryInterface.removeColumn(
'services',
'name_ar',
{ transaction }
);
await queryInterface.removeColumn(
'stone_3d_assets',
'is_active',
{ transaction }
);
await queryInterface.removeColumn(
'stone_3d_assets',
'viewer_hint_ar',
{ transaction }
);
await queryInterface.removeColumn(
'stone_3d_assets',
'asset_type',
{ transaction }
);
await queryInterface.removeColumn(
'stone_3d_assets',
'stoneId',
{ transaction }
);
await queryInterface.removeColumn(
'stone_variants',
'is_active',
{ transaction }
);
await queryInterface.removeColumn(
'stone_variants',
'price_note_ar',
{ transaction }
);
await queryInterface.removeColumn(
'stone_variants',
'base_price',
{ transaction }
);
await queryInterface.removeColumn(
'stone_variants',
'availability_status',
{ transaction }
);
await queryInterface.removeColumn(
'stone_variants',
'weight_kg',
{ transaction }
);
await queryInterface.removeColumn(
'stone_variants',
'thickness_mm',
{ transaction }
);
await queryInterface.removeColumn(
'stone_variants',
'width_mm',
{ transaction }
);
await queryInterface.removeColumn(
'stone_variants',
'length_mm',
{ transaction }
);
await queryInterface.removeColumn(
'stone_variants',
'sku',
{ transaction }
);
await queryInterface.removeColumn(
'stone_variants',
'variant_type',
{ transaction }
);
await queryInterface.removeColumn(
'stone_variants',
'stoneId',
{ transaction }
);
await queryInterface.removeColumn(
'stones',
'is_active',
{ transaction }
);
await queryInterface.removeColumn(
'stones',
'is_featured',
{ transaction }
);
await queryInterface.removeColumn(
'stones',
'origin_country',
{ transaction }
);
await queryInterface.removeColumn(
'stones',
'origin_type',
{ transaction }
);
await queryInterface.removeColumn(
'stones',
'flexural_strength',
{ transaction }
);
await queryInterface.removeColumn(
'stones',
'compressive_strength',
{ transaction }
);
await queryInterface.removeColumn(
'stones',
'water_absorption',
{ transaction }
);
await queryInterface.removeColumn(
'stones',
'density',
{ transaction }
);
await queryInterface.removeColumn(
'stones',
'description_ar',
{ transaction }
);
await queryInterface.removeColumn(
'stones',
'short_description_ar',
{ transaction }
);
await queryInterface.removeColumn(
'stones',
'colorId',
{ transaction }
);
await queryInterface.removeColumn(
'stones',
'categoryId',
{ transaction }
);
await queryInterface.removeColumn(
'stones',
'slug',
{ transaction }
);
await queryInterface.removeColumn(
'stones',
'name_ar',
{ transaction }
);
await queryInterface.removeColumn(
'applications',
'is_active',
{ transaction }
);
await queryInterface.removeColumn(
'applications',
'description_ar',
{ transaction }
);
await queryInterface.removeColumn(
'applications',
'application_scope',
{ transaction }
);
await queryInterface.removeColumn(
'applications',
'name_ar',
{ transaction }
);
await queryInterface.removeColumn(
'finishes',
'is_active',
{ transaction }
);
await queryInterface.removeColumn(
'finishes',
'description_ar',
{ transaction }
);
await queryInterface.removeColumn(
'finishes',
'name_ar',
{ transaction }
);
await queryInterface.removeColumn(
'stone_colors',
'is_active',
{ transaction }
);
await queryInterface.removeColumn(
'stone_colors',
'sort_order',
{ transaction }
);
await queryInterface.removeColumn(
'stone_colors',
'hex',
{ transaction }
);
await queryInterface.removeColumn(
'stone_colors',
'name_ar',
{ transaction }
);
await queryInterface.removeColumn(
'stone_categories',
'category_type',
{ transaction }
);
await queryInterface.removeColumn(
'stone_categories',
'is_active',
{ transaction }
);
await queryInterface.removeColumn(
'stone_categories',
'sort_order',
{ transaction }
);
await queryInterface.removeColumn(
'stone_categories',
'description_ar',
{ transaction }
);
await queryInterface.removeColumn(
'stone_categories',
'slug',
{ transaction }
);
await queryInterface.removeColumn(
'stone_categories',
'name_ar',
{ transaction }
);
await queryInterface.removeColumn(
'hero_slides',
'is_active',
{ transaction }
);
await queryInterface.removeColumn(
'hero_slides',
'sort_order',
{ transaction }
);
await queryInterface.removeColumn(
'hero_slides',
'cta_url',
{ transaction }
);
await queryInterface.removeColumn(
'hero_slides',
'cta_label_ar',
{ transaction }
);
await queryInterface.removeColumn(
'hero_slides',
'cta_type',
{ transaction }
);
await queryInterface.removeColumn(
'hero_slides',
'subheadline_ar',
{ transaction }
);
await queryInterface.removeColumn(
'hero_slides',
'headline_ar',
{ transaction }
);
await queryInterface.removeColumn(
'social_links',
'is_active',
{ transaction }
);
await queryInterface.removeColumn(
'social_links',
'sort_order',
{ transaction }
);
await queryInterface.removeColumn(
'social_links',
'label_ar',
{ transaction }
);
await queryInterface.removeColumn(
'social_links',
'url',
{ transaction }
);
await queryInterface.removeColumn(
'social_links',
'platform',
{ transaction }
);
await queryInterface.removeColumn(
'contact_locations',
'is_primary',
{ transaction }
);
await queryInterface.removeColumn(
'contact_locations',
'longitude',
{ transaction }
);
await queryInterface.removeColumn(
'contact_locations',
'latitude',
{ transaction }
);
await queryInterface.removeColumn(
'contact_locations',
'google_maps_url',
{ transaction }
);
await queryInterface.removeColumn(
'contact_locations',
'email',
{ transaction }
);
await queryInterface.removeColumn(
'contact_locations',
'phone',
{ transaction }
);
await queryInterface.removeColumn(
'contact_locations',
'address_ar',
{ transaction }
);
await queryInterface.removeColumn(
'contact_locations',
'name_ar',
{ transaction }
);
await queryInterface.removeColumn(
'site_settings',
'seo_default_description_ar',
{ transaction }
);
await queryInterface.removeColumn(
'site_settings',
'seo_default_title_ar',
{ transaction }
);
await queryInterface.removeColumn(
'site_settings',
'accent_color_hex',
{ transaction }
);
await queryInterface.removeColumn(
'site_settings',
'primary_color_hex',
{ transaction }
);
await queryInterface.removeColumn(
'site_settings',
'direction',
{ transaction }
);
await queryInterface.removeColumn(
'site_settings',
'primary_font',
{ transaction }
);
await queryInterface.removeColumn(
'site_settings',
'site_tagline_ar',
{ transaction }
);
await queryInterface.removeColumn(
'site_settings',
'site_name_ar',
{ 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('media_library', { transaction });
await queryInterface.dropTable('seo_pages', { transaction });
await queryInterface.dropTable('inquiries', { transaction });
await queryInterface.dropTable('quote_items', { transaction });
await queryInterface.dropTable('lead_requests', { transaction });
await queryInterface.dropTable('blog_posts', { transaction });
await queryInterface.dropTable('blog_categories', { transaction });
await queryInterface.dropTable('team_members', { transaction });
await queryInterface.dropTable('project_media', { transaction });
await queryInterface.dropTable('projects', { transaction });
await queryInterface.dropTable('service_technologies', { transaction });
await queryInterface.dropTable('technologies', { transaction });
await queryInterface.dropTable('services', { transaction });
await queryInterface.dropTable('stone_3d_assets', { transaction });
await queryInterface.dropTable('stone_variants', { transaction });
await queryInterface.dropTable('stones', { transaction });
await queryInterface.dropTable('applications', { transaction });
await queryInterface.dropTable('finishes', { transaction });
await queryInterface.dropTable('stone_colors', { transaction });
await queryInterface.dropTable('stone_categories', { transaction });
await queryInterface.dropTable('hero_slides', { transaction });
await queryInterface.dropTable('social_links', { transaction });
await queryInterface.dropTable('contact_locations', { transaction });
await queryInterface.dropTable('site_settings', { 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;
}
}
};