started abstracting the data store layer - started with mongodb

This commit is contained in:
David Dunlop 2011-03-12 14:40:28 -05:00
parent 5adfd527cf
commit 57bbc56c21
2 changed files with 200 additions and 20 deletions

139
lib/data.js Normal file
View file

@ -0,0 +1,139 @@
var Db = require('mongodb').Db;
Server = require('mongodb').Server,
BSON = require('mongodb').BSONNative
var db = function(callback) {
this.rooms = false;
var t = this;
var db = new Db('scrumblr', new Server('localhost', 27017, {}), {native_parser:true});
db.open(function(err, db) {
db.collection('rooms', function(err, collection) {
t.rooms = collection;
});
callback();
});
}
db.prototype = {
clearRoom: function(room, callback) {
console.log('here',room);
this.rooms.remove({name:room},callback);
},
// theme commands
setTheme: function(room, theme) {
this.rooms.update(
{name:room},
{$set:{theme:theme}}
);
},
getTheme: function(room, callback) {
this.rooms.findOne(
{name:room},
{theme:true},
function(err, room) {
if(room) {
callback(room.theme);
} else {
callback();
}
}
);
},
// Column commands
createColumn: function(room, name, callback) {
this.rooms.update(
{name:room},
{$push:{columns:name}},
{upsert:true}
,callback
);
},
deleteColumn: function(room) {
this.rooms.update(
{name:room},
{$pop:{columns:1}}
);
},
setColumns: function(room, columns) {
this.rooms.update(
{name:room},
{$set:{columns:columns}},
{upsert:true}
);
},
// Card commands
createCard: function(room, id, card) {
var doc = {};
doc['cards.'+id] = card;
this.rooms.update(
{name:room},
{$set:doc},
{upsert:true}
);
},
getAllCards: function(room, callback) {
this.rooms.findOne({name:room},{cards:true},function(err, room) {
if(room) {
callback(room.cards);
} else {
callback();
}
});
},
getAllColumns: function(room, callback) {
this.rooms.findOne({name:room},{columns:true},function(err, room) {
if(room) {
callback(room.columns);
} else {
callback();
}
});
},
cardEdit: function(room, id, text) {
var doc = {};
doc['cards.'+id+'.text'] = text;
this.rooms.update(
{name:room},
{$set:doc}
);
},
cardSetXY: function(room, id, x, y) {
var doc = {};
doc['cards.'+id+'.x'] = x;
doc['cards.'+id+'.y'] = y;
this.rooms.update(
{name:room},
{$set:doc}
);
},
deleteCard: function(room, id) {
var doc = {};
doc['cards.'+id] = true;
this.rooms.update(
{name:room},
{$unset:doc}
);
},
addSticker: function(room, cardId, stickerId) {
var doc = {};
doc['cards.'+cardId+'.sticker'] = stickerId;
this.rooms.update(
{name:room},
{$set:doc}
);
}
};
exports.db = db;

View file

@ -3,8 +3,10 @@ var http = require('http'),
express = require('express'), express = require('express'),
connect = require('connect'); connect = require('connect');
/*
var redis = require("redis"), var redis = require("redis"),
redisClient = redis.createClient(); redisClient = redis.createClient();
*/
var sys = require('sys'); var sys = require('sys');
@ -13,20 +15,22 @@ var app = express.createServer();
var async = require('async'); var async = require('async');
var rooms = require('./lib/rooms.js'); var rooms = require('./lib/rooms.js');
var data = require('./lib/data.js');
var sanitizer = require('sanitizer'); var sanitizer = require('sanitizer');
// If you want Memory Store instead... // If you want Memory Store instead...
// var MemoryStore = require('connect/middleware/session/memory'); // var MemoryStore = require('connect/middleware/session/memory');
// var session_store = new MemoryStore(); // var session_store = new MemoryStore();
var RedisStore = require('connect-redis'); //var RedisStore = require('connect-redis');
var session_store = new RedisStore( ); //var session_store = new RedisStore( );
//Map of sids to user_names //Map of sids to user_names
var sids_to_user_names = []; var sids_to_user_names = [];
var REDIS_PREFIX = '#scrumscrum#'; //var REDIS_PREFIX = '#scrumscrum#';
app.configure( function(){ app.configure( function(){
app.use(express.static(__dirname + '/client')); app.use(express.static(__dirname + '/client'));
@ -39,7 +43,7 @@ app.configure( function(){
express.session({ express.session({
key: "scrumscrum-cookie", key: "scrumscrum-cookie",
secret: "kookoorikoo", secret: "kookoorikoo",
store: session_store, // store: session_store,
cookie: { path: '/', httpOnly: true, maxAge: 14400000 } cookie: { path: '/', httpOnly: true, maxAge: 14400000 }
}) })
); );
@ -48,10 +52,12 @@ app.configure( function(){
}); });
/*
//For Redis Debugging //For Redis Debugging
redisClient.on("error", function (err) { redisClient.on("error", function (err) {
console.log("Redis error: " + err); console.log("Redis error: " + err);
}); });
*/
app.get('/', function(req, res) { app.get('/', function(req, res) {
@ -393,39 +399,47 @@ function broadcastToRoom ( client, message ) {
function getTheme ( room , callbackFunction ) function getTheme ( room , callbackFunction )
{ {
redisClient.get(REDIS_PREFIX + '-room:' + room + '-theme', function (err, res) { db.getTheme(room, callbackFunction);
callbackFunction(res); // redisClient.get(REDIS_PREFIX + '-room:' + room + '-theme', function (err, res) {
}); // callbackFunction(res);
// });
} }
function setTheme ( room, theme ) function setTheme ( room, theme )
{ {
redisClient.set(REDIS_PREFIX + '-room:' + room + '-theme', theme); db.setTheme(room, theme);
// redisClient.set(REDIS_PREFIX + '-room:' + room + '-theme', theme);
} }
//----------------COL FUNCTIONS //----------------COL FUNCTIONS
function getAllColumns ( room, callbackFunction ) { function getAllColumns ( room, callbackFunction ) {
redisClient.lrange(REDIS_PREFIX + '-room:' + room + '-columns', 0, -1, function(err, res) { db.getAllColumns(room, callbackFunction);
callbackFunction(res); // redisClient.lrange(REDIS_PREFIX + '-room:' + room + '-columns', 0, -1, function(err, res) {
}); // callbackFunction(res);
// });
} }
function createColumn ( room, name, callback ) { function createColumn ( room, name, callback ) {
console.log('rpush: ' + REDIS_PREFIX + '-room:' + room + '-columns' + " -- " + name); // console.log('rpush: ' + REDIS_PREFIX + '-room:' + room + '-columns' + " -- " + name);
redisClient.rpush(REDIS_PREFIX + '-room:' + room + '-columns', name, db.createColumn(room, name, callback);
function (err, res) { // redisClient.rpush(REDIS_PREFIX + '-room:' + room + '-columns', name,
// function (err, res) {
if (typeof callback != "undefined" && callback !== null) callback(); if (typeof callback != "undefined" && callback !== null) callback();
} // }
); // );
} }
function deleteColumn ( room ) { function deleteColumn ( room ) {
redisClient.rpop(REDIS_PREFIX + '-room:' + room + '-columns'); console.log('deleteColumn');
db.deleteColumn();
// redisClient.rpop(REDIS_PREFIX + '-room:' + room + '-columns');
} }
function setColumns ( room, columns ) { function setColumns ( room, columns ) {
console.dir('SetColumns:'); console.dir('SetColumns:');
console.dir(columns); console.dir(columns);
db.setColumns(room, columns);
/*
//1. first delete all columns //1. first delete all columns
redisClient.del(REDIS_PREFIX + '-room:' + room + '-columns', function () { redisClient.del(REDIS_PREFIX + '-room:' + room + '-columns', function () {
@ -446,6 +460,7 @@ function setColumns ( room, columns ) {
} }
); );
}); });
*/
} }
@ -459,22 +474,27 @@ function createCard( room, id, text, x, y, rot, colour ) {
x: x, x: x,
y: y, y: y,
text: text, text: text,
stickerId: null sticker: null
}; };
var cardString = JSON.stringify(card); // var cardString = JSON.stringify(card);
db.createCard(room, id, card);
/*
redisClient.hset( redisClient.hset(
REDIS_PREFIX + '-room:' + room + '-cards', REDIS_PREFIX + '-room:' + room + '-cards',
id, id,
cardString cardString
) )
*/
//console.log(JSON.stringify(cards)); //console.log(JSON.stringify(cards));
} }
function cardSetXY( room, id, x, y ) function cardSetXY( room, id, x, y )
{ {
db.cardSetXY(room, id, x, y);
/*
redisClient.hget(REDIS_PREFIX + '-room:' + room + '-cards', id, function(err, res) { redisClient.hget(REDIS_PREFIX + '-room:' + room + '-cards', id, function(err, res) {
var card = JSON.parse(res); var card = JSON.parse(res);
if (card !== null) if (card !== null)
@ -485,9 +505,12 @@ function cardSetXY( room, id, x, y )
} }
}); });
*/
} }
function cardEdit( room , id, text) { function cardEdit( room , id, text) {
db.cardEdit(room, id, text);
/*
redisClient.hget(REDIS_PREFIX + '-room:' + room + '-cards', id, function(err, res) { redisClient.hget(REDIS_PREFIX + '-room:' + room + '-cards', id, function(err, res) {
var card = JSON.parse(res); var card = JSON.parse(res);
if (card !== null) if (card !== null)
@ -497,18 +520,24 @@ function cardEdit( room , id, text) {
} }
}); });
*/
} }
function deleteCard( room, id ) { function deleteCard( room, id ) {
db.deleteCard(room, id);
//console.log('deletecard in redis: ' + id); //console.log('deletecard in redis: ' + id);
/*
redisClient.hdel( redisClient.hdel(
REDIS_PREFIX + '-room:' + room + '-cards', REDIS_PREFIX + '-room:' + room + '-cards',
id id
) )
*/
} }
function getAllCards( room, callbackFunction ) { function getAllCards( room, callbackFunction ) {
console.log('getall from: ' + REDIS_PREFIX + '-room' + room + '-cards'); // console.log('getall from: ' + REDIS_PREFIX + '-room' + room + '-cards');
db.getAllCards(room, callbackFunction);
/*
redisClient.hgetall(REDIS_PREFIX + '-room:' + room + '-cards', function (err, res) { redisClient.hgetall(REDIS_PREFIX + '-room:' + room + '-cards', function (err, res) {
var cards = Array(); var cards = Array();
@ -522,9 +551,12 @@ function getAllCards( room, callbackFunction ) {
callbackFunction (cards); callbackFunction (cards);
}); });
*/
} }
function addSticker( room, cardId, stickerId ) { function addSticker( room, cardId, stickerId ) {
db.addSticker(room, cardId, stickerId);
/*
redisClient.hget(REDIS_PREFIX + '-room:' + room + '-cards', cardId, function(err, res) { redisClient.hget(REDIS_PREFIX + '-room:' + room + '-cards', cardId, function(err, res) {
var card = JSON.parse(res); var card = JSON.parse(res);
if (card !== null) if (card !== null)
@ -534,6 +566,7 @@ function addSticker( room, cardId, stickerId ) {
} }
}); });
*/
} }
function roundRand( max ) function roundRand( max )
@ -565,8 +598,12 @@ function setUserName ( client, name )
// DUMMY DATA // DUMMY DATA
/*
redisClient.del(REDIS_PREFIX + '-room:/demo-cards', function (err, res) { redisClient.del(REDIS_PREFIX + '-room:/demo-cards', function (err, res) {
redisClient.del(REDIS_PREFIX + '-room:/demo-columns', function (err, res) { redisClient.del(REDIS_PREFIX + '-room:/demo-columns', function (err, res) {
*/
var db = new data.db(function() {
db.clearRoom('/demo', function() {
createColumn( '/demo', 'Not Started' ); createColumn( '/demo', 'Not Started' );
createColumn( '/demo', 'Started' ); createColumn( '/demo', 'Started' );
createColumn( '/demo', 'Testing' ); createColumn( '/demo', 'Testing' );
@ -585,6 +622,10 @@ redisClient.del(REDIS_PREFIX + '-room:/demo-cards', function (err, res) {
createCard('/demo', 'card8', '.', roundRand(600), roundRand(300), Math.random() * 10 - 5, 'green'); createCard('/demo', 'card8', '.', roundRand(600), roundRand(300), Math.random() * 10 - 5, 'green');
}); });
}); });
/*
});
});
*/
// //