ember-mongoose

Mongoose ⇆ Ember-Data

Expose mongoose models via an API compliant with the default Ember Rest Adapter

$ npm install ember-mongoose
$ component install kelonye/ember-mongoose

To get started, suppose you have a model, Post:

 
// server/models/Post.js 
 
module.exports = new mongoose.Schema(
  {
    title: String,
    content: String
  }, {
    versionKey: false
  }
);
 

To expose this model, via an API, first define the CRUD auth hooks as:

// server/api_hooks/pre/Post.js 
 
exports.create = function(reqnext){
  
  var err;
  
  if (!(req.isAuthenticated() && req.user)) { // assuming you're using passport.js 
    err = new Error('not allowed to access this resource');
    err.status = 403;
  }
 
  console.log(req.body.post);
 
  next(err);
 
};
 
exports.read = function(reqnext){
  next();
};
 
exports.update = function (reqnext){ 
  var err = new Error('not allowed to access this resource');
  err.status = 403;
  next(err);
};
 
exports.remove = function (reqnext){ 
  var err = new Error('not allowed to access this resource');
  err.status = 403;
  next(err);
};
 

You also need to specify the fields to expose as:

// server/api_fields/Post.js 
 
module.exports = [
  'title',
  'content',
];
 

Finally, build and mount the API to your Express app:

var join = require('path').join;
var express = require('express');
var db = require('mongoose').createConnection('mongodb://localhost/test');
var em = require('ember-mongoose');
var app = express();
 
// build api 
 
em()
  .models(db, join(__dirname, 'server/models'))
  .fields(join(__dirname, 'server/api_fields'))
  .hooks(join(__dirname, 'server/api_hooks'));
  .discover(app);
 
app.listen(3000);
 

With this, you can now access the Post resource e.g.:

$ curl http://localhost:3000/posts

$ curl
  -H "Content-Type: application/json"
  -X POST
  -d '"post": {{"title":"title","content":""}}'
  http://localhost:3000/posts

$ curl http://localhost:3000/posts/1

$ curl
  -H "Content-Type: application/json"
  -X PUT
  -d '"post": {{"title":"title","content":""}}'
  http://localhost:3000/posts/1

$ curl -X DELETE http://localhost:3000/posts/1

On client side, assuming you're using component package manager, you can set your app's adapter as:

 
App.ApplicationAdapter = require('ember-mongoose');
 

or alternatively, use lib/client/index.js if not.

Finally, you can then use the Ember-Data store to perfom API calls, e.g.:

 
App.Post = DS.Model.extend({
  title: DS.attr('string'),
  content: DS.attr('string'),
});
 
// pass query to mongoose 
 
var query = 
  conditions: {
    title: 'title'
  },
  options: {
    skip: 0, // start row 
    limit: 10, // end row 
    sort: {
      created_at: -1 // order by latest 
    }
  }
};
 
this
  .store
  .find('post', query)
  .then(function(posts){
    console.log(posts);
  }, funntion(res){
    console.log(res.responseText);
  });
 
// create example 
 
var record = {
  title: 'My First Post',
  content: '',
};
 
this
  .store
  .createRecord('post', record)
  .save()
  .then(function(post){
    console.log(post);
  }, funntion(res){
    console.log(res.responseText);
  });
 

To only retrieve the number of documents in a query, passin the count option as:

 
var query = 
  conditions: {
    title: 'title'
  },
  options: {
    count: true
  }
};
 
this
  .store
  .find('post', query)
  .then(function(res){
    console.log(res.meta.count);
  }, funntion(res){
    console.log(res.responseText);
  });

For more usage example, see test/support

$ make test