Skip to content

Commit

Permalink
general Resors
Browse files Browse the repository at this point in the history
  • Loading branch information
etai committed May 1, 2013
1 parent bd15522 commit 74d8595
Show file tree
Hide file tree
Showing 9 changed files with 141 additions and 78 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
Resors
=====
Simply write resource.

Resources for Mongoose. Check `\example\models\users.js` for most options.
9 changes: 1 addition & 8 deletions example/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,20 +10,13 @@ app.set('port', 80);
app.set('mongo', 'mongodb://localhost/resors');
app.set('admin', { username: 'admin', password: 'admin'});

// dust
/*app.engine('dust', require('consolidate').dust);
app.set('view engine', 'dust');
app.set('views', path.join(__dirname, 'views'));
require('dustjs-linkedin').optimizers.format = function(ctx, node) { return node };*/

app.use(express.favicon());
//app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser('magical resors'));
app.use(express.cookieSession({cookie: { maxAge: 60 * 1000 * 20 }}));
app.use(app.router);
//app.use(express.static(path.join(__dirname, 'public')));

// development only
if ('development' == app.get('env')) {
Expand All @@ -42,7 +35,7 @@ app.use(function(req, res, next) {
});

require('mongoose').connect(app.get('mongo'));
app.use('/api', require('../')(express, models));
app.use('/api', require('../').middleware(express, require('./resources')));
app.get('/', function(req, res) {
res.redirect('/api');
});
Expand Down
23 changes: 23 additions & 0 deletions example/models/posts.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
var mongoose = require('mongoose'),
Types = mongoose.Schema.Types;

var schema = new mongoose.Schema({
title: { type: String },
content: { type: String },
user: { type: Types.ObjectId, ref: 'users' }
});
schema.methods.toString = function(){
return this.title;
};
var posts = module.exports = mongoose.model('posts', schema);


/*
Resors
*/
posts.resors = {
query: function(req, res, next) {
res.query = res.query.populate('user');
next();
}
};
6 changes: 3 additions & 3 deletions example/models/users.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@ var users = module.exports = mongoose.model('users', schema);
*/
users.resors = {
allow: [ 'get', 'post', 'put', 'delete' ],
select: 'email', // TODO
fields: 'email',
editable: 'email', // TODO
filtering: 'name', // TODO
sorting: 'name', // TODO
sorting: 'name', // TODO,
before: function(req, res, next) {
var resors = req.resors;

Expand All @@ -37,7 +37,7 @@ users.resors = {
resors.allow = [ 'get' ];

// Validation or sanitation (use mongoose if you can!)
if (resors.validation) {
if (resors.method('put')) {
if (!req.body.email)
resors.errors.push(['email', 'Email is required.']);
}
Expand Down
13 changes: 13 additions & 0 deletions example/resources.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
var Resors = require('../'),
models = require('./models');

var hi = new Resors('hi');
hi.index = function(req, res) {
res.json('hi');
};

module.exports = {
hi: hi,
users: models.users,
posts: models.posts
};
26 changes: 18 additions & 8 deletions lib/index.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,29 @@
var Resors = require('./resors');
var Resors = require('./resors'),
MongooseResors = require('./mongoose');

var resors = module.exports = function(express, models) {
module.exports = Resors;
Resors.MongooseResors = MongooseResors;

Resors.middleware = function(express, resources) {
var app = express();

app.get('/', function(req, res) {
res.json({
models: Object.keys(models)
resources: Object.keys(resources)
});
});

Object.keys(models).forEach(function(name) {
var resource = Resors.fetch(models[name]);
resource.routes(app);
Object.keys(resources).forEach(function(path) {
var r = resources[path];

if (r.modelName)
r = new MongooseResors(r, r.resors || {});

else if (!r.routes)
r = new Resors(path, r);

r.routes(app);
});

return app;
};
resors.Resors = Resors;
};
61 changes: 61 additions & 0 deletions lib/mongoose.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
var Resors = require('./resors'),
extend = require('xtend');

/*
Mongoose Resors Class
*/
var MongooseResors = module.exports = function(model, options) {
this.model = model;
this.path = model.modelName;
this.options = extend(Resors.defaults, options);
};
MongooseResors.fn = MongooseResors.prototype = new Resors;
MongooseResors.fn.constructor = MongooseResors;
MongooseResors.fn.query = function(q) {
var o = this.options;

if (o.fields)
q = q.select(o.fields);

return q;
};
MongooseResors.fn.index = function(req, res, next) {
res.query = this.query(this.model.find());

/*
TODO:
offset, limit
filter
sorting
*/

next();
};
MongooseResors.fn.show = function(req, res, next) {
res.query = this.query(this.model.findById(req.params.id));
next();
};
MongooseResors.fn.create = function(req, res, next) {
this.model.create(req.body, function(err, result) {
res.err = err;
res.result = result;
next();
});
};
MongooseResors.fn.update = function(req, res, next) {
console.log(req.body);
res.query = this.query(this.model.findByIdAndUpdate(req.params.id, req.body));
next();
};
MongooseResors.fn.destroy = function(req, res, next) {
res.query = this.model.findByIdAndRemove(req.params.id);
next();
};
MongooseResors.fn.exec = function(req, res, next) {
res.query.exec(function(err, result) {
delete res.query;
res.err = err;
res.result = result;
next();
});
};
78 changes: 20 additions & 58 deletions lib/resors.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,45 +11,11 @@ var middleware = function(req, res, next) {
/*
Resors Class
*/
var Resors = module.exports = function(model, options) {
this.model = model;
this.name = model.modelName;
var Resors = module.exports = function(path, options) {
this.path = path;
this.options = extend(Resors.defaults, options);

Resors.register(this);
};
Resors.fn = Resors.prototype;
Resors.fn.index = function(req, res, next) {
res.query = this.model.find();
next();
};
Resors.fn.show = function(req, res, next) {
res.query = this.model.findById(req.params.id);
next();
};
Resors.fn.create = function(req, res, next) {
this.model.create(req.body, function(err, result) {
res.err = err;
res.result = result;
next();
});
};
Resors.fn.update = function(req, res, next) {
res.query = this.model.findByIdAndUpdate(req.params.id, req.body);
next();
};
Resors.fn.destroy = function(req, res, next) {
res.query = this.model.findByIdAndRemove(req.params.id);
next();
};
Resors.fn.exec = function(req, res, next) {
res.query.exec(function(err, result) {
delete res.query;
res.err = err;
res.result = result;
next();
});
};
Resors.fn.finish = function(req, res) {
if (res.err)
res.status(400).json(res.err);
Expand All @@ -62,7 +28,9 @@ Resors.fn.middlewares = function(route) {
return [
function(req, res, next) {
req.resors = extend({}, self.options, {
validation: ~[ 'POST', 'PUT' ].indexOf(req.method),
method: function() {
return ~([].slice.call(arguments)).indexOf(req.method.toLowerCase())
},
errors: []
});
next();
Expand All @@ -85,37 +53,31 @@ Resors.fn.middlewares = function(route) {
('create' != route ? this.exec : middleware),
this.options.after,
this.finish
].map(function(m) { return m.bind(self) });
].map(function(m) { return m ? m.bind(self) : middleware });
};
Resors.fn.routes = function(app) {
var name = this.name;
var path = this.path;

app.get('/' + name, this.middlewares('index'));
app.get('/' + name + '/:id', this.middlewares('show'));
app.post('/' + name + '', this.middlewares('create'));
app.put('/' + name + '/:id', this.middlewares('update'));
app.delete('/' + name + '/:id', this.middlewares('destroy'));
app.get('/' + path, this.middlewares('index'));
app.get('/' + path + '/:id', this.middlewares('show'));
app.post('/' + path + '', this.middlewares('create'));
app.put('/' + path + '/:id', this.middlewares('update'));
app.delete('/' + path + '/:id', this.middlewares('destroy'));
};



/*
Resors Registry
Resors defaults
*/
var resources = {};
Resors.register = function(resource) {
resources[resource.name] = resource;
};
Resors.fetch = function(model) {
var name = model.modelName;

if (resources[name])
return resources[name];
else
return new Resors(model, model.resors);
};
//var resources = {};
//Resors.register = function(resource) {
// resources[resource.path] = resource;
//};
Resors.defaults = {
allow: [ 'get' ],
before: middleware,
query: middleware,
after: middleware
after: middleware,
limit: 20
};
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@
"start": "node example/app"
},
"dependencies": {
"mongoose": "",
"xtend": ""
},
"devDependencies": {
"express": "3.2.0",
"mongoose": "",
"formage-admin": "",
"jade": "*"
}
Expand Down

0 comments on commit 74d8595

Please sign in to comment.