- aggiornamento cataloghi.
possibilità di estrapolare i dati da GM direttamente - migrazione delle tabelle di GM in locale - corretto l'ordinamento del Catalogo
This commit is contained in:
122
src/server/modules/MssqlMigrator.js
Normal file
122
src/server/modules/MssqlMigrator.js
Normal file
@@ -0,0 +1,122 @@
|
||||
const axios = require('axios');
|
||||
|
||||
const mongoose = require('mongoose').set('debug', false)
|
||||
const Schema = mongoose.Schema;
|
||||
|
||||
const tools = require('../tools/general');
|
||||
|
||||
mongoose.Promise = global.Promise;
|
||||
mongoose.level = "F";
|
||||
|
||||
|
||||
class MssqlMigrator {
|
||||
/**
|
||||
* Costruttore della classe MssqlMigrator
|
||||
* @param {string} serverUrl - URL del server che esegue le query MSSQL
|
||||
* @param {string} apiKey - API Key per l'autenticazione
|
||||
*/
|
||||
constructor() {
|
||||
this.serverUrl = process.env.SERVER_A_URL;
|
||||
this.apiKey = process.env.API_KEY_MSSQL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Migra una lista di tabelle MSSQL in MongoDB usando Mongoose
|
||||
* @param {string[]} tableNames - Lista dei nomi delle tabelle MSSQL
|
||||
* @returns {string} logs - Lista dei log di esecuzione
|
||||
*/
|
||||
async migrateTables(tableNames) {
|
||||
|
||||
try {
|
||||
const logs = [];
|
||||
for (const tableName of tableNames) {
|
||||
try {
|
||||
|
||||
logs.push(`\n>> Recupero dati da MSSQL per la tabella: ${tableName}`);
|
||||
console.log(logs[logs.length - 1]);
|
||||
const dataQuery = `SELECT * FROM [${tableName}]`;
|
||||
|
||||
let dataResponse = null;
|
||||
|
||||
try {
|
||||
dataResponse = await axios.post(
|
||||
`${this.serverUrl}/query`,
|
||||
{ query: dataQuery },
|
||||
{ headers: { 'x-api-key': this.apiKey } },
|
||||
null,
|
||||
{ timeout: 300000 });
|
||||
} catch (error) {
|
||||
console.error('Error: ', error);
|
||||
if (error.message === 'socket hang up') {
|
||||
console.log('Error: hangup, waiting 5 seconds and retrying...');
|
||||
await new Promise(resolve => setTimeout(resolve, 5000));
|
||||
|
||||
dataResponse = await axios.post(
|
||||
`${this.serverUrl}/query`,
|
||||
{ query: dataQuery },
|
||||
{ headers: { 'x-api-key': this.apiKey } },
|
||||
null,
|
||||
{ timeout: 300000 });
|
||||
|
||||
} else {
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
const records = dataResponse?.data;
|
||||
|
||||
if (!records || records.length === 0) {
|
||||
logs.push(`⚠️ Nessun record trovato per la tabella: ${tableName}`);
|
||||
console.log(logs[logs.length - 1]);
|
||||
continue;
|
||||
}
|
||||
|
||||
const sample = records[0];
|
||||
const schemaDef = {};
|
||||
|
||||
for (const key of Object.keys(sample)) {
|
||||
const value = sample[key];
|
||||
if (typeof value === 'string' && key.startsWith('Data') && !isNaN(Date.parse(value))) {
|
||||
schemaDef[key] = Date;
|
||||
} else if (typeof value === 'number') {
|
||||
schemaDef[key] = Number;
|
||||
} else if (typeof value === 'boolean') {
|
||||
schemaDef[key] = Boolean;
|
||||
} else if (value instanceof Date) {
|
||||
schemaDef[key] = Date;
|
||||
} else {
|
||||
schemaDef[key] = mongoose.Schema.Types.Mixed;
|
||||
}
|
||||
}
|
||||
|
||||
const dynamicSchema = new mongoose.Schema(schemaDef, { strict: false });
|
||||
const modelName = tableName.charAt(0).toUpperCase() + tableName.slice(1);
|
||||
|
||||
// Se il modello esiste già, lo riutilizziamo
|
||||
const DynamicModel = mongoose.models[modelName] || mongoose.model(modelName, dynamicSchema);
|
||||
|
||||
// ❗ Elimina tutti i documenti esistenti prima dell'inserimento
|
||||
await DynamicModel.deleteMany({});
|
||||
|
||||
logs.push(`✅ Inserimento di ${records.length} record nella collezione MongoDB: ${modelName}`);
|
||||
console.log(logs[logs.length - 1]);
|
||||
await DynamicModel.insertMany(records);
|
||||
} catch (error) {
|
||||
logs.push(`❌ Errore con la tabella ${tableName}:`, error.message);
|
||||
console.log(logs[logs.length - 1]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
logs.push('\n🎉 Tutte le tabelle sono state migrate.');
|
||||
console.log(logs[logs.length - 1]);
|
||||
return logs.join('\n');
|
||||
} catch (error) {
|
||||
logs.push(`❌ Errore migrateTables:`, error.message);
|
||||
console.log(logs[logs.length - 1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
module.exports = MssqlMigrator;
|
||||
Reference in New Issue
Block a user