Ver Fonte

Added new request handling structure. This is incomplete and hasn't been tested yet.

Cameron Kline há 8 anos atrás
pai
commit
374b56cfac
5 ficheiros alterados com 225 adições e 146 exclusões
  1. 8 4
      app.js
  2. 137 0
      logic/coreHandler.js
  3. 34 0
      logic/expressHandler.js
  4. 46 0
      logic/socketHandler.js
  5. 0 142
      logic/socketManager.js

+ 8 - 4
app.js

@@ -14,7 +14,9 @@ const express    = require('express'),
       r          = require('rethinkdb');
 
 // custom modules
-const socketManager = require('./logic/socketManager');
+const coreHandler = require('./logic/coreHandler'),
+      socketHandler = require('./logic/socketHandler'),
+      expressHandler = require('./logic/expressHandler');
 
 // setup express and socket.io
 const app = express();
@@ -27,6 +29,7 @@ r.connect( { host: 'localhost', port: 28015, db: 'musare' }, (err, conn) => {
 		console.log(err);
 	}
 	else {
+
 		app.use(session({
 			resave: true,
 			saveUninitialized: false,
@@ -36,8 +39,9 @@ r.connect( { host: 'localhost', port: 28015, db: 'musare' }, (err, conn) => {
 
 		app.use(express.static(__dirname + '/public'));
 
-		io.on('connection', (socket) => {
-			socketManager.handle(socket, io, conn);
-		});
+		coreHandler.setup(conn);
+
+		socketHandler(coreHandler, io);
+		expressHandler(coreHandler, app);
 	}
 });

+ 137 - 0
logic/coreHandler.js

@@ -0,0 +1,137 @@
+'use strict';
+
+// nodejs modules
+const path = require('path'),
+      fs   = require('fs'),
+      os   = require('os');
+
+// npm modules
+const config    = require('config'),
+      request   = require('request'),
+      waterfall = require('async/waterfall').
+      r         = require('rethinkdb');
+
+// custom modules
+const utils = require('./utils');
+
+var dbConnection = null;
+
+module.exports = {
+
+	setup: function (dbConn) {
+		dbConnection = dbConn;
+	},
+
+	disconnect: function () {
+
+	},
+
+	login: function (user, cb) {
+
+		if (!user.username || !user.password) {
+			return cb({ status: 'error', message: 'Invalid login request' });
+		}
+
+		r.table('users').filter({
+			username: user.username,
+			password: crypto.createHash('md5').update(user.password).digest("hex")
+		}).run(rc, (err, cursor) => {
+			if (err) {
+				return cb({ status: 'failure', message: 'Error while fetching the user' });
+			}
+			else {
+				cursor.toArray((err, result) => {
+					if (err) {
+						return cb({ status: 'failure', message: 'Error while fetching the user' });
+					}
+					else {
+						return cb({ status: 'success', user: result });
+					}
+				});
+			}
+		});
+	},
+
+	register: function (user, cb) {
+
+		if (!user.email || !user.username || !user.password) {
+			return cb({ status: 'error', message: 'Invalid register request' });
+		}
+
+		// TODO: Implement register
+	},
+
+	rooms: function (cb) {
+		r.table('rooms').run(rc, (err, cursor) => {
+			if (err) {
+				return cb({ status: 'failure', message: 'Error while fetching the rooms' });
+			}
+			else {
+				cursor.toArray((err, result) => {
+					if (err) {
+						return cb({ status: 'failure', message: 'Error while fetching the rooms' });
+					}
+					else {
+						return cb(result);
+					}
+				});
+			}
+		});
+	},
+
+	room: function (id, cb) {
+
+		if (socket.custom.user == null) {
+			return cb({ status: 'error', message: "You can't join a room until you've logged in" });
+		}
+
+		r.table('rooms').get(id).run(rc, (err, result) => {
+			if (err) {
+				return cb({ status: 'error', message: 'Room with that id does not exist' });
+			}
+			else {
+				socket.custom.roomId = id;
+
+				var userInfo = {
+					username: socket.custom.user.username
+				};
+
+				var otherUsersInfo = [];
+
+				// tell all the users in this room that someone is joining it
+				io.sockets.clients().forEach((otherSocket) => {
+					if (otherSocket != socket && otherSocket.custom.roomId == id) {
+						otherUsersInfo.push({ username: otherSocket.custom.user.username });
+						otherSocket.emit('room', { status: 'joining', user: userInfo });
+					}
+				});
+
+				return cb({
+					status: 'joined',
+					data: {
+						room: result,
+						users: otherUsersInfo
+					}
+				});
+			}
+		});
+	},
+
+	search: function (query, cb) {
+		request('https://www.googleapis.com/youtube/v3/search?' + [
+				'part=snippet', `q=${encodeURIComponent(query)}`, `key=${config.get('apis.youtube.key')}`, 'type=video', 'maxResults=25'
+			].join('&'), (err, res, body) => {
+			if (err) {
+				socket.emit('search', { status: 'error', message: 'Failed to make request' });
+			}
+			else {
+				try {
+					socket.emit('search', { status: 'success', body: JSON.parse(body) });
+				}
+				catch (e) {
+					socket.emit('search', { status: 'error', message: 'Non JSON response' });
+				}
+			}
+		});
+	}
+};

+ 34 - 0
logic/expressHandler.js

@@ -0,0 +1,34 @@
+'use strict';
+
+module.exports = function (base, io) {
+
+	app.post('/login', function (user) {
+		base.login(user, function (result) {
+			res.send(JSON.stringify(result));
+		});
+	});
+
+	app.post('/register', function (user) {
+		base.register(user, function (result) {
+			res.send(JSON.stringify(result));
+		});
+	});
+
+	app.get('/rooms', function () {
+		base.rooms(function (result) {
+			res.send(JSON.stringify(result));
+		});
+	});
+
+	app.get('/room/:id', function (id) {
+		base.room(id, function (result) {
+			res.send(JSON.stringify(result));
+		});
+	});
+
+	app.get('/search/:query', function () {
+		base.search(query, function (result) {
+			res.send(JSON.stringify(result));
+		});
+	});
+};

+ 46 - 0
logic/socketHandler.js

@@ -0,0 +1,46 @@
+'use strict';
+
+module.exports = function (base, io) {
+
+	io.on('connection', function (socket) {
+
+		socket.on('disconnect', function () {
+			base.disconnect(function () {
+				console.log('User has disconnected');
+			});
+		});
+
+		socket.on('login', function (user) {
+			base.login(user, function (result) {
+				socket.emit('login', result);
+			});
+		});
+
+		socket.on('register', function (user) {
+			base.register(user, function (result) {
+				socket.emit('register', result);
+			});
+		});
+
+		socket.on('rooms', function () {
+			base.rooms(function (result) {
+				socket.emit('rooms', result);
+			});
+		});
+
+		socket.on('room', function (id) {
+			base.room(id, function (result) {
+				socket.emit('room', result);
+			});
+		});
+
+		socket.on('search', function (query) {
+			base.search(query, function (result) {
+				socket.emit('search', result);
+			});
+		});
+
+		socket.emit('ready');
+
+	});
+};

+ 0 - 142
logic/socketManager.js

@@ -1,142 +0,0 @@
-'use strict';
-
-// nodejs modules
-const path = require('path'),
-      fs   = require('fs'),
-      os   = require('os');
-
-// npm modules
-const config    = require('config'),
-      request   = require('request'),
-      waterfall = require('async/waterfall').
-      r         = require('rethinkdb');
-
-// custom modules
-const utils = require('./utils');
-
-module.exports = {
-
-	setup: (io, rc) => {
-
-		r.table('comments')
-
-	},
-
-	handle: (socket, io, rc) => {
-
-		socket.custom = {};
-
-		socket.on('disconnect', () => {
-
-		});
-
-		socket.on('login', (user) => {
-
-			if (!user.username || !user.password) {
-				socket.emit('login', { status: 'error', message: 'Invalid login request' });
-				return;
-			}
-
-			r.table('users').filter({
-				username: user.username, password: crypto.createHash('md5').update(user.password).digest("hex")
-			}).run(rc, (err, cursor) => {
-				if (err) {
-					socket.emit('login', { status: 'failure', message: 'Error while fetching the user' });
-				}
-				else {
-					cursor.toArray((err, result) => {
-						if (err) {
-							socket.emit('login', { status: 'failure', message: 'Error while fetching the user' });
-						}
-						else {
-							socket.emit('login', { status: 'success', user: result });
-						}
-					});
-				}
-			});
-		});
-
-		socket.on('register', (user) => {
-
-			console.log(user);
-
-			if (!user.email || !user.username || !user.password) {
-				socket.emit('register', { status: 'error', message: 'Invalid register request' });
-				return;
-			}
-		});
-
-		socket.on('rooms', () => {
-			r.table('rooms').run(rc, (err, cursor) => {
-				if (err) {
-					socket.emit('rooms', { status: 'failure', message: 'Error while fetching the rooms' });
-				}
-				else {
-					cursor.toArray((err, result) => {
-						if (err) {
-							socket.emit('rooms', { status: 'failure', message: 'Error while fetching the rooms' });
-						}
-						else {
-							socket.emit('rooms', result);
-						}
-					});
-				}
-			});
-		});
-
-		socket.on('room', (id) => {
-
-			if (socket.custom.user == null) {
-				socket.emit('room', { status: 'error', message: "You can't join a room until you've logged in" });
-				return;
-			}
-
-			r.table('rooms').get(id).run(rc, (err, result) => {
-				if (err) {
-					socket.emit('room', { status: 'error', message: 'Room with that id does not exist' });
-				}
-				else {
-					socket.custom.roomId = id;
-
-					var userInfo = {
-						username: socket.custom.user.username
-					};
-
-					var otherUsersInfo = [];
-
-					// tell all the users in this room that someone is joining it
-					io.sockets.clients().forEach((otherSocket) => {
-						if (otherSocket != socket && otherSocket.custom.roomId == id) {
-							otherUsersInfo.push({ username: otherSocket.custom.user.username });
-							otherSocket.emit('room', { status: 'joining', user: userInfo });
-						}
-					});
-
-					socket.emit('room', { status: 'joined', data: {
-						room: result, users: otherUsersInfo
-					}});
-				}
-			});
-		});
-
-		socket.on('search', (query) => {
-			request('https://www.googleapis.com/youtube/v3/search?' + [
-				'part=snippet', `q=${encodeURIComponent(query)}`, `key=${config.get('apis.youtube.key')}`, 'type=video', 'maxResults=25'
-			].join('&'), (err, res, body) => {
-				if (err) {
-					socket.emit('search', { status: 'error', message: 'Failed to make request' });
-				}
-				else {
-					try {
-						socket.emit('search', { status: 'success', body: JSON.parse(body) });
-					}
-					catch (e) {
-						socket.emit('search', { status: 'error', message: 'Non JSON response' });
-					}
-				}
-			});
-		});
-
-		socket.emit('ready');
-	}
-};