Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save carlosdelfino/eb43d6f27ac9b31cb37b7fec047d13af to your computer and use it in GitHub Desktop.
Save carlosdelfino/eb43d6f27ac9b31cb37b7fec047d13af to your computer and use it in GitHub Desktop.
import express from "express";
import session from "express-session";
import { Request, Response, NextFunction } from "express";
import { AppController } from "./appController";
import { AppConfig, AppRequest } from "./types";
// @ts-ignore
import createLogger from "../../library/logger";
import path from "path";
import bodyParser from 'body-parser';
import AuthRouters from "./routes/auth";
import { createServer } from "http";
import { Server } from "socket.io";
const config: AppConfig = {
port: 3000,
maxSessions: 50,
assets: {
images: {
connecting: "/assets/images/waiting.png", // Imagem exibida durante a espera do processo de conexão da api
connected: "/assets/images/connected.png", // Imagem exibida quando a conexão da api é bem-sucedida
disconnected: "/assets/images/disconnected.png", // Imagem exibida quando o usuário está deslogado e api desconectada
waiting: "/assets/images/waiting.png", // Imagem exibida enquanto aguarda algum processo
networkError: "/assets/images/networkerror.png", // Imagem exibida quando ouver erro na rede
loggedIn: "/assets/images/loggedin.png", // Imagem exibida quando o usuário estiver logado
},
path: path.join(__dirname, "views/assets"), // Configuração do caminho dos estáticos
},
logFolderPath: path.join(path.sep, 'var', 'log', 'rapport-api'),
debug: true,
authState: {
//type: 'mysql',
type: "file",
session: "session",
folderName: path.join(__dirname, '..', '..', 'data', 'bayleis_auth_info'),
dataService: {
host: "localhost",
user: "rapport_site_bot_v0_3",
password: "3244234cvsfde",
database: "rapport_site_v0_3",
},
},
mailer: {
host: 'mail.ibova.com.br',
port: 25,
secure: false, // true para 465, false para outras portas
auth: {
user: '[email protected]', // Usuário do servidor SMTP
pass: '(4564562dgdc)' // Senha do servidor SMTP
},
tls: {
rejectUnauthorized: false // Isso garante que mesmo certificados não confiáveis ainda funcionarão
}
},
};
const logger = createLogger(config);
logger.info("Aplicação Iniciando!");
const app = express();
// Configuração para parsear JSON
app.use(express.json());
app.use(bodyParser.json());
// Configuração da engine de template para usar arquivos .html
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');
app.set('views', path.join(__dirname, 'views', 'templates'));
const sessionMiddleware = session({
secret: 'your-secret-key', // Troque por uma chave segura
resave: false,
saveUninitialized: false,
cookie: {
secure: false, // true se estiver usando HTTPS
maxAge: 1000 * 60 * 60 * 24, // Tempo de expiração da sessão (1 dia)
httpOnly: true
}
});
// Usar o middleware de sessão para todas as rotas, exceto para o WebSocket
app.use(sessionMiddleware);
//código original da tela de aparelhos @@@
// Configura o diretório de arquivos estáticos
app.use("/assets", express.static(config.assets.path as string));
// Rota para servir o modal.html
app.get("/modal-status", (req, res) => {
const modalId = req.query.modalId;
const message = req.query.message;
const sessionId = req.query.sessionID;
res.render("modal", {
modalId: modalId,
message: message,
sessionName: sessionId,
});
});
// Rota para renderizar o index.html
const authRoutes = (new AuthRouters(config)).getRouter();
app.use('/', authRoutes);
// Rota principal
// Rota para renderizar o index.html
app.get('/', (req, res) => {
res.render('index', {
// Passar variáveis para o template se necessário
});
});
const server = createServer(app);
const wss = new Server(server, {
transports: ['websocket'],
path: '/ws/admin',
cors: {
origin: "*",
methods: ["GET", "POST"]
}
});
// Função para converter middleware Express para Socket.IO
const wrap = (middleware: any) => (socket: any, next: (err?: Error) => void) =>
middleware(socket.request, {}, next);
// Integração do middleware de sessão com o Socket.IO
wss.use(wrap(sessionMiddleware));
// WebSocket connection handler
wss.on('connection', () => {
console.log('New WebSocket connection');
// Periodically send updates to the connected client
const sendUpdates = async () => {
// const connections = await appController.getConnections();
// const stats = await connectionManager.getConnectionStatistics();
const data = {
// type: 'connectionInfo',
user: {
name: 'Nome do Usuário', // Simulação: deve ser recuperado dinamicamente
nickname: 'Apelido' // Simulação: deve ser recuperado dinamicamente
},
connections: {
// active: connections.filter(conn => conn.status === 'active').length,
// waiting: connections.filter(conn => conn.status === 'waiting').length
},
// stats: stats
};
wss.send(JSON.stringify(data));
};
let wssInterval = setInterval(sendUpdates, 5000); // Envia atualizações a cada 5 segundos
wss.on('message', (message: any) => {
console.log('Received:', message);
// Handle incoming messages if necessary
});
wss.on('close', () => {
clearInterval(wssInterval); // Limpa o intervalo quando a conexão for fechada
console.log('WebSocket connection closed');
});
});
server.listen(config.port, () => {
logger.info(`Servidor rodando em http://localhost:${config.port}`);
});
logger.info("Aplicação Iniciada!");
$(document).ready(function() {
// Função para limpar os formulários
function clearForms() {
$('#form-register')[0].reset();
$('#form-login')[0].reset();
$('#nickname-check').hide(); // Esconde a mensagem de verificação de apelido
$('#register-button-form').prop('disabled', false); // Reativa o botão de envio do cadastro
}
// Mostra o formulário de cadastro
$('#register-button').click(function () {
clearForms(); // Limpa o formulário antes de exibir
$('#main-menu').hide();
$('#register-form').show();
});
// Mostra o formulário de login
$('#login-button').click(function () {
clearForms(); // Limpa o formulário antes de exibir
$('#main-menu').hide();
$('#login-form').show();
});
// Voltar à página principal
$('#back-button, #back-button-login').click(function () {
$('#register-form, #login-form').hide();
$('#main-menu').show();
clearForms(); // Limpa os formulários ao voltar para a tela principal
});
// Função para mostrar o overlay de carregamento e desativar botões
function startLoading() {
$('#loading-overlay').show();
$('button').prop('disabled', true);
}
// Função para ocultar o overlay de carregamento e reativar botões
function stopLoading() {
$('#loading-overlay').hide();
$('button').prop('disabled', false);
}
// Formatação do telefone
$('#whatsapp').on('input', function() {
let value = $(this).val().replace(/\D/g, '');
if (value.length > 2) {
value = '+' + value.slice(0, 2) + ' (' + value.slice(2, 4) + ') ' + value.slice(4, 9) + '-' + value.slice(9, 13);
}
$(this).val(value);
});
// Verificação do apelido em tempo real
$('#nickname').on('blur', function() {
const nickname = $(this).val();
if (nickname.length > 0) {
startLoading();
$.ajax({
url: '/check-nickname',
method: 'GET',
dataType: 'json',
data: { nickname: nickname },
success: function(response) {
stopLoading();
if (response.exists) {
$('#nickname-check').show();
$('#register-button-form').prop('disabled', true); // Desativa o botão de envio do cadastro
} else {
$('#nickname-check').hide();
$('#register-button-form').prop('disabled', false); // Reativa o botão de envio do cadastro
}
},
error: function() {
stopLoading();
}
});
}
});
// Submissão do formulário de cadastro via AJAX
$('#form-register').on('submit', function (e) {
e.preventDefault();
startLoading();
const data = {
name: $('#name').val(),
nickname: $('#nickname').val(),
whatsapp: $('#whatsapp').val().replace(/[()\-\s]/g, ''),
address: $('#address').val(),
district: $('#district').val(),
cep: $('#cep').val(),
email: $('#email').val(),
city: $('#city').val(),
country: $('#country').val()
};
$.ajax({
url: '/register',
method: 'POST',
contentType: 'application/json',
dataType: 'json',
data: JSON.stringify(data),
success: function(response) {
stopLoading();
alert(response.message);
clearForms(); // Limpa o formulário após o envio bem-sucedido
},
error: function(response) {
stopLoading();
alert(response.responseJSON.message);
}
});
});
// Submissão do formulário de login via AJAX
$('#form-login').on('submit', function (e) {
e.preventDefault();
startLoading();
const data = {
nickname: $('#login-nickname').val(),
password: $('#login-password').val()
};
$.ajax({
url: '/login',
method: 'POST',
contentType: 'application/json',
dataType: 'json',
data: JSON.stringify(data),
success: function(response) {
stopLoading();
if (response.redirectTo) {
window.location.href = response.redirectTo;
} else {
alert(response.message);
}
clearForms(); // Limpa o formulário após o login bem-sucedido
},
error: function(response) {
stopLoading();
alert(response.responseJSON.message);
}
});
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment