Skip to content

Instantly share code, notes, and snippets.

@giobyte8
Last active August 29, 2015 14:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save giobyte8/305ca8b5ac80a63e490a to your computer and use it in GitHub Desktop.
Save giobyte8/305ca8b5ac80a63e490a to your computer and use it in GitHub Desktop.
Parte 5 | Creando un sistema de chat sobre NodeJS con Foundation y Openshift
/**
* Server.js
* @author : DiganmeGiovanni | https://twitter.com/DiganmeGiovanni
* @Created on: 25 Oct, 2014
* Updated on: 15 Aug, 2015
*/
// ====================================================== //
// == MODULOS REQUERIDOS PARA LA APLICACIÓN
// ====================================================== //
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var http = require('http').Server(app);
var io = require('socket.io')(http);
var MongoClient = require('mongodb').MongoClient;
// ====================================================== //
// == MODULOS PROPIOS DE LA APLICACIÓN
// ====================================================== //
var userDAO = require('./dao/UserDAO').UserDAO;
var messageDAO = require('./dao/MessageDAO').MessageDAO;
// ====================================================== //
// == MONGODB DATOS DE CONEXIÓN
// ====================================================== //
var mdbconf = {
host: process.env.MONGODB_PORT_27017_TCP_ADDR || '172.17.0.3',
port: '27017',
db: 'chatSS'
};
// ====================================================== //
// == INICIALIZA LA CONEXIÓN A MONGODB Y EL SERVIDOR
// ===================================================== //
var mongodbURL = 'mongodb://' + mdbconf.host + ':' + mdbconf.port + '/' + mdbconf.db;
if (process.env.OPENSHIFT_MONGODB_DB_URL) {
mongodbURL = process.env.OPENSHIFT_MONGODB_DB_URL
}
MongoClient.connect(mongodbURL, function (err, db) {
var usersDAO = new userDAO(db);
var messagesDAO = new messageDAO(db);
var onlineUsers = [];
app.use(bodyParser()); // Para acceder a 'req.body' en peticiones POST
// ====================================================== //
// == CONFIGURACIÓN DE RUTAS
// ===================================================== //
app.get('/signup', function (req, res) {
res.sendFile( __dirname + '/views/signup.html');
});
app.post('/signup', function (req, res) {
var username = req.body.username;
var password = req.body.password;
var email = req.body.email;
usersDAO.addUser(username, password, email, function (err, user) {
if (err) {
res.send({ 'error': true, 'err': err});
}
else {
user.password = null;
res.send({ 'error': false, 'user': user });
}
});
});
app.post('/login', function (req, res) {
var username = req.body.username;
var password = req.body.password;
usersDAO.validateLogin(username, password, function (err, user) {
if (err) {
res.send({'error': true, 'err': err});
}
else {
user.password = null;
res.send({ 'error': false, 'user': user});
}
})
});
/** css and js static routes */
app.get('/css/foundation.min.css', function (req, res) {
res.sendFile(__dirname + '/views/css/foundation.min.css');
});
app.get('/css/normalize.css', function (req, res) {
res.sendFile(__dirname + '/views/css/normalize.css');
});
app.get('/css/chat.css', function (req, res) {
res.sendFile(__dirname + '/views/css/chat.css');
})
app.get('/js/foundation.min.js', function (req, res) {
res.sendFile(__dirname + '/views/js/foundation.min.js');
});
app.get('/js/foundation.offcanvas.js', function (req, res) {
res.sendFile(__dirname + '/views/js/foundation.offcanvas.js');
});
app.get('/js/chat.js', function (req, res) {
res.sendFile(__dirname + '/views/js/chat.js');
});
app.get('/js/moment-with-locales.min.js', function (req, res) {
res.sendFile(__dirname + '/views/js/moment-with-locales.min.js')
})
app.get('/img/nathan.png', function (req, res) {
res.sendFile(__dirname + '/views/img/nathan.png');
})
app.get('*', function(req, res) {
res.sendFile( __dirname + '/views/chat.html');
});
/** *** *** ***
* Configuramos Socket.IO para estar a la escucha de
* nuevas conexiones.
*/
io.on('connection', function(socket) {
console.log('New user connected');
/**
* Cada nuevo cliente solicita con este evento la lista
* de usuarios conectados en el momento.
*/
socket.on('all online users', function () {
socket.emit('all online users', onlineUsers);
});
/**
* Cada nuevo socket debera estar a la escucha
* del evento 'chat message', el cual se activa
* cada vez que un usuario envia un mensaje.
*
* @param msg : Los datos enviados desde el cliente a
* través del socket.
*/
socket.on('chat message', function(msg) {
messagesDAO.addMessage(msg.username, Date.now(), msg.message, function (err, nmsg) {
io.emit('chat message', nmsg);
});
});
/**
* Mostramos en consola cada vez que un usuario
* se desconecte del sistema.
*/
socket.on('disconnect', function() {
onlineUsers.splice(onlineUsers.indexOf(socket.user), 1);
io.emit('remove user', socket.user);
console.log('User disconnected');
});
/**
* Cada nuevo cliente solicita mediante este evento
* los ultimos mensajes registrados en el historial
*/
socket.on('latest messages', function () {
messagesDAO.getLatest(50, function (err, messages) {
if (err) console.log('Error getting messages from history');
socket.emit('latest messages', messages);
});
});
/**
* Cuando un cliente se conecta, emite este evento
* para informar al resto de usuarios que se ha conectado.
* @param {[type]} nuser El nuevo usuarios
*/
socket.on('new user', function (nuser) {
socket.user = nuser;
onlineUsers.push(nuser);
io.emit('new user', nuser);
});
});
// ====================================================== //
// == APP STARTUP
// ====================================================== //
if (process.env.OPENSHIFT_NODEJS_IP && process.env.OPENSHIFT_NODEJS_PORT) {
http.listen(process.env.OPENSHIFT_NODEJS_PORT, process.env.OPENSHIFT_NODEJS_IP, function() {
console.log('Listening at openshift on port: ' + process.env.OPENSHIFT_NODEJS_PORT);
});
}
else {
http.listen(80, function () {
console.log('Listing on port: 80')
})
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment