require('../connections/mysql-server'); require('../connections/sql-server'); require('../helpers/CheckToken'); require('../helpers/config'); const formidable = require('formidable'); const express = require('express'); const router = express.Router(); const bodyParser = require('body-parser'); router.use(bodyParser.urlencoded({ extended: true })); router.use(bodyParser.json()); var routes = function () { //=========== usar o mesmo padrão para as rotas ============== // // // getMySQL*** // // getSQLServer*** // // insertSQLServer*** // // updateSQLServer*** // // // //=========== onde "***" é o nome da tabela do mysql ========= router.get('/getAllTables', verifyJWT, (req, res) => { execSQLQuery(`SHOW TABLES`, res, req.originalUrl); }); router.post('/generateLog/:Pasta', verifyJWT, (req, res) => { var name = req.body.name; var content = req.body.content; const Pasta = req.params.Pasta; var fs = require('fs'); fs.writeFile(Variables('src_media') + "migration_log/" + Pasta + "/" + name + ".txt", content, function (erro) { if (erro) { throw erro; } res.send(true); }); }); router.get('/listLogFiles/:Pasta', verifyJWT, (req, res) => { const Pasta = req.params.Pasta; let fs = require('fs'); fs.readdir(Variables('src_media') + "migration_log/" + Pasta, (err, files) => { res.send(files); }); }); //#region Migração entre MySQLs router.post('/checkStatusUnity', verifyJWT, (req, res) => { let ip_externo = req.body.ip_externo; let porta_mysql = req.body.porta_mysql; var mysqlReference = require('mysql'); var DadosConnection = { host: ip_externo, user: 'myrobot', password: 'myrobot2019', database: 'myrobot', port: porta_mysql }; let mysqlLocal2 = mysqlReference.createConnection(DadosConnection); const SQLQry = `SELECT * FROM units;`; mysqlLocal2.query(SQLQry, function (error, results, fields) { try { if (results.length > 0) { console.log('/checkStatusUnity success 200'); res.send(true); } else { console.log('/checkStatusUnity fail 500'); res.send(false); } } catch (e) { console.log('/checkStatusUnity fail 500'); res.send(false); } }) }) router.post('/sincronizarTabela', verifyJWT, (req, res) => { let form = new formidable.IncomingForm(); form.maxFileSize = 1024 * 1024 * 1024; form.parse(req, function (err, fields, files) { let ip_externo = fields.ip_externo; let porta_mysql = fields.porta_mysql; let tabela = fields.tabela; let dados = JSON.parse(fields.dados); var mysqlReference = require('mysql'); var DadosConnection = { host: ip_externo, user: 'myrobot', password: 'myrobot2019', database: 'myrobot', port: porta_mysql }; let mysqlLocal2 = mysqlReference.createConnection(DadosConnection); const SQLQryTruncate = `TRUNCATE TABLE ` + tabela + `;`; const SQLQryBackup = `SELECT * FROM ${tabela};`; let DadosBackup; mysqlLocal2.query(SQLQryBackup, function (error, results, fields) { DadosBackup = results; mysqlLocal2.query('SET FOREIGN_KEY_CHECKS = 0;', function (error0, results0, fields0) { mysqlLocal2.query(SQLQryTruncate, function (error1, results1, fields1) { mysqlLocal2.query('SET FOREIGN_KEY_CHECKS = 1;', function (error2, results2, fields2) { Sincronizar(0, dados, tabela, mysqlLocal2, "true,", function (Sucesso) { if (Sucesso.split(',')[0] == "true") { console.log("/sincronizarTabela success 200"); res.send(Sucesso); } else { console.log("/sincronizarTabela fail 500"); Sincronizar(0, DadosBackup, tabela, mysqlLocal2, "true,", function (Sucesso2) { if (Sucesso2.split(',')[0] == "true") console.log("Backup da tabela com sucesso"); else console.log("Backup da tabela com falha"); res.send(Sucesso); }); } }); }) }) }) }) }); }) function Sincronizar(i, dados, tabela, mysqlLocal2, Certo, callback) { var SQLQryInsert = `INSERT INTO ` + tabela + ` (`; let values = []; let index = 0; for (var key in dados[i]) { if (index > 0) SQLQryInsert += ", "; SQLQryInsert += key.toString(); values.push(dados[i][key]); index++; } SQLQryInsert += `) VALUES ?`; var records = []; for (var i = 0; i < dados.length; i++) { var row = []; for (var key in dados[i]) { row.push(dados[i][key]) } records.push(row); } mysqlLocal2.query(SQLQryInsert, [records], function (error, results, fields) { if (error) { Certo = "false,"; console.log("Erro: " + error); } console.log("Sincronia MySQL finalizada na tabela '" + tabela + "'"); callback(Certo + error); }) } router.get('/SalvarDump/:token', (req, res) => { let token = req.params.token; if (token != Variables("tk_fixed")) { res.status(500).send({ status: 'expired' }); return; } const http = require('http'); mysqlConnection.query('SELECT description, ip_externo FROM units WHERE enabled = 1 AND idunits = 14;', function (error, results, fields) { let ListaUnidades = results; for (let i = 0; i < ListaUnidades.length; i++) { http.get('http://' + ListaUnidades[i]['ip_externo'] + ':' + ListaUnidades[i]['porta_api'] + '/api/migration/backupDump/' + Variables("tk_fixed"), (resp) => { let data = ''; resp.on('data', (chunk) => { data += chunk; }); resp.on('end', () => { //console.log(JSON.parse(data).response); const fs = require('fs'); let Hora = new Date(); let Nome = "dump_" + ListaUnidades[i]['description'] + "_" + Hora.getDate() + "-" + (Hora.getMonth() + 1) + "-" + Hora.getFullYear() + "_" + Hora.getHours() + "_" + Hora.getMinutes() + "_" + Hora.getSeconds() + ".sql"; let Unidade = ListaUnidades[i]['description']; let CaminhoArquivo = Variables('src_media') + 'backup_mysql/' + Unidade + "/"; let Arquivo = JSON.parse(data)['arquivo']; if (!fs.existsSync(CaminhoArquivo)) { fs.mkdirSync(CaminhoArquivo); } fs.writeFile(CaminhoArquivo + Nome, Arquivo.toString(), function (err) { if (err) { console.log("/salvarBackup fail 500 - " + ListaUnidades[i]['description']); } else { console.log("/salvarBackup success 200 - " + ListaUnidades[i]['description']); } }); }); }).on("error", (err) => { console.log(ListaUnidades[i]['description'] + " - Error: " + err.message); }); } res.send(true); }); }); //#endregion //#region Migração entre Arquivos router.post('/sincronizarArquivos', verifyJWT, (req, res) => { let Comando = req.body.comando; const shell = require('shelljs'); shell.exec(Comando, function (arquivosbaixados) { if (Comando.includes('games')) { var fs = require('fs'); fs.readdir(Variables('src_media') + "/games/", (err, files) => { var Pastas = []; files.forEach(file => { Pastas.push(file.toString()); }); BaixarBuild(Pastas, 0, function (Sucesso) { shell.exec('chmod -R 777 /var/www/html/', function (Sucesso) { console.log(new Date().toUTCString() + " - " + req.originalUrl + " success 200"); res.send(JSON.stringify({ "baixados": Sucesso })) }) }); }); } else { shell.exec('chmod -R 777 /var/www/html/', function (arquivosmovidos) { console.log(new Date().toUTCString() + " - " + req.originalUrl + " success 200"); res.send(JSON.stringify({ "baixados": arquivosbaixados })) }) } }); }); function BaixarBuild(Pastas, Index, Callback) { const shell = require('shelljs'); if (Index < Pastas.length) { shell.exec('wget -c -P /var/www/html/ -nH -r -k -np "http://18.228.91.135/games/' + Pastas[Index] + '/Build/" -R index.html?*', function (Sucesso) { console.log(Sucesso); Index++; BaixarBuild(Pastas, Index, Callback); }) } else { Callback(true); } } router.get('/backupDump/:token', (req, res) => { let token = req.params.token; if (token != Variables("tk_fixed")) { res.status(500).send({ status: 'expired' }); return; } const fs = require('fs'); const shell = require('shelljs'); shell.exec('mysqldump -u' + Variables('user_mysql') + ' -p' + Variables('password_mysql') + ' myrobot > ' + Variables('src_media') + 'backup/dump.sql', function (sucesso) { const Arquivo = Variables('src_media') + 'backup/dump.sql'; fs.readFile(Arquivo, (err, data) => { console.log(new Date().toUTCString() + " - " + req.originalUrl + " success 200"); res.send(JSON.stringify({ "arquivo": Buffer.from(data).toString() })); }) }) }) router.post('/salvarBackup', verifyJWT, (req, res) => { let form = new formidable.IncomingForm(); form.maxFileSize = 1024 * 1024 * 1024; form.parse(req, function (err, fields, files) { const fs = require('fs'); let Nome = fields.name; let Unidade = fields.unit; let CaminhoArquivo = Variables('src_media') + 'backup_mysql/' + Unidade + "/"; let Arquivo = fields.arquivo; if (!fs.existsSync(CaminhoArquivo)) { fs.mkdirSync(CaminhoArquivo); } fs.writeFile(CaminhoArquivo + Nome, Arquivo.toString(), function (err) { if (err) { console.log(new Date().toUTCString() + " - " + req.originalUrl + " fail 500"); res.send(false); } else { console.log(new Date().toUTCString() + " - " + req.originalUrl + " success 200"); res.send(true); } }); }); }); router.get('/setLastUpdate/:idunits', verifyJWT, (req, res) => { const idunits = req.params.idunits; execSQLQuery(`UPDATE units SET last_update = now() WHERE idunits = ${idunits};`, res, req.originalUrl); }) //#endregion //#region EXECUTAR COMANDO TERMINAL router.post('/CommandExec', verifyJWT, (req, res) => { let Comando = req.body.comando; const shell = require('shelljs'); let Resposta = shell.exec(Comando); res.send(JSON.stringify({ "resultado": Resposta })); }); //#endregion //#region Migração entre SQLServer router.post('/MigrarSQLServer/:insert/:db', verifyJWT, (req, res) => { let Tabela = req.body.Tabela; let Dados = JSON.parse(req.body.Dados); let Insert = req.params.insert; let db = req.params.db; //console.log(Tabela); //console.log(Dados); let SQLMigracao = ``; let Campos = ''; let Valores = ''; if (Insert == "true") { // INSERIR APENAS NOVOS REGISTROS for (var campo in Dados[0]) { Campos += campo + ", "; } Campos = "(" + Campos.substr(0, Campos.length - 2) + ")"; //console.log(Campos); for (let i = 0; i < Dados.length; i++) { let Ind = 0; for (let campo in Dados[0]) { if (Ind == 0) Valores += "('" + Dados[i][campo] + "', "; else Valores += "'" + Dados[i][campo] + "', "; Ind++; } Valores = Valores.substr(0, Valores.length - 2) + "), "; } Valores = Valores.substr(0, Valores.length - 2); //console.log(Valores); SQLMigracao = `INSERT INTO ${db}${Tabela} ${Campos} VALUES ${Valores};`; //console.log(SQLMigracao); execSQLQuery2(SQLMigracao, res, req.originalUrl); //res.send(SQLMigracao); } else { // INSERIR TODOS ATUALIZANDO OS REGISTROS JA EXISTENTES //console.log(Campos); let CampoID = ""; let ValorID = ""; for (let i = 0; i < Dados.length; i++) { let Ind = 0; for (let campo in Dados[0]) { if (Ind == 0) { CampoID = campo; ValorID = Dados[i][campo]; Valores += `UPDATE ${db}${Tabela} SET `; } else { Valores += campo + " = '" + Dados[i][campo] + "', "; } Ind++; } Valores = `${Valores.substr(0, Valores.length - 2)} WHERE ${CampoID} = '${ValorID}'; `; } //console.log(Valores); SQLMigracao = Valores; //console.log(SQLMigracao); execSQLQuery2(SQLMigracao, res, req.originalUrl); //res.send(SQLMigracao); } }); router.post('/ExecutarSQLServerQuery', verifyJWT, (req, res) => { const sqlQuery = req.body.comando; execSQLQuery2(sqlQuery, res, req.originalUrl); }) router.post('/ExecutarMySQLQuery', verifyJWT, (req, res) => { const sqlQuery = req.body.comando; execSQLQuery(sqlQuery, res, req.originalUrl); }) //#endregion //#region MIGRACAO DADOS MYSQL LOCAL PARA ONLINE router.post('/MigracaoMySQLLocalToWeb', verifyJWT, (req, res) => { const ip_externo = req.body.ip_externo; const porta_mysql = req.body.porta_mysql; var mysqlReference = require('mysql'); var DadosConnection = { host: ip_externo, user: 'myrobot', password: 'myrobot2019', database: 'myrobot', port: porta_mysql }; let mysqlLocal2 = mysqlReference.createConnection(DadosConnection); const CamposStepclass = `idusers,idclasses,actualClass,actualExercise,actualAnswer,actualItem,answersdb,continueClass,completedClass,note,notification,idunits,notegame,homework,datefinal,dateinicial`; const SQLQryStepclass = `select idusers,idclasses,actualClass,actualExercise,actualAnswer,actualItem,answersdb,continueClass,completedClass,note,notification,idunits,notegame,homework,datefinal,date_format(dateinicial, '%Y-%m-%d %h:%i:%s') AS dateinicial from stepclass;`; const CamposUsergivenanswers = `idusers,idexerciseanswers,date_answered,fixed,idclasses,idunits`; const SQLQryUsergivenanswers = `select ${CamposUsergivenanswers} from usergivenanswers;`; const CamposUserstages = `idstages,idusers,idunits,idclasses,note`; const SQLQryUserstages = `select ${CamposUserstages} from userstages;`; mysqlLocal2.query(SQLQryStepclass, function (errorStepclass, resultsStepclss, fieldsStepclass) { const TabelaStepclass = resultsStepclss; mysqlLocal2.query(SQLQryUsergivenanswers, function (errorUsergivenanswers, resultsUsergivenanswers, fieldsUsergivenanswers) { const TabelaUsergivenanswers = resultsUsergivenanswers mysqlLocal2.query(SQLQryUserstages, function (errorUserstages, resultsUserstages, fieldsUserstages) { const TabelaUserstages = resultsUserstages; mysqlConnection.query(CriaSQLInsert(TabelaStepclass, CamposStepclass, 'stepclass'), function (errorStepclass1, resultsStepclss1, fieldsStepclass1) { console.log(req.originalUrl + " success 200 - stepclass"); mysqlConnection.query(CriaSQLInsert(TabelaUsergivenanswers, CamposUsergivenanswers, 'usergivenanswers'), function (errorUsergivenanswers1, resultsUsergivenanswers1, fieldsUsergivenanswers1) { console.log(req.originalUrl + " success 200 - usergivenanswers"); mysqlConnection.query(CriaSQLInsert(TabelaUserstages, CamposUserstages, 'userstages'), function (errorUserstages1, resultsUserstages1, fieldsUserstages1) { console.log(req.originalUrl + " success 200 - userstages"); res.send(JSON.stringify({ Stepclass: { SQL: CriaSQLInsert(TabelaStepclass, CamposStepclass, 'stepclass'), results: resultsStepclss1, error: errorStepclass1, original: resultsStepclss }, Usergivenanswers: { SQL: CriaSQLInsert(TabelaUsergivenanswers, CamposUsergivenanswers, 'usergivenanswers'), results: resultsUsergivenanswers1, error: errorUsergivenanswers1, original: resultsUsergivenanswers }, Userstages: { SQL: CriaSQLInsert(TabelaUserstages, CamposUserstages, 'userstages'), results: resultsUserstages1, error: errorUserstages1, original: resultsUserstages }, })); }); }); }); }); }) }) }); function CriaSQLInsert(Dados, Campos, Tabela) { let SQLQueryInsert = ``; if (Dados && Dados.length > 0) { SQLQueryInsert = `INSERT INTO ${Tabela} (${Campos}) VALUES `; let Registros = ``; for (let i = 0; i < Dados.length; i++) { for (let o = 0; o < Campos.split(',').length; o++) { if (o == 0) Registros += '('; let Registro = Dados[i][Campos.split(',')[o]]; if (Registro == null) { Registros += `null,`; } else if (typeof (Registro) == "number" || typeof (Registro) == "boolean") { Registros += `${Registro},`; } else if (typeof (Registro) == "string" || typeof (Registro) == "object") { Registros += `'${Registro}',`; } else { Registros += `null,`; } if (o == Campos.split(',').length - 1) Registros = Registros.substr(0, Registros.length - 1) + '),'; } } SQLQueryInsert += Registros.substr(0, Registros.length - 1) + ";"; } return SQLQueryInsert; } router.get('/RemoverDuplicadosMySQL', (req, res) => { console.log(req.originalUrl + " initializing..."); const SQLQueryStepclass = `select sc.idstepclass, R.*, sc.note, sc.completedClass, sc.notegame, sc.homework from (select idusers, idunits, idclasses, count(idusers) as qtde from stepclass group by idusers, idunits, idclasses HAVING COUNT(*) > 1) R inner join stepclass sc on sc.idclasses = R.idclasses AND sc.idunits = R.idunits AND sc.idusers = R.idusers ORDER BY idusers, idunits, idclasses;`; const SQLQueryUsergivenanswers = `SELECT ug.idusergivenanswers, R.* FROM (SELECT idusers, idunits, idclasses, idexerciseanswers, COUNT(*) AS qtde FROM usergivenanswers GROUP BY idusers, idunits, idclasses, idexerciseanswers HAVING COUNT(*) > 1) R INNER JOIN usergivenanswers ug ON ug.idusers = R.idusers and ug.idunits = R.idunits and ug.idexerciseanswers = R.idexerciseanswers ORDER BY ug.idusers, ug.idunits, ug.idclasses, ug.idexerciseanswers;`; const SQLQueryUserstages = `SELECT us.iduserstages, R.* FROM (SELECT idusers, idunits, idclasses, idstages, COUNT(*) AS qtde FROM userstages GROUP BY idusers, idunits, idclasses, idstages HAVING COUNT(*) > 1) R INNER JOIN userstages us ON us.idusers = R.idusers and us.idunits = R.idunits and us.idstages = R.idstages ORDER BY us.idusers, us.idunits, us.idclasses, us.idstages;`; RemoverDuplicadosTabela(true, SQLQueryStepclass, ['note', 'completedClass', 'notegame', 'homework'], 'stepclass', function(results1, error1) { console.log("Sucesso: stepclass"); RemoverDuplicadosTabela(false, SQLQueryUsergivenanswers, ['idusers', 'idunits', 'idclasses', 'idexerciseanswers'], 'usergivenanswers', function(results2, error2) { console.log("Sucesso: usergivenanswers"); RemoverDuplicadosTabela(false, SQLQueryUserstages, ['idusers', 'idunits', 'idclasses', 'idstages'], 'userstages', function(results3, error3) { console.log("Sucesso: userstages"); res.send(JSON.stringify({ StepClass: { response: results1, error: error1, }, UserGivenAnswers: { response: results2, error: error2, }, UserStages: { response: results3, error: error3, }, })); console.log(req.originalUrl + " success 200"); }); }); }); //execSQLQuery(SQLQuery, res, req); }); function RemoverDuplicadosTabela(Comparacao, SQLQuery, Campos, Tabela, callback) { mysqlConnection.query(SQLQuery, function (error, results, fields) { let TabelaDuplicadas = results; if (TabelaDuplicadas && TabelaDuplicadas.length > 0) { let IDs = ``; if (Comparacao) { // METODO DE COMPARACAO DE DADOS let DadosDuplicados = []; for (let i = 0; i < TabelaDuplicadas.length; i = i + 2) { DadosDuplicados.push(ComparaDuplicados(Campos, TabelaDuplicadas, i)); } let Resultados = []; for (let i = 0; i < DadosDuplicados.length; i++) { let Indice = 0; let Somatoria = 0; for (let o = 0; o < DadosDuplicados[i].length; o++) { Somatoria += DadosDuplicados[i][o]; } Resultados.push(Somatoria); if (Somatoria >= 0) Resultados.push(-10); else Resultados.push(10); } for (let i = 0; i < TabelaDuplicadas.length; i = i + 2) { try { if (Resultados[i] >= 0) IDs += TabelaDuplicadas[i + 1]['id' + Tabela] + ','; else IDs += TabelaDuplicadas[i]['id' + Tabela] + ','; } catch (e) { } } } else { // REMOCAO DE DADOS ATRAVES DE QUANTIDADE REPETIDA let NovaTabela = []; for (let i = 0; i < TabelaDuplicadas.length; i++) { let Repetido = false; for (let o = 0; o < NovaTabela.length; o++) { let TotalIgual = 0; for (let u = 0; u < Campos.length; u++) { if (TabelaDuplicadas[i][Campos[u]] == NovaTabela[o][Campos[u]]) { TotalIgual++; } } if (TotalIgual == Campos.length) { IDs += TabelaDuplicadas[i]['id' + Tabela] + ","; Repetido = true; break; } } if (!Repetido) NovaTabela.push(TabelaDuplicadas[i]); } //callback(NovaTabela, TabelaDuplicadas); } IDs = IDs.substr(0, IDs.length - 1); RemoverDados(Tabela, IDs, TabelaDuplicadas.length, 0, function (Finalizado) { callback(results, error); }); } else { callback(results, error); } }); } function ComparaDuplicados(Campos, TabelaDuplicadas, i) { let Dados = []; for (let o = 0; o < Campos.length; o++) { let IIgualdade = 0; try { if ((TabelaDuplicadas[i][Campos[o]] > TabelaDuplicadas[i + 1][Campos[o]]) || (TabelaDuplicadas[i][Campos[o]] != null && TabelaDuplicadas[i + 1][Campos[o]] == null)) IIgualdade++; else if ((TabelaDuplicadas[i][Campos[o]] < TabelaDuplicadas[i + 1][Campos[o]]) || (TabelaDuplicadas[i][Campos[o]] == null && TabelaDuplicadas[i + 1][Campos[o]] != null)) IIgualdade--; } catch (e) { } Dados.push(IIgualdade); } return Dados; } function RemoverDados(Tabela, IDs, Registros, Removidos, callback) { const SQLRemover = `DELETE FROM ${Tabela} WHERE id${Tabela} IN (${IDs});`; mysqlConnection.query(SQLRemover, function (error, results, fields) { Removidos++; console.log("Dados removidos: " + Tabela); if (results['affectedRows'] == 0) { callback(true); } else { RemoverDados(Tabela, IDs, Registros, Removidos, callback); } }); } //#endregion //#region MODO EMERGENCIAL router.get('/CheckInternetStatus', (req, res) => { console.log("Verificando conexão com a internet..."); checkInternet(function(isConnected) { let StepClass = []; let SQLSC = "INSERT INTO stepclass (idstepclass, idusers, idclasses, actualClass, actualExercise, actualAnswer, actualItem, answersdb, continueClass, completedClass, note, notification, idunits, notegame, homework, datefinal, dateinicial) VALUES "; let UserGivenAnswers = []; let SQLUG = "INSERT INTO usergivenanswers (idusergivenanswers, idusers, idexerciseanswers, date_answered, fixed, idclasses, idunits) VALUES "; let UserStages = []; let SQLUS = "INSERT INTO userstages (iduserstages, idstages, idusers, idunits, idclasses, note) VALUES "; let Comando = ``; if (isConnected && Variables('local') == "Local") { //console.log("CASO 1"); mysqlConnection.query("select idusers, idclasses, actualClass, actualExercise, actualAnswer, actualItem, answersdb, continueClass, completedClass, note, notification, idunits, notegame, homework, datefinal, date_format(dateinicial, '%Y/%m-%d %h:%i:%s') as 'dateinicial' from stepclass;", function (errorSC, resultsSC, fieldsSC) { StepClass = resultsSC; mysqlConnection.query('select idusers, idexerciseanswers, date_answered, fixed, idclasses, idunits from usergivenanswers;', function (errorUG, resultsUG, fieldsUG) { UserGivenAnswers = resultsUG; mysqlConnection.query('select idstages, idusers, idunits, idclasses, note from userstages;', function (errorUS, resultsUS, fieldsUS) { UserStages = resultsUS; if (resultsSC && resultsSC.length > 0) SQLSC = MontaSQLInsert(SQLSC, StepClass, "stepclass"); else SQLSC = "SELECT 1"; if (resultsUG && resultsUG.length > 0) SQLUG = MontaSQLInsert(SQLUG, UserGivenAnswers, "usergivenanswers"); else SQLUG = "SELECT 1"; if (resultsUS && resultsUS.length > 0) SQLUS = MontaSQLInsert(SQLUS, UserStages, "userstages"); else SQLUS = "SELECT 1"; Comando = `sed -i 's/var Online = false;/var Online = true;/' /var/www/myrobot_api/helpers/config.js;sed -i 's/Emergencia=1;/Emergencia=0;/' /var/www/html/assets/LW.cnf`; ExecutaMudanca(Comando, isConnected, res, SQLSC, SQLUG, SQLUS); }); }); }); } else if (!isConnected && Variables('local') == "Online") { //console.log("CASO 2"); Comando = `sed -i 's/var Online = true;/var Online = false;/' /var/www/myrobot_api/helpers/config.js;sed -i 's/Emergencia=0;/Emergencia=1;/' /var/www/html/assets/LW.cnf`; ExecutaMudanca(Comando, isConnected, res, "", "", ""); } else { //console.log("CASO 3"); Comando = `echo "Operação do servidor estável"`; ExecutaMudanca(Comando, isConnected, res, "", "", ""); } }); }); function MontaSQLInsert(SQLIN, Tabela, NomeTabela) { for (let i = 0; i < Tabela.length; i++) { SQLIN += `((select (tb1.id${NomeTabela} + 1) from ${NomeTabela} tb1 order by tb1.id${NomeTabela} desc limit 1), `; for (let key in Tabela[i]) { //.toISOString().replace(/T/, ' ').replace(/\..+/, '') SQLIN += ((Tabela[i][key] == null) ? "" : "'") + ((Tabela[i][key]) ? Tabela[i][key].toString().replace("/", "-") : Tabela[i][key]) + ((Tabela[i][key] == null) ? "," : "',"); } SQLIN = SQLIN.substring(0, SQLIN.length - 1) + "),"; } SQLIN = SQLIN.substring(0, SQLIN.length - 1) + ";"; return SQLIN; } function ExecutaMudanca(Comando, isConnected, res, SQLSC, SQLUG, SQLUS) { const shell = require('shelljs'); let LocalAntes = Variables('local'); shell.exec(Comando, function (sucesso) { let LocalAgora = ""; if (isConnected) { Variables_Set("local", true); console.log(new Date().toUTCString() + " - Servidor operando em modo normal"); LocalAgora = "Online"; } else { Variables_Set("local", false); console.log(new Date().toUTCString() + " - Servidor operando em modo de emergência"); LocalAgora = "Local"; } //console.log("Antes: " + LocalAntes); //console.log("Agora: " + LocalAgora); if (LocalAntes != LocalAgora) { if (LocalAgora == "Online") { var mysqlReference = require('mysql'); var DadosConnection = { host: "127.0.0.1", user: "myrobot", password: "myrobot2019", database: Variables('database_mysql'), port: 3306 }; let mysqlLocal2 = mysqlReference.createConnection(DadosConnection); mysqlLocal2.query("TRUNCATE stepclass;", function (errorSC1, resultsSC1, fieldsSC1) { mysqlLocal2.query("TRUNCATE usergivenanswers;", function (errorUG1, resultsUG1, fieldsUG1) { mysqlLocal2.query("TRUNCATE userstages;", function (errorUS1, resultsUS1, fieldsUS1) { console.log(new Date().toUTCString() + " - Dados removidos do banco Local com sucesso!"); if (LocalAntes == "Local" && (SQLSC != "SELECT 1" || SQLUG != "SELECT 1" || SQLUS != "SELECT 1")) { SincronizarDadosParaOnline(SQLSC, SQLUG, SQLUS); } else { AtualizaConexaoMySQL(); } }); }); }); } else { AtualizaConexaoMySQL(); } } res.send(true); }); } function checkInternet(cb) { require('dns').lookup('myrobotlab.com.br', function(err) { if (err) cb(false); else cb(true); }) } function SincronizarDadosParaOnline(SQLSC, SQLUG, SQLUS) { var mysqlReference = require('mysql'); var DadosConnection = { host: "18.228.91.135", user: "root", password: "maker2018**==", database: Variables('database_mysql'), port: 3306 }; mysqlLocal2 = mysqlReference.createConnection(DadosConnection); console.log(new Date().toUTCString() + " - Sincronizando dados para o servidor WEB..."); setTimeout(() => { mysqlLocal2.query(SQLSC, function (errorSC, resultsSC, fieldsSC) { mysqlLocal2.query(SQLUG, function (errorUG, resultsUG, fieldsUG) { mysqlLocal2.query(SQLUS, function (errorUS, resultsUS, fieldsUS) { console.log(new Date().toUTCString() + " - Dados sincronizados com sucesso!"); AtualizaConexaoMySQL(); }); }); }); }, 1000); } //#endregion //#region SINCRONIA AUTOMATICA router.get('/SincroniaAutomaticaMySQL/:token', (req, res) => { let token = req.params.token; if (token != Variables("tk_fixed")) { res.status(500).send({ status: 'expired' }); return; } if (Variables('local') == "Local") { console.log("Servidor em modo local - não baixa atualizações"); res.send(false); return; } const shell = require('shelljs'); const Comando = `cd /var/www/html/backup/;rm dump1.sql;wget http://18.228.91.135/backup/dump1.sql;mysql --protocol=tcp --host=127.0.0.1 --user=myrobot --password=myrobot2019 --port=3306 --database=${Variables("database_mysql")} < "dump1.sql"`; shell.exec(Comando, function(Sucesso) { var mysqlReference = require('mysql'); var DadosConnection = { host: "127.0.0.1", user: "myrobot", password: "myrobot2019", database: Variables('database_mysql'), port: 3306 }; let mysqlLocal2 = mysqlReference.createConnection(DadosConnection); mysqlLocal2.query('SET FOREIGN_KEY_CHECKS = 0;', function (error0, results0, fields0) { console.log(new Date().toUTCString() + " - " + "Limpando stepclass..."); mysqlLocal2.query("TRUNCATE stepclass;", function (errorSC1, resultsSC1, fieldsSC1) { if (errorSC1) console.log(errorSC1); console.log(new Date().toUTCString() + " - " + "Limpando usergivenanswers..."); mysqlLocal2.query("TRUNCATE usergivenanswers;", function (errorUG1, resultsUG1, fieldsUG1) { if (errorUG1) console.log(errorUG1); console.log(new Date().toUTCString() + " - " + "Limpando userstages..."); mysqlLocal2.query("TRUNCATE userstages;", function (errorUS1, resultsUS1, fieldsUS1) { if (errorUS1) console.log(errorUS1); mysqlLocal2.query('SET FOREIGN_KEY_CHECKS = 1;', function (error1, results1, fields1) { console.log(new Date().toUTCString() + " - " + "MySQL sincronizado com sucesso!"); res.send(true); }); }); }); }); }); }); }); //#endregion //#region CORRECAO DO BANCO SQL SERVER router.get('/RemoverMatriculasTeste/:matriculas/:unidades', (req, res) => { const Matriculas = req.params.matriculas; const UnidadesIDs = req.params.unidades; mysqlConnection.query(`select * from units where idunits in ${UnidadesIDs};`, function (error, resUnits, fields) { let Unidades = resUnits; LoopUnidades(Unidades, 0, Matriculas, function(Sucesso) { let TabelasMySQL = []; TabelasMySQL.push({"Tabela": "stepclass", "IDUsers": Matriculas, "IDUnits": UnidadesIDs}); TabelasMySQL.push({"Tabela": "usergivenanswers", "IDUsers": Matriculas, "IDUnits": UnidadesIDs}); TabelasMySQL.push({"Tabela": "userstages", "IDUsers": Matriculas, "IDUnits": UnidadesIDs}); LoopDeleteMySQL(TabelasMySQL, 0, function(Sucesso2) { res.send(true); }); }); }); }); function LoopUnidades(Unidades, Index, Matriculas, callback) { if (Index < Unidades.length) { const db = Unidades[Index]['reference_db'] + ".dbo."; const SQLConsultaIDs = `select distinct ma.IDMatricula, cl.IDCliente, cl.Nome, at.IdAtendimento, pm.IDPreMatricula, tu.IdTurma, tc.IdTurmasCalendario, ch.IDChamadas, pr.IDPreRequerimento from ${db}Matriculas ma left join ${db}Clientes cl on cl.IDCliente = ma.IDClienteResponsavel left join ${db}TreinandosTurmas tt on tt.IDMatricula = ma.IDMatricula left join ${db}Atendimentos at on at.IdAtendimento = ma.IDAtendimento left join ${db}PreMatricula pm on pm.IDPreMatricula = ma.IDPreMatricula left join ${db}Turmas tu on tu.IdTurma = tt.CodigoTurma left join ${db}TurmasCalendario tc on tc.IdTurma = tu.IdTurma left join ${db}Chamadas ch on ch.IDTurma = tu.IdTurma left join ${db}ChamadasConteudos cc on cc.IDChamadas = ch.IDChamadas left join ${db}ChamadasDetalhes cd on cd.IDChamadas = ch.IDChamadas left join ${db}PreRequerimento pr on pr.IDMatricula = ma.IDMatricula left join ${db}RemanejamentoDetalhes rd on rd.IDMatricula = ma.IDMatricula where ma.IDMatricula in ${Matriculas};`; sqlServerConnection.request().query(SQLConsultaIDs, function (error, results, fields) { const ResultadoIDs = results.recordsets[0]; let IDsChamadas = "("; let IDsPreRequerimento = "("; let IDsTurmas = "("; let IDsPreMatriculas = "("; let IDsAtendimentos = "("; let IDsClientes = "("; let IDsMatriculas = "("; let IDsRemanejamentos = "("; for (let i = 0; i < ResultadoIDs.length; i++) { if (!IDsChamadas.includes(ResultadoIDs[i]['IDChamadas']) && ResultadoIDs[i]['IDChamadas'] != null) IDsChamadas += ResultadoIDs[i]['IDChamadas'] + ","; if (!IDsPreRequerimento.includes(ResultadoIDs[i]['IDPreRequerimento']) && ResultadoIDs[i]['IDPreRequerimento'] != null) IDsPreRequerimento += ResultadoIDs[i]['IDPreRequerimento'] + ","; if (!IDsTurmas.includes(ResultadoIDs[i]['IdTurma']) && ResultadoIDs[i]['IdTurma'] != null) IDsTurmas += ResultadoIDs[i]['IdTurma'] + ","; if (!IDsPreMatriculas.includes(ResultadoIDs[i]['IDPreMatricula']) && ResultadoIDs[i]['IDPreMatricula'] != null) IDsPreMatriculas += ResultadoIDs[i]['IDPreMatricula'] + ","; if (!IDsAtendimentos.includes(ResultadoIDs[i]['IdAtendimento']) && ResultadoIDs[i]['IdAtendimento'] != null) IDsAtendimentos += ResultadoIDs[i]['IdAtendimento'] + ","; if (!IDsClientes.includes(ResultadoIDs[i]['IDCliente']) && ResultadoIDs[i]['IDCliente'] != null) IDsClientes += ResultadoIDs[i]['IDCliente'] + ","; if (!IDsMatriculas.includes(ResultadoIDs[i]['IDMatricula']) && ResultadoIDs[i]['IDMatricula'] != null) IDsMatriculas += ResultadoIDs[i]['IDMatricula'] + ","; if (!IDsRemanejamentos.includes(ResultadoIDs[i]['IDRemanejamento']) && ResultadoIDs[i]['IDRemanejamento'] != null) IDsRemanejamentos += ResultadoIDs[i]['IDRemanejamento'] + ","; } IDsChamadas = IDsChamadas.substring(0, IDsChamadas.length - 1) + ")"; IDsPreRequerimento = IDsPreRequerimento.substring(0, IDsPreRequerimento.length - 1) + ")"; IDsTurmas = IDsTurmas.substring(0, IDsTurmas.length - 1) + ")"; IDsPreMatriculas = IDsPreMatriculas.substring(0, IDsPreMatriculas.length - 1) + ")"; IDsAtendimentos = IDsAtendimentos.substring(0, IDsAtendimentos.length - 1) + ")"; IDsClientes = IDsClientes.substring(0, IDsClientes.length - 1) + ")"; IDsMatriculas = IDsMatriculas.substring(0, IDsMatriculas.length - 1) + ")"; IDsRemanejamentos = IDsRemanejamentos.substring(0, IDsRemanejamentos.length - 1) + ")"; let Tabelas = []; // chamadas Tabelas.push({"Tabela": "ChamadasDetalhes", "CampoID": "IDChamadas", "ValorID": IDsChamadas}); Tabelas.push({"Tabela": "ChamadasConteudos", "CampoID": "IDChamadas", "ValorID": IDsChamadas}); Tabelas.push({"Tabela": "Chamadas", "CampoID": "IDChamadas", "ValorID": IDsChamadas}); // pre requerimentos Tabelas.push({"Tabela": "PreRequerimento", "CampoID": "IDPreRequerimento", "ValorID": IDsPreRequerimento}); // turmas Tabelas.push({"Tabela": "TurmasCalendario", "CampoID": "IdTurma", "ValorID": IDsTurmas}); Tabelas.push({"Tabela": "TurmasDetalhes", "CampoID": "IDTurma", "ValorID": IDsTurmas}); Tabelas.push({"Tabela": "TurmasAgendaCalendario", "CampoID": "IdTurma", "ValorID": IDsTurmas}); Tabelas.push({"Tabela": "TransacoesTurmasDetalhe", "CampoID": "IdTurma", "ValorID": IDsTurmas}); Tabelas.push({"Tabela": "TransacoesTurmasCalendario", "CampoID": "IdTurma", "ValorID": IDsTurmas}); Tabelas.push({"Tabela": "TransacoesTurmas", "CampoID": "IdTurma", "ValorID": IDsTurmas}); Tabelas.push({"Tabela": "Notas", "CampoID": "IDTurma", "ValorID": IDsTurmas}); Tabelas.push({"Tabela": "AtendimentosFuncionarios", "CampoID": "IdTurma", "ValorID": IDsTurmas}); Tabelas.push({"Tabela": "Turmas", "CampoID": "IdTurma", "ValorID": IDsTurmas}); // pre matricula Tabelas.push({"Tabela": "PreMatriculaCursos", "CampoID": "IDPreMatricula", "ValorID": IDsPreMatriculas}); Tabelas.push({"Tabela": "PreMatriculaFinanceiroMaterial", "CampoID": "IDPreMatricula", "ValorID": IDsPreMatriculas}); Tabelas.push({"Tabela": "PreMatriculaParcelas", "CampoID": "IDPreMatricula", "ValorID": IDsPreMatriculas}); Tabelas.push({"Tabela": "PreMatriculaTreinandos", "CampoID": "IDPreMatricula", "ValorID": IDsPreMatriculas}); Tabelas.push({"Tabela": "PreMatricula", "CampoID": "IDPreMatricula", "ValorID": IDsPreMatriculas}); // atendimentos Tabelas.push({"Tabela": "AtendimentosComissoes", "CampoID": "IdAtendimento", "ValorID": IDsAtendimentos}); Tabelas.push({"Tabela": "AtendimentosCabecalho", "CampoID": "IdAtendimento", "ValorID": IDsAtendimentos}); Tabelas.push({"Tabela": "ControleAtendimento", "CampoID": "IdAtendimento", "ValorID": IDsAtendimentos}); Tabelas.push({"Tabela": "Atendimentos", "CampoID": "IdAtendimento", "ValorID": IDsAtendimentos}); // clientes Tabelas.push({"Tabela": "Clientes", "CampoID": "IDCliente", "ValorID": IDsClientes}); // matriculas Tabelas.push({"Tabela": "Evadidos", "CampoID": "IDMatricula", "ValorID": IDsMatriculas}); Tabelas.push({"Tabela": "HistoricoEvadidos", "CampoID": "IDMatricula", "ValorID": IDsMatriculas}); Tabelas.push({"Tabela": "HistoricoFaltas", "CampoID": "IDMatricula", "ValorID": IDsMatriculas}); Tabelas.push({"Tabela": "HistoricoMatriculas", "CampoID": "IDMatricula", "ValorID": IDsMatriculas}); Tabelas.push({"Tabela": "HistoricoTreinandosTurmas", "CampoID": "IDMatricula", "ValorID": IDsMatriculas}); Tabelas.push({"Tabela": "MatriculasCursos", "CampoID": "IDMatricula", "ValorID": IDsMatriculas}); Tabelas.push({"Tabela": "MatriculasProdutos", "CampoID": "IDMatricula", "ValorID": IDsMatriculas}); Tabelas.push({"Tabela": "MatriculasTreinandos", "CampoID": "IDMatricula", "ValorID": IDsMatriculas}); Tabelas.push({"Tabela": "NotasDetalhes", "CampoID": "IDMatricula", "ValorID": IDsMatriculas}); Tabelas.push({"Tabela": "NotasDetalhesSequencial", "CampoID": "IDMatricula", "ValorID": IDsMatriculas}); Tabelas.push({"Tabela": "TreinandosTurmasMateriais", "CampoID": "IDMatricula", "ValorID": IDsMatriculas}); Tabelas.push({"Tabela": "TreinandosTurmas", "CampoID": "IDMatricula", "ValorID": IDsMatriculas}); Tabelas.push({"Tabela": "Transferencias", "CampoID": "IDMatricula", "ValorID": IDsMatriculas}); Tabelas.push({"Tabela": "ContasReceber", "CampoID": "IDMatricula", "ValorID": IDsMatriculas}); Tabelas.push({"Tabela": "Matriculas", "CampoID": "IDMatricula", "ValorID": IDsMatriculas}); LoopDeleteSQLServer(db, Tabelas, 0, function(Sucesso) { console.log(`Banco SQLServer da unidade de ${Unidades[Index]['unityname']} corrigido com sucesso!`); Index++; LoopUnidades(Unidades, Index, Matriculas, callback); }); }); } else { callback(true); } } function LoopDeleteSQLServer(db, Tabelas, Index, callback) { if (Index < Tabelas.length) { const SQLDelete = `delete from ${db}${Tabelas[Index]['Tabela']} where ${Tabelas[Index]['CampoID']} in ${Tabelas[Index]['ValorID']};`; //console.log(SQLDelete); sqlServerConnection.request().query(SQLDelete, function (error, results, fields) { Index++; LoopDeleteSQLServer(db, Tabelas, Index, callback); }); } else { callback(true); } } function LoopDeleteMySQL(Tabelas, Index, callback) { if (Index < Tabelas.length) { const SQLDelete = `delete from ${Tabelas[Index]['Tabela']} where idunits in ${Tabelas[Index]['IDUnits']} and idusers in ${Tabelas[Index]['IDUsers']};`; //console.log(SQLDelete); mysqlConnection.query(SQLDelete, function (error, results, fields) { Index++; LoopDeleteMySQL(Tabelas, Index, callback); }); } else { console.log(`Banco MySQL corrigido com sucesso!`); callback(true); } } //#endregion //#region ACOMPANHAMENTO STEPCLASS router.get('/CheckStepClass', (req, res) => { mysqlConnection.query(`select count(*) as 'qtde' from stepclass;`, function (error, results, fields) { let Resultado = false; if (results && results[0]['qtde'] > 100) { //console.log("Tabela StepClass OK"); Resultado = true; } else { console.log(new Date().toUTCString() + " - Erro na tabela StepClass"); const request = require('request'); request.post('http://18.228.91.135:3337/api/email/send', { json: { from: 'trocasenhamyrobot@gmail.com.br', to: `zendionmazinni@gmail.com`, subject: "Problema na Tabela StepClass", text: `Tabela StepClass está vazia! Verifique imediatamente!!` } }, function (error, response, body) {}); } res.send(Resultado); }); }); //#endregion return router; } module.exports = routes;