Fix jwt-token
This commit is contained in:
@@ -310,6 +310,14 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
comment: 'ID of the device sending heartbeat'
|
comment: 'ID of the device sending heartbeat'
|
||||||
},
|
},
|
||||||
|
tenant_id: {
|
||||||
|
type: Sequelize.UUID,
|
||||||
|
allowNull: true, // Nullable for backward compatibility
|
||||||
|
references: {
|
||||||
|
model: 'tenants',
|
||||||
|
key: 'id'
|
||||||
|
},
|
||||||
|
},
|
||||||
device_key: {
|
device_key: {
|
||||||
type: Sequelize.STRING,
|
type: Sequelize.STRING,
|
||||||
allowNull: true,
|
allowNull: true,
|
||||||
|
|||||||
@@ -0,0 +1,78 @@
|
|||||||
|
/**
|
||||||
|
* Migration: Add tenant_id to heartbeats table
|
||||||
|
* This migration adds tenant_id field to heartbeats for multi-tenant support
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
async up(queryInterface, Sequelize) {
|
||||||
|
try {
|
||||||
|
// Check if heartbeats table exists first
|
||||||
|
const tables = await queryInterface.showAllTables();
|
||||||
|
if (!tables.includes('heartbeats')) {
|
||||||
|
console.log('⚠️ Heartbeats table does not exist yet, skipping heartbeat tenant support migration...');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if tenant_id column already exists
|
||||||
|
const tableDescription = await queryInterface.describeTable('heartbeats');
|
||||||
|
|
||||||
|
if (!tableDescription.tenant_id) {
|
||||||
|
// Add index for tenant_id for better query performance
|
||||||
|
try {
|
||||||
|
await queryInterface.addIndex('heartbeats', ['tenant_id'], {
|
||||||
|
name: 'heartbeats_tenant_id_idx'
|
||||||
|
});
|
||||||
|
console.log('✅ Added index on heartbeats.tenant_id');
|
||||||
|
} catch (error) {
|
||||||
|
if (error.parent?.code === '42P07') { // Index already exists
|
||||||
|
console.log('⚠️ Index heartbeats_tenant_id already exists, skipping...');
|
||||||
|
} else {
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Associate existing heartbeats with default tenant (backward compatibility)
|
||||||
|
const defaultTenant = await queryInterface.sequelize.query(
|
||||||
|
'SELECT id FROM tenants WHERE slug = :slug',
|
||||||
|
{
|
||||||
|
replacements: { slug: 'default' },
|
||||||
|
type: Sequelize.QueryTypes.SELECT
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
if (defaultTenant.length > 0) {
|
||||||
|
await queryInterface.sequelize.query(
|
||||||
|
'UPDATE heartbeats SET tenant_id = :tenantId WHERE tenant_id IS NULL',
|
||||||
|
{
|
||||||
|
replacements: { tenantId: defaultTenant[0].id },
|
||||||
|
type: Sequelize.QueryTypes.UPDATE
|
||||||
|
}
|
||||||
|
);
|
||||||
|
console.log('✅ Associated existing heartbeats with default tenant');
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('✅ Added tenant_id field to heartbeats table');
|
||||||
|
} else {
|
||||||
|
console.log('⚠️ Column tenant_id already exists in heartbeats table, skipping...');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.log('⚠️ Migration skipped - tables may not exist yet:', error.message);
|
||||||
|
// Don't throw error, just skip this migration if tables don't exist
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
async down(queryInterface, Sequelize) {
|
||||||
|
// Remove index
|
||||||
|
try {
|
||||||
|
await queryInterface.removeIndex('heartbeats', 'heartbeats_tenant_id_idx');
|
||||||
|
} catch (error) {
|
||||||
|
console.log('⚠️ Index heartbeats_tenant_id_idx does not exist, skipping...');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove column
|
||||||
|
await queryInterface.removeColumn('heartbeats', 'tenant_id');
|
||||||
|
console.log('✅ Removed tenant_id field from heartbeats table');
|
||||||
|
}
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user