ZoeApi/controllers/migrationController.js

1048 lines
44 KiB
JavaScript

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;