require('../connector'); const express = require('express'); const router = express.Router(); const nodemailer = require('nodemailer'); const formidable = require('formidable'); const shell = require('shelljs'); var admin = require("firebase-admin"); var serviceAccount = require("./../gca-control-bcb9b-firebase-adminsdk-pf0od-2e672cfd0a.json"); var routes = function () { //#region EMAIL const Email = 'gcacontrol@gmail.com'; const Senha = 'gcaCtrl123'; var transporter = nodemailer.createTransport({ service: 'gmail', //host: "email-ssl.com.br", //port: 465, //secure: true, auth: { user: Email, pass: Senha, //user: 'iyrconline@myrobot.com.br', //pass: 'iyrcMyrobot@2255', //user: 'myrobotschool@gmail.com', //pass: 'myrobot2020**==', } }); function EnviarEmail(Dados, idemail) { ConexaoMySQL_GCA.query(`SELECT em.* FROM emails em where em.idemails = ${idemail};`, function (error, results, fields) { if (!error && results.length > 0) { let Mensagem = results[0]['texto']; for (let i = 0; i < 10; i++) { if (Dados['descricao']) Mensagem = Mensagem.replace('>DISPOSITIVO<', Dados['descricao']); if (Dados['nome']) Mensagem = Mensagem.replace('>CLIENTE<', Dados['nome']); if (Dados['Segredo']) Mensagem = Mensagem.replace('>SEGREDO<', Dados['Segredo']); } var mailOptions = { from: "GCA Control ", to: Dados['email'], subject: results[0]['assunto'], html: Mensagem }; transporter.sendMail(mailOptions, function (error, info) { if (error) { console.log(error); } else { console.log('Email enviado para: ' + mailOptions.to + ' - ' + info.response); ConexaoMySQL_GCA.query(`insert into emailsenviados (iddispositivos, idemails) values (${Dados['iddispositivos']}, ${idemail});`, function (error2, results2, fields2) { }); } /* // envia sms const Hash = "0cc6fcb95a28d506def8259e1e8dd90e"; const https = require('https'); https.get(`https://smsmobile.com.br/sms/shortcode/routes/sms.php?hash=${Hash}&mensagem=${encodeURI(Mensagem)}&numero=${Telefone}`, (resp) => { let data = ''; resp.on('data', (chunk) => { data += chunk; }); resp.on('end', () => { console.log("SMS enviado com sucesso para " + Dispositivo['telefone']); }); }).on("error", (err) => { console.log("Erro ao enviar SMS: " + err.message); }); */ }); } }); } router.get('/sendEmail/:iddispositivos/:idemail', (req, res) => { const iddispositivos = parseInt(req.params.iddispositivos); const idemail = parseInt(req.params.idemail); ConexaoMySQL_GCA.query(`SELECT di.iddispositivos, di.descricao, di.alarme, cl.email, cl.telefone, cl.token FROM dispositivos di inner join clientes cl on cl.idclientes = di.idclientes WHERE di.iddispositivos = ${iddispositivos};`, function (error2, results2, fields2) { EnviarEmail(results2[0], idemail); console.log(req.originalUrl + "/ success 200"); res.send(true); }); }); //#endregion //#region DISPOSITIVOS router.get('/getDispositivos', (req, res) => { ConexaoMySQL_GCA.query(`select di.iddispositivos, di.qrcode, di.idkits, ki.descricao as 'Kit', di.insert_date from dispositivos di left join clientes cl on cl.idclientes = di.idclientes inner join kits ki on ki.idkits = di.idkits where cl.idclientes is null;`, function (error, results, fields) { if (error) throw error; if (results) { console.log(req.originalUrl + "/ success 200"); res.send(results); } else { console.log(req.originalUrl + "/ success 500"); res.send([]); } }); }); router.get('/getDispositivosCliente/:segredo', (req, res) => { const segredo = req.params.segredo; ConexaoMySQL_GCA.query(`select di.iddispositivos, di.qrcode, di.descricao, di.idclientes, cl.nome as 'Cliente', di.idkits, ki.descricao as 'Kit', di.alarme, di.statusalarme, di.portao, di.lampada, di.statuslampada, di.update_date from dispositivos di inner join clientes cl on cl.idclientes = di.idclientes inner join kits ki on ki.idkits = di.idkits where cl.segredo = '${segredo}';`, function (error, results, fields) { if (error) throw error; if (results) { console.log(req.originalUrl + "/ success 200"); res.send(results); } else { console.log(req.originalUrl + "/ success 500"); res.send([]); } }); }); router.get('/getStatus/:segredo/:iddispositivos', (req, res) => { const segredo = req.params.segredo; const iddispositivos = parseInt(req.params.iddispositivos); ConexaoMySQL_GCA.query(`select di.alarme, di.statusalarme, di.portao, di.lampada, di.statuslampada FROM dispositivos di inner join clientes cl on cl.idclientes = di.idclientes where cl.segredo = '${segredo}' and di.iddispositivos = ${iddispositivos};`, function (error, results, fields) { if (error) throw error; if (results[0]) { console.log(req.originalUrl + "/ success 200"); res.send(results[0]); } else { console.log(req.originalUrl + "/ success 500"); res.send(false); } }); }); router.get('/setStatus/:segredo/:iddispositivos/:Atuador/:Estado', (req, res) => { const segredo = req.params.segredo; const iddispositivos = parseInt(req.params.iddispositivos); const Atuador = parseInt(req.params.Atuador); const Estado = parseInt(req.params.Estado); ConexaoMySQL_GCA.query(`UPDATE dispositivos D inner join clientes C on C.idclientes = D.idclientes SET ${ (Atuador == 0) ? 'alarme' : (Atuador == 1) ? 'statusalarme' : (Atuador == 2) ? 'portao' : (Atuador == 3) ? 'lampada' : (Atuador == 4) ? 'statuslampada' : ''} = ${Estado} WHERE D.iddispositivos = ${iddispositivos} and C.segredo = '${segredo}';`, function (error, results, fields) { if (error) throw error; console.log(req.originalUrl + "/ success 200"); let Resposta = shell.exec(`sudo mosquitto_pub -h gcacontrol.mooo.com -p 1883 -t "${segredo}" -m "${Atuador}:${Estado}" -u "tht" -P "123"`); if (Atuador == 1 && Estado == 1) { ConexaoMySQL_GCA.query(`select di.iddispositivos, di.descricao, di.alarme, cl.email, cl.telefone, cl.token from dispositivos di inner join clientes cl on cl.idclientes = di.idclientes where di.iddispositivos = ${iddispositivos};`, function (error2, results2, fields2) { if (results2[0]['alarme'] == 1) { EnviarEmail(results2[0], 1); const DadosMensagem = { title: "Alarme Acionado!", message: "Seu alarme no dispositivo " + results2[0]['descricao'] + " foi acionado!" }; EnviarNotificacao(DadosMensagem, results2[0]['token']); } res.send(true); }); } else { res.send(true); } }); }); router.post('/vincularDispositivo', (req, res) => { const descricao = req.body.descricao; const segredo = req.body.segredo; const iddispositivos = parseInt(req.body.iddispositivos); ConexaoMySQL_GCA.query(`UPDATE dispositivos set descricao = '${descricao}', idclientes = (select idclientes from clientes where segredo = '${segredo}') where iddispositivos = ${iddispositivos};`, function (error, results, fields) { if (!error) { console.log(req.originalUrl + "/ success 200"); res.send(true); } else { console.log(error); console.log(req.originalUrl + "/ error 500"); res.send(false); } }); }); //#endregion //#region CLIENTES router.post('/insertCliente', (req, res) => { const nome = req.body.nome; const cidade = req.body.cidade; const telefone = req.body.telefone; const email = req.body.email; const cpf = req.body.cpf; ConexaoMySQL_GCA.query(`select * from clientes where cpf = '${cpf}' or email = '${email}';`, function (errorS, resultsS, fieldsS) { if (resultsS.length == 0) { GeraSegredo(function(segredo) { ConexaoMySQL_GCA.query(`insert into clientes (nome, cidade, telefone, email, segredo, cpf) values ('${nome}', '${cidade}', '${telefone}', '${email}', '${segredo}', '${cpf}');`, function (error, results, fields) { if (error) throw error; if (!error) { console.log(req.originalUrl + "/ success 200"); let Cliente = { nome: nome, email: email, telefone: telefone, Segredo: segredo } EnviarEmail(Cliente, 2); res.redirect(`http://${req.headers.host.split(':')[0]}/cadastro.html?segredo=${segredo}`); } else { console.log(req.originalUrl + "/ error 500"); res.redirect(`http://${req.headers.host.split(':')[0]}/cadastro.html?erro=0`); } }); }); } else { res.redirect(`http://${req.headers.host.split(':')[0]}/cadastro.html?erro=1`); } }); }); function GeraSegredo(callback) { const caracteresPermitidos = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789!@$?_-"; let secret = ""; ConexaoMySQL_GCA.query(`select segredo from clientes;`, function (error, results, fields) { for (let i = 0; i < 15; i++) { secret += caracteresPermitidos[Math.floor(Math.random() * (caracteresPermitidos.length))]; } let Aprovado = true; for (let i = 0; i < results.length; i++) { if (results[i]['segredo'] == secret) Aprovado = false; } if (Aprovado) callback(secret); else GeraSegredo(callback); }); } router.get('/setClienteToken/:segredo/:token', (req, res) => { const segredo = req.params.segredo; const token = req.params.token; ConexaoMySQL_GCA.query(`UPDATE clientes SET token = '${token}' where segredo = '${segredo}';`, function (error, results, fields) { if (error) throw error; if (results) { console.log(req.originalUrl + "/ success 200"); res.send(true); } else { console.log(req.originalUrl + "/ success 500"); res.send(false); } }); }); router.post('/salvarConfigCliente', (req, res) => { const Segredo = req.body.Segredo; const NomeRede = req.body.NomeRede; const SenhaRede = req.body.SenhaRede; const Dispositivo = parseInt(req.body.Dispositivo); ConexaoMySQL_GCA.query(`UPDATE clientes set nomeRede = '${NomeRede}', senhaRede = '${SenhaRede}', indexDispositivo = ${Dispositivo} where segredo = '${Segredo}';`, function (error, results, fields) { if (!error) { console.log(req.originalUrl + "/ success 200"); res.send(true); } else { console.log(error); console.log(req.originalUrl + "/ error 500"); res.send(false); } }); }); //#endregion //#region CONFIGURACOES router.get('/getConfig', (req, res) => { ConexaoMySQL_GCA.query(`select * from configuracoes;`, function (error, results, fields) { if (error) throw error; if (results) { console.log(req.originalUrl + "/ success 200"); res.send(results[0]); } else { console.log(req.originalUrl + "/ success 500"); res.send([]); } }); }); //#endregion //#region PUSH NOTIFICATION FIREBASE admin.initializeApp({ credential: admin.credential.cert(serviceAccount), projectId: "gca-control-bcb9b" }); function EnviarNotificacao(DadosMensagem, registrationToken) { // This registration token comes from the client FCM SDKs. const message = { data: DadosMensagem, token: registrationToken }; // Send a message to the device corresponding to the provided // registration token. admin.messaging().send(message).then((response) => { // Response is a message ID string. console.log('Successfully sent message:', response); }).catch((error) => { console.log('Error sending message:', error); }); } router.post('/sendPushNotification', (req, res) => { const titulo = req.body.titulo; const mensagem = req.body.mensagem; const segredo = req.body.segredo; ConexaoMySQL_GCA.query(`SELECT token FROM clientes WHERE segredo = '${segredo}';`, function (error, results, fields) { if (!error) { const DadosMensagem = { title: titulo, message: mensagem }; EnviarNotificacao(DadosMensagem, results[0]['token']); console.log(req.originalUrl + "/ success 200"); res.send(true); } else { console.log(error); console.log(req.originalUrl + "/ error 500"); res.send(false); } }); }); //#endregion return router; } module.exports = routes;