Site/server/controllers/gcaController.js

406 lines
15 KiB
JavaScript

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 <gcacontrol@gmail.com>",
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;