Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Superchat #32

Open
wants to merge 15 commits into
base: master
Choose a base branch
from
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
node_modules/
redis.js
.vscode/
102 changes: 102 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
const express = require('express');
const app = require('express')();
const path = require('path');

const bodyParser = require('body-parser');
const urlencodedParser = bodyParser.urlencoded({ extended: false });

// functions
const { getAllUsernames } = require('./lib/users');
const { generateUserInfo, generateMessageInfo } = require('./lib/generate');
const { getDisplayInfo, associateRoomsMessages, sortRooms } = require('./lib/data-display');
const { helper } = require('./lib/helpers');

const cookieParser = require('cookie-parser');
app.use(cookieParser());

// Serve public middleware
app.use("/public", express.static(path.join(__dirname, "/public")));

const exphbs = require('express-handlebars');

app.engine('handlebars', exphbs({defaultLayout: 'main'}));
app.set('view engine', 'handlebars');

const redis = require('redis');
const redisClient = redis.createClient();

// Static middleware to serve the socket.io client library to front-end
app.use('/socket.io', express.static(__dirname + 'node_modules/socket.io-client/dist/'));

const server = require('http').createServer(app);
const io = require('socket.io')(server);

io.on('connection', () => {
// emit when there's a new message
});

// Routes
app.get('/', (req, res) => {
let view;
let username = req.cookies.username;
// can also do if(!username) {redirect}
if(username) {
view = 'home';
} else {
view = 'login';
}
getDisplayInfo(username, (err, data) => {
if(err) {
console.error(err);
}
// array of message objects
let messages = data.messages;
// array of room names
let roomNames = data.rooms;
let rooms = sortRooms(messages);
// console.dir(messages);
let results = helper(rooms, messages);

res.render(view, { results: results });


});
});

app.get('/log-out', ((req, res) => {
res.clearCookie('username');
res.redirect('/');
}));


// need to fix username exists/view issue
app.post('/login', urlencodedParser, (req, res) => {
let view;
// if user entered a valid username
if(req.body.username) {
getAllUsernames().then((usernames) => {
// make sure username doesn't already exist
// could just ask redis - faster
if(usernames.includes(req.body.username)) {
// error that username exists
res.render('login', { error: 'This username has been taken, please try again.'});
} else {
res.cookie('username', req.body.username);
generateUserInfo(req.body.username);
res.redirect('/');
}
});
}

});

app.post('/new/user', urlencodedParser, (req, res) => {
// submit data
let roomName = req.body.roomname[0];
let message = req.body.roomname[1];
generateMessageInfo(message, req.cookies.username, roomName);
res.redirect('back');
});

// Listen
server.listen(3000);
95 changes: 95 additions & 0 deletions lib/data-display.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
const {
generateUserInfo
} = require('./generate');
const {
getAllRoomNames
} = require('./rooms');
const {
getAllMessages
} = require('./messages');

const getDisplayInfo = (username, callback) => {

let displayInfo = {};
displayInfo.rooms = [];
displayInfo.messages = [];

return Promise.all([getAllRoomNames(), getAllMessages()]).then((results) => {
displayInfo.rooms = results[0];
displayInfo.messages = results[1];
callback(null, displayInfo);
})
.catch((err) => {
reject(err);
});

};

// test works
// getDisplayInfo('robin7', (err, results) => {
// let displayInfo = results;
// console.dir(results);
// });

// let exampleRooms = ['dogs', 'cats', 'other'];
// let exampleMessages = [{
// message: 'i love dogs',
// username: 'dogluver',
// roomName: 'dogs'
// },
// {
// message: 'i love cats',
// username: 'catluver',
// roomName: 'cats'
// },
// {
// message: 'i love other',
// username: 'otherluver',
// roomName: 'other'
// }
// ];

// messages is an array of message objects
const sortRooms = (messages) => {
const uniqueArray = (arr) => [...new Set(arr)];
let roomsArray = [];
for(let i = 0; i < messages.length; i++) {
roomsArray.push(messages[i].roomName);
}
roomsArray = uniqueArray(roomsArray);
return roomsArray;
};

// sortRooms(exampleMessages);

// roomNames is an array of strings, messages is an array of message objects
const associateRoomsMessages = (roomNames, messages, callback) => {
const uniqueArray = (arr) => [...new Set(arr)];
let uniqueRooms = uniqueArray(roomNames);
// array of objects
let hbsArray = [];

for (i = 0; i <= (uniqueRooms.length - 1); i++) {
let hbsRoom = {};
hbsRoom.roomName = uniqueRooms[i];
hbsRoom.messages = [];

for (j = 0; j <= (messages.length - 1); j++) {
if ((messages[j].roomName) && (messages[j].roomName === uniqueRooms[i])) {
hbsRoom.messages.push(messages[j]);
}
}
hbsArray.push(hbsRoom);
// if final iteration call callback
if (i === (uniqueRooms.length - 1)) {
callback(null, hbsArray);
}
}

};

module.exports = {
getDisplayInfo,
associateRoomsMessages,
sortRooms
};
50 changes: 50 additions & 0 deletions lib/generate.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
const redisClient = require('redis').createClient();
const shortid = require('shortid');

// function library
const users = require('./users');
const messages = require('./messages');
const rooms = require('./rooms');

let generateUserInfo = (username) => {
const userID = shortid.generate().slice(0, 7);
return users.saveUserID(userID).then((userID) => {
users.saveUsername(userID, username);
});
};

//
// generateUserInfo('catluver');
// generateUserInfo('dogluver');
// generateUserInfo('horseluver');

let generateMessageInfo = (message, username, roomName) => {
const messageID = shortid.generate().slice(0, 7);
return messages.saveMessageID(messageID).then((messageID) => {
messages.saveMessage(messageID, message, username, roomName);
});
};

// generateMessageInfo('Cats are my favorite.', 'catluver','cats');
// generateMessageInfo('Dogs are my favorite.', 'dogluver', 'dogs');
// generateMessageInfo('Horses are my favorite', 'horseluver', 'horses');
// generateMessageInfo('Dogs are my second favorite.', 'horseluver', 'dogs');
// generateMessageInfo('Cats are my second favorite.', 'dogluver', 'cats');
// generateMessageInfo('Horses are my second favorite.', 'catluver', 'horses');

let generateRoomInfo = (roomName) => {
const roomID = shortid.generate().slice(0, 7);
return rooms.saveRoomID(roomID).then((roomID) => {
rooms.saveRoomName(roomID, roomName);
});
};

// generateRoomInfo('cats');
// generateRoomInfo('dogs');
// generateRoomInfo('horses');

module.exports = {
generateUserInfo,
generateMessageInfo,
generateRoomInfo
};
56 changes: 56 additions & 0 deletions lib/helpers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
const helper = (rooms, messages) => {

let allObjects = [];
for(let i = 0; i <= rooms.length; i++) {
let roomObject = {};
if(i === rooms.length) {
return allObjects;
}
roomObject.room = '';
roomObject.messages = [];
// console.log('allMessages.room: ' + allMessages.room[i]);
for(let j = 0; j < messages.length; j++) {
let messageArray = [];
let messageObject = {};
messageObject.message = '';
messageObject.user = '';
if(rooms[i] === messages[j].roomName) {
roomObject.room = messages[j].roomName;
messageObject.message = messages[j].message;
messageObject.user = messages[j].username;
// console.dir(messageObject);
roomObject.messages.push(messageObject);
}
// push message object to roomObject.messages
}
allObjects.push(roomObject);

}
};

/*
[{
room: 'cats',
messages: [{
message: 'Cats are my favorite.'
user: 'catluver'
}]
},
{

}]
*/

// let results = helper(['cats', 'dogs', 'horses'],
// [{ message: 'Horses are my favorite', username: 'horseluver', roomName: 'horses'},
// {message: 'Dogs are my favorite.', username: 'dogluver', roomName: 'dogs'},
// { message: 'Cats are my favorite.', username: 'catluver', roomName: 'cats'},
// { message: 'Dogs are my second favorite.', username: 'horseluver', roomName: 'dogs'},
// { message: 'Cats are my second favorite.', username: 'dogluver', roomName: 'cats'},
// { message: 'Horses are my second favorite.', username: 'catluver', roomName: 'horses'}]);

// console.log(results);

module.exports = {
helper
}
Loading