From 701a62825a2ec679d9c1b846ff86a72d5e6fd958 Mon Sep 17 00:00:00 2001 From: Sung Choi Date: Thu, 23 May 2013 23:12:14 +0900 Subject: [PATCH] Reorganiztion with a Routes => Controllers => Services => ModelManagers => DataObject structure (Interim commit) [airbug/airbug#89] Airbug. Airbug MVP Part I: Chat Basics --- .../js/src/AirBugConfiguration.js | 17 +++- .../Controllers/AlphaPagesController.js} | 30 +++--- .../js/src/Controllers/RoomsController.js | 94 +++++++++++++++++++ .../js/src/Controllers/UsersController.js | 72 ++++++++++++++ .../ChatMessageManager.js} | 8 +- .../ConversationManager.js} | 6 +- .../RoomApi.js => Managers/RoomManager.js} | 11 +-- .../UserApi.js => Managers/UserManager.js} | 31 +++--- .../airbugserver/js/src/Models/ChatMessage.js | 1 + .../js/src/Models/Conversation.js | 1 + .../airbugserver/js/src/Models/Dialogue.js | 1 + .../src/Routes/ExpressRoutes/ExpressRoutes.js | 14 +-- .../Services/RoomService.js} | 37 +++++--- .../Services/UserService.js} | 16 ++-- 14 files changed, 267 insertions(+), 72 deletions(-) rename projects/airbugserver/js/{Controllers/ApplicationController.js => src/Controllers/AlphaPagesController.js} (65%) create mode 100644 projects/airbugserver/js/src/Controllers/RoomsController.js create mode 100644 projects/airbugserver/js/src/Controllers/UsersController.js rename projects/airbugserver/js/src/{SocketAPIs/ChatMessageApi.js => Managers/ChatMessageManager.js} (85%) rename projects/airbugserver/js/src/{SocketAPIs/ConversationApi.js => Managers/ConversationManager.js} (89%) rename projects/airbugserver/js/src/{SocketAPIs/RoomApi.js => Managers/RoomManager.js} (92%) rename projects/airbugserver/js/src/{SocketAPIs/UserApi.js => Managers/UserManager.js} (78%) rename projects/airbugserver/js/{Controllers/RoomsController.js => src/Services/RoomService.js} (72%) rename projects/airbugserver/js/{Controllers/UsersController.js => src/Services/UserService.js} (82%) diff --git a/projects/airbugserver/js/src/AirBugConfiguration.js b/projects/airbugserver/js/src/AirBugConfiguration.js index 92627dd..552504b 100644 --- a/projects/airbugserver/js/src/AirBugConfiguration.js +++ b/projects/airbugserver/js/src/AirBugConfiguration.js @@ -45,16 +45,17 @@ var path = require('path'); // BugPack //------------------------------------------------------------------------------- -var BugFlow = bugpack.require('bugflow.BugFlow'); -var BugFs = bugpack.require('bugfs.BugFs'); var Class = bugpack.require('Class'); var Obj = bugpack.require('Obj'); var Annotate = bugpack.require('annotate.Annotate'); +var BugFlow = bugpack.require('bugflow.BugFlow'); +var BugFs = bugpack.require('bugfs.BugFs'); var ArgAnnotation = bugpack.require('bugioc.ArgAnnotation'); var ConfigurationAnnotation = bugpack.require('bugioc.ConfigurationAnnotation'); var IConfiguration = bugpack.require('bugioc.IConfiguration'); var ModuleAnnotation = bugpack.require('bugioc.ModuleAnnotation'); var PropertyAnnotation = bugpack.require('bugioc.PropertyAnnotation'); +var RoutesManager = bugpack.require('bugroutes.RoutesManager'); var ApplicationController = bugpack.require('airbugserver.ApplicationController'); var AirBugServer = bugpack.require('airbugserver.AirBugServer'); @@ -278,6 +279,13 @@ var AirBugConfiguration = Class.extend(Obj, { return ExpressRoutes; }, + /** + * @return {RoutesManager} + */ + expressRoutesManager: function(app, routes){ + return new RoutesManager(app, routes); + }, + /** * @return {ExpressServer} */ @@ -434,6 +442,11 @@ annotate(AirBugConfiguration).with( property("expressRoutes").ref("expressRoutes"), property("sessionStore").ref("sessionStore") ]), + module("expressRoutesManager") + .args([ + arg("app").ref("expressApp"), + arg("routes").ref("expressRoutes") + ]) module("expressRoutes"), module("expressServer") .args([ diff --git a/projects/airbugserver/js/Controllers/ApplicationController.js b/projects/airbugserver/js/src/Controllers/AlphaPagesController.js similarity index 65% rename from projects/airbugserver/js/Controllers/ApplicationController.js rename to projects/airbugserver/js/src/Controllers/AlphaPagesController.js index c3265da..98dc8f1 100644 --- a/projects/airbugserver/js/Controllers/ApplicationController.js +++ b/projects/airbugserver/js/src/Controllers/AlphaPagesController.js @@ -4,11 +4,11 @@ //@Package('airbugserver') -//@Export('ApplicationController') +//@Export('AlphaPagesController') //@Require('Class') //@Require('Obj') -//@Require('airbugserver.UsersApi') + //------------------------------------------------------------------------------- // Common Modules @@ -18,39 +18,35 @@ var bugpack = require('bugpack').context(); //------------------------------------------------------------------------------- -// Bugpack Modules +// BugPack //------------------------------------------------------------------------------- var Class = bugpack.require('Class'); var Obj = bugpack.require('Obj'); -var RoomsApi = bugpack.require('airbugserver.RoomApi'); -var UsersApi = bugpack.require('airbugserver.UserApi'); + //------------------------------------------------------------------------------- // Declare Class //------------------------------------------------------------------------------- -var ApplicationController = Class.extend(Obj, { +var AlphaPagesController = Class.extend(Obj, { - _constructor: function(roomApi, userApi, socketIoManager, socketsMap){ + _constructor: function(){ this._super(); - this.roomApi = roomApi; - - this.socketIoManager = socketIoManager; - - this.socketsMap = socketsMap; - - this.userApi = usersApi; + }, + home: function(req, res){ + res.render('alpha', { + title: 'airbug', + production: config.production + }); } }); - //------------------------------------------------------------------------------- // Exports //------------------------------------------------------------------------------- -bugpack.export('airbugserver.ApplicationController', ApplicationController); - +bugpack.export('airbugserver.AlphaPagesController', AlphaPagesController); diff --git a/projects/airbugserver/js/src/Controllers/RoomsController.js b/projects/airbugserver/js/src/Controllers/RoomsController.js new file mode 100644 index 0000000..b044347 --- /dev/null +++ b/projects/airbugserver/js/src/Controllers/RoomsController.js @@ -0,0 +1,94 @@ +//------------------------------------------------------------------------------- +// Annotations +//------------------------------------------------------------------------------- + +//@Package('airbugserver') + +//@Export('RoomsController') + +//@Require('Class') +//@Require('Obj') + +//------------------------------------------------------------------------------- +// Common Modules +//------------------------------------------------------------------------------- + +var bugpack = require('bugpack').context(); + + +//------------------------------------------------------------------------------- +// Bugpack Modules +//------------------------------------------------------------------------------- + +var Class = bugpack.require('Class'); +var Obj = bugpack.require('Obj'); + + +//------------------------------------------------------------------------------- +// Declare Class +//------------------------------------------------------------------------------- + +var RoomsController = Class.extend(Obj, { + + _constructor: function(roomService){ + + this._super(); + + this.roomService = roomService; + + }, + + + //------------------------------------------------------------------------------- + // Methods + //------------------------------------------------------------------------------- + + // configure: function(){ + // + // }, + + + /* + * @param {} params + **/ + createRoom: function(params){ + if(currentUser){ + this.roomService.create(params) + } + }, + + /* + * @param {} params + **/ + joinRoom: function(params){ + if(currentUser){ + var roomId = params.roomId || params.room.id; + this.roomService.addUserToRoom(currentUser, roomId); + } + }, + + /* + * @param {} params + **/ + leaveRoom: function(params){ + if(currentUser){ + var roomId = params.roomId || params.room.id; + this.roomService.removeUserFromRoom(currentUser, roomId); + } + }, + + //------------------------------------------------------------------------------- + // Private Methods + //------------------------------------------------------------------------------- + + pre: function(){ + + } +}); + + +//------------------------------------------------------------------------------- +// Exports +//------------------------------------------------------------------------------- + +bugpack.export('airbugserver.RoomsController', RoomsController); diff --git a/projects/airbugserver/js/src/Controllers/UsersController.js b/projects/airbugserver/js/src/Controllers/UsersController.js new file mode 100644 index 0000000..4c736da --- /dev/null +++ b/projects/airbugserver/js/src/Controllers/UsersController.js @@ -0,0 +1,72 @@ +//------------------------------------------------------------------------------- +// Annotations +//------------------------------------------------------------------------------- + +//@Package('airbugserver') + +//@Export('UsersController') + +//@Require('Class') +//@Require('Obj') + +//------------------------------------------------------------------------------- +// Common Modules +//------------------------------------------------------------------------------- + +var bugpack = require('bugpack').context(); + + +//------------------------------------------------------------------------------- +// Bugpack Modules +//------------------------------------------------------------------------------- + +var Class = bugpack.require('Class'); +var Obj = bugpack.require('Obj'); + + +//------------------------------------------------------------------------------- +// Declare Class +//------------------------------------------------------------------------------- + +var UsersController = Class.extend(Obj, { + + _constructor: function(){ + + this._super(); + + }, + + + //------------------------------------------------------------------------------- + // Methods + //------------------------------------------------------------------------------- + + /* + * @param {} + **/ + establishUser: function(params){ + UserService.establishUser(); + }, + + /* + * @param {} + **/ + getCurrentUser: function(params){ + + }, + + /* + * @param {} + **/ + logoutCurrentUser: function(params){ + + } + +}); + + +//------------------------------------------------------------------------------- +// Exports +//------------------------------------------------------------------------------- + +bugpack.export('airbugserver.UsersController', UsersController); diff --git a/projects/airbugserver/js/src/SocketAPIs/ChatMessageApi.js b/projects/airbugserver/js/src/Managers/ChatMessageManager.js similarity index 85% rename from projects/airbugserver/js/src/SocketAPIs/ChatMessageApi.js rename to projects/airbugserver/js/src/Managers/ChatMessageManager.js index dd80806..a5684a9 100644 --- a/projects/airbugserver/js/src/SocketAPIs/ChatMessageApi.js +++ b/projects/airbugserver/js/src/Managers/ChatMessageManager.js @@ -4,11 +4,10 @@ //@Package('airbugserver') -//@Export('ChatMessageApi') +//@Export('ChatMessageManager') //@Require('Class') //@Require('Obj') -//@Require('airbugserver.ChatMessage') //------------------------------------------------------------------------------- @@ -22,7 +21,6 @@ var bugpack = require('bugpack').context(); // Bugpack Modules //------------------------------------------------------------------------------- -var ChatMessage = bugpack.require('airbugserver.ChatMessage'); var Class = bugpack.require('Class'); var Obj = bugpack.require('Obj'); @@ -30,7 +28,7 @@ var Obj = bugpack.require('Obj'); // Declare Class //------------------------------------------------------------------------------- -var ChatMessageApi = Class.extend(Obj, { +var ChatMessageManager = Class.extend(Obj, { _constructor: function(model){ @@ -51,4 +49,4 @@ var ChatMessageApi = Class.extend(Obj, { // Exports //------------------------------------------------------------------------------- -bugpack.export('airbugserver.ChatMessageApi', ChatMessageApi); +bugpack.export('airbugserver.ChatMessageManager', ChatMessageManager); diff --git a/projects/airbugserver/js/src/SocketAPIs/ConversationApi.js b/projects/airbugserver/js/src/Managers/ConversationManager.js similarity index 89% rename from projects/airbugserver/js/src/SocketAPIs/ConversationApi.js rename to projects/airbugserver/js/src/Managers/ConversationManager.js index 9e1017c..4e3ed40 100644 --- a/projects/airbugserver/js/src/SocketAPIs/ConversationApi.js +++ b/projects/airbugserver/js/src/Managers/ConversationManager.js @@ -4,7 +4,7 @@ //@Package('airbugserver') -//@Export('ConversationApi') +//@Export('ConversationManager') //@Require('Class') //@Require('Obj') @@ -28,7 +28,7 @@ var Obj = bugpack.require('Obj'); // Declare Class //------------------------------------------------------------------------------- -var ConversationApi = Class.extend(Obj, { +var ConversationManager = Class.extend(Obj, { _constructor: function(model){ @@ -44,4 +44,4 @@ var ConversationApi = Class.extend(Obj, { // Exports //------------------------------------------------------------------------------- -bugpack.export('airbugserver.ConversationApi', ConversationApi); +bugpack.export('airbugserver.ConversationManager', ConversationManager); diff --git a/projects/airbugserver/js/src/SocketAPIs/RoomApi.js b/projects/airbugserver/js/src/Managers/RoomManager.js similarity index 92% rename from projects/airbugserver/js/src/SocketAPIs/RoomApi.js rename to projects/airbugserver/js/src/Managers/RoomManager.js index f7296dd..c51ccfc 100644 --- a/projects/airbugserver/js/src/SocketAPIs/RoomApi.js +++ b/projects/airbugserver/js/src/Managers/RoomManager.js @@ -4,7 +4,7 @@ //@Package('airbugserver') -//@Export('RoomApi') +//@Export('RoomManager') //@Require('Class') //@Require('Obj') @@ -23,6 +23,7 @@ var bugpack = require('bugpack').context(); var Class = bugpack.require('Class'); var Obj = bugpack.require('Obj'); +var Proxy = bugpack.require('Proxy'); //------------------------------------------------------------------------------- @@ -34,7 +35,7 @@ var RoomInterface = { }; // Implementation of Room interface for mongoose Model -var RoomApi = Class.extend(Obj, { +var RoomManager = Class.extend(Obj, { _constructor: function(model){ @@ -75,9 +76,7 @@ var RoomApi = Class.extend(Obj, { }, findById: function(id, callback){ - this.model.findById(id, function(error, room){ - callback(error, room); - }); + this.model.findById(id, callback); }, addUser: function(roomId, user, callback){ @@ -97,4 +96,4 @@ var RoomApi = Class.extend(Obj, { // Exports //------------------------------------------------------------------------------- -bugpack.export('airbugserver.RoomApi', RoomApi); +bugpack.export('airbugserver.RoomManager', RoomManager); diff --git a/projects/airbugserver/js/src/SocketAPIs/UserApi.js b/projects/airbugserver/js/src/Managers/UserManager.js similarity index 78% rename from projects/airbugserver/js/src/SocketAPIs/UserApi.js rename to projects/airbugserver/js/src/Managers/UserManager.js index 4f1838e..ef2012a 100644 --- a/projects/airbugserver/js/src/SocketAPIs/UserApi.js +++ b/projects/airbugserver/js/src/Managers/UserManager.js @@ -4,10 +4,11 @@ //@Package('airbugserver') -//@Export('UserApi') +//@Export('UserManager') //@Require('Class') //@Require('Obj') +//@Require('Proxy') //------------------------------------------------------------------------------- // Common Modules @@ -22,6 +23,7 @@ var bugpack = require('bugpack').context(); var Class = bugpack.require('Class'); var Obj = bugpack.require('Obj'); +var Proxy = bugpack.require('Proxy'); //------------------------------------------------------------------------------- // Declare Class @@ -32,9 +34,9 @@ var UserInterface = { }; // Implementation -var UserApi = Class.extend(Obj, { +var UserManager = Class.extend(Obj, { - _constructor: function(model){ + _constructor: function(model, schema){ this._super(); @@ -47,6 +49,15 @@ var UserApi = Class.extend(Obj, { */ this.model = model; + /** + * @type {mongoose.Schema.UserSchema} + */ + this.schema = schema; + + Proxy.proxy(this, this.schema, [ + 'pre', + 'post' + ]); }, @@ -55,14 +66,12 @@ var UserApi = Class.extend(Obj, { //------------------------------------------------------------------------------- /* - * @param {{ - * name: string, - * email: string - * }} data - * @param {function(Error, User)} callback + * @param {string} attribute + * @param {function(value) | function(value, response)} validationFunction + * @param {string} errorMessage **/ - establishUser: function(data, callback){ //findOrCreate - this.findOrCreate(data, callback); + validate: function(attribute, validationFunction, errorMessage){ + this.schema.path(attribute).validate(validationFunction, errorMessage); }, /* @@ -101,4 +110,4 @@ var UserApi = Class.extend(Obj, { // Exports //------------------------------------------------------------------------------- -bugpack.export('airbugserver.UserApi', UserApi); +bugpack.export('airbugserver.UserManager', UserManager); diff --git a/projects/airbugserver/js/src/Models/ChatMessage.js b/projects/airbugserver/js/src/Models/ChatMessage.js index 6be5076..d0dffe6 100644 --- a/projects/airbugserver/js/src/Models/ChatMessage.js +++ b/projects/airbugserver/js/src/Models/ChatMessage.js @@ -30,6 +30,7 @@ var ChatMessageSchema = bugpack.require('airbugserver.ChatMessageSchema'); var ChatMessage = mongoose.model("ChatMessage", ChatMessageSchema); + //------------------------------------------------------------------------------- // Exports //------------------------------------------------------------------------------- diff --git a/projects/airbugserver/js/src/Models/Conversation.js b/projects/airbugserver/js/src/Models/Conversation.js index ff117b1..513f867 100644 --- a/projects/airbugserver/js/src/Models/Conversation.js +++ b/projects/airbugserver/js/src/Models/Conversation.js @@ -30,6 +30,7 @@ var ConversationSchema = bugpack.require('airbugserver.ConversationSchema'); var Conversation = mongoose.model("Conversation", ConversationSchema); + //------------------------------------------------------------------------------- // Exports //------------------------------------------------------------------------------- diff --git a/projects/airbugserver/js/src/Models/Dialogue.js b/projects/airbugserver/js/src/Models/Dialogue.js index bd98de7..2403b33 100644 --- a/projects/airbugserver/js/src/Models/Dialogue.js +++ b/projects/airbugserver/js/src/Models/Dialogue.js @@ -30,6 +30,7 @@ var DialogueSchema = bugpack.require('airbugserver.DialogueSchema'); var Dialogue = mongoose.model("Dialogue", DialogueSchema); + //------------------------------------------------------------------------------- // Exports //------------------------------------------------------------------------------- diff --git a/projects/airbugserver/js/src/Routes/ExpressRoutes/ExpressRoutes.js b/projects/airbugserver/js/src/Routes/ExpressRoutes/ExpressRoutes.js index 5e64000..cd2afb3 100644 --- a/projects/airbugserver/js/src/Routes/ExpressRoutes/ExpressRoutes.js +++ b/projects/airbugserver/js/src/Routes/ExpressRoutes/ExpressRoutes.js @@ -21,26 +21,22 @@ var bugpack = require('bugpack').context(); // BugPack //------------------------------------------------------------------------------- -var Routes = bugpack.require('bugroutes.Routes'); var ExpressRoute = bugpack.require('bugroutes.ExpressRoute'); //------------------------------------------------------------------------------- // Routes //------------------------------------------------------------------------------- -var getAlpha = new ExpressRoute('get', '/alpha', function(req, res){ //TODO SUNG Create static pages controller - res.render('alpha', { - title: 'airbug', - production: config.production - }); -}); -var routes = [getAlpha]; //------------------------------------------------------------------------------- // Declare Class //------------------------------------------------------------------------------- -var ExpressRoutes = new Routes(routes); +var ExpressRoutes = [ + + new ExpressRoute('get', '/alpha', alphaPagesController.home) + +]; //------------------------------------------------------------------------------- // Exports diff --git a/projects/airbugserver/js/Controllers/RoomsController.js b/projects/airbugserver/js/src/Services/RoomService.js similarity index 72% rename from projects/airbugserver/js/Controllers/RoomsController.js rename to projects/airbugserver/js/src/Services/RoomService.js index 8b678ac..0c06a22 100644 --- a/projects/airbugserver/js/Controllers/RoomsController.js +++ b/projects/airbugserver/js/src/Services/RoomService.js @@ -4,11 +4,10 @@ //@Package('airbugserver') -//@Export('RoomsApi') +//@Export('RoomService') //@Require('Class') //@Require('Obj') -//@Require('airbugserver.ApplicationController') //------------------------------------------------------------------------------- // Common Modules @@ -21,7 +20,6 @@ var bugpack = require('bugpack').context(); // Bugpack Modules //------------------------------------------------------------------------------- -var ApplicationController = bugpack.require('airbugserver.ApplicationController'); var Class = bugpack.require('Class'); var Obj = bugpack.require('Obj'); @@ -30,12 +28,20 @@ var Obj = bugpack.require('Obj'); // Declare Class //------------------------------------------------------------------------------- -var RoomsController = Class.extend(ApplicationController, { +var RoomService = Class.extend(Obj, { - _constructor: function(){ + _constructor: function(roomManager, socketIoManager, socketsMap, userManager){ this._super(); + this.roomManager = roomManager; + + this.socketIoManager = socketIoManager; + + this.socketsMap = socketsMap; + + this.userManager = userManager; + }, @@ -47,17 +53,24 @@ var RoomsController = Class.extend(ApplicationController, { * @param {Room} room **/ create: function(currentUser, room){ - var room = this.roomApi.create(room); - this.addUserToRoom(currentUser, room.id); + var _this = this; + var room = this.roomManager.create(room, function(error, room){ + if(!error && room){ + _this.addUserToRoom(currentUser, room.id); + } + }); }, addUserToRoom: function(user, roomId){ - this.roomApi.addUser(roomId, user); + this.roomManager.addUser(roomId, user); this.notifyRoomMembers(roomId, "userAddedToRoom", {}, function(){ }); }, + removeUserFromRoom: function(user, roomId){ + + }, //------------------------------------------------------------------------------- // Private Methods @@ -72,13 +85,13 @@ var RoomsController = Class.extend(ApplicationController, { **/ notifyRoomMembers: function(roomId, eventName, data, callback){ var socketsMap = this.socketsMap; - var room = this.roomApi.findById(roomId); + var room = this.roomManager.findById(roomId); var roomMembers = room.membersList; - var userApi = this.userApi; + var userManager = this.userManager; roomMembers.forEach(function(roomMember){ var userId = roomMember.userId; - var user = userApi.findById(userId); + var user = userManager.findById(userId); sockets = socketsMap.findSocketsByUser(user); sockets.forEach(function(socket){ socket.emit(eventName, data); @@ -95,4 +108,4 @@ var RoomsController = Class.extend(ApplicationController, { // Exports //------------------------------------------------------------------------------- -bugpack.export('airbugserver.RoomsController', RoomsController); +bugpack.export('airbugserver.RoomService', RoomService); diff --git a/projects/airbugserver/js/Controllers/UsersController.js b/projects/airbugserver/js/src/Services/UserService.js similarity index 82% rename from projects/airbugserver/js/Controllers/UsersController.js rename to projects/airbugserver/js/src/Services/UserService.js index 74820a0..032de7c 100644 --- a/projects/airbugserver/js/Controllers/UsersController.js +++ b/projects/airbugserver/js/src/Services/UserService.js @@ -4,11 +4,10 @@ //@Package('airbugserver') -//@Export('UsersController') +//@Export('UserService') //@Require('Class') //@Require('Obj') -//@Require('airbugserver.ApplicationController') //------------------------------------------------------------------------------- // Common Modules @@ -21,7 +20,6 @@ var bugpack = require('bugpack').context(); // Bugpack Modules //------------------------------------------------------------------------------- -var ApplicationController = bugpack.require('airbugserver.ApplicationController'); var Class = bugpack.require('Class'); var Obj = bugpack.require('Obj'); @@ -29,12 +27,16 @@ var Obj = bugpack.require('Obj'); // Declare Class //------------------------------------------------------------------------------- -var UsersController = Class.extend(ApplicationController, { +var UserService = Class.extend(Obj, { - _constructor: function(){ + _constructor: function(socketIoManager, userManager){ this._super(); + this.socketIoManager = socketIoManager; + + this.userManager = userManager; + }, //------------------------------------------------------------------------------- @@ -49,7 +51,7 @@ var UsersController = Class.extend(ApplicationController, { **/ establishUser: function(data){ var _this = this; - this.userApi.establishUser(data, function(error, user){ + this.userManager.findOrCreate(data, function(error, user){ if(!error){ currentUser = user; _this.socketIoManager.addEstablishedUserListeners(socket); //make sure this socket is the proper one @@ -65,5 +67,5 @@ var UsersController = Class.extend(ApplicationController, { // Exports //------------------------------------------------------------------------------- -bugpack.export('airbugserver.UsersController', UsersController); +bugpack.export('airbugserver.UserService', UserService);