Skip to content

Commit

Permalink
Add an example express app
Browse files Browse the repository at this point in the history
  • Loading branch information
dxg committed Nov 24, 2013
1 parent b6a5b2c commit 6ff996f
Showing 20 changed files with 694 additions and 0 deletions.
4 changes: 4 additions & 0 deletions Readme.md
Original file line number Diff line number Diff line change
@@ -108,6 +108,10 @@ You can call `orm.express` more than once to have multiple database connections.
will be joined together in `req.models`. **Don't forget to use it before `app.use(app.router)`, preferably right after your
assets public folder(s).**

## Examples

See `examples/anontxt` for an example express based app.

## Documentation

Documentation is moving to the [wiki](https://github.com/dresende/node-orm2/wiki/).
30 changes: 30 additions & 0 deletions examples/anontxt/Readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# AnonTXT demo app

## Getting started

**Setup node-orm2!**

```bash
git clone https://github.com/dresende/node-orm2.git
cd node-orm2
npm install

# You may work off master, or checkout a different version if master is broken:
git tag
git checkout v2.1.3
```

**Setup AnonTXT**

Edit `anontxt/config/settings.js` and set your database, user & password.

```bash
cd examples/anontxt
npm install
node tasks/reset
nodemon server.js
```

And then open up [localhost:3000](http://localhost:3000/)

You can also just run it with `node server.js` however nodemon will automatically restart the server if you change any code.
15 changes: 15 additions & 0 deletions examples/anontxt/app/controllers/_helpers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@

module.exports = {
formatErrors: function(errorsIn) {
var errors = {};
var a, e;

for(a = 0; a < errorsIn.length; a++) {
e = errorsIn[a];

errors[e.property] = errors[e.property] || [];
errors[e.property].push(e.msg);
}
return errors;
}
};
33 changes: 33 additions & 0 deletions examples/anontxt/app/controllers/comments_controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
var _ = require('lodash');
var helpers = require('./_helpers');
var orm = require('../../../../');

module.exports = {
create: function (req, res, next) {
var params = _.pick(req.body, 'author', 'body');

req.models.message.get(req.params.messageId, function (err, message) {
if (err) {
if (err.code == orm.ErrorCodes.NOT_FOUND) {
res.send(404, "Message not found");
} else {
return next(err);
}
}

params.message_id = message.id;

req.models.comment.create(params, function (err, message) {
if(err) {
if(Array.isArray(err)) {
return res.send(200, { errors: helpers.formatErrors(err) });
} else {
return next(err);
}
}

return res.send(200, message.serialize());
});
});
}
};
5 changes: 5 additions & 0 deletions examples/anontxt/app/controllers/home_controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
var settings = require('../../config/settings');

module.exports = function (req, res, next) {
res.sendfile(settings.path + '/public/index.html');
};
6 changes: 6 additions & 0 deletions examples/anontxt/app/controllers/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@

module.exports = {
home : require('./home_controller'),
messages : require('./messages_controller'),
comments : require('./comments_controller')
};
35 changes: 35 additions & 0 deletions examples/anontxt/app/controllers/messages_controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
var _ = require('lodash');
var helpers = require('./_helpers');
var orm = require('../../../../');

module.exports = {
list: function (req, res, next) {
req.models.message.find().limit(4).order('-id').all(function (err, messages) {
if (err) return next(err);

var items = messages.map(function (m) {
return m.serialize();
});

res.send({ items: items });
});
},
create: function (req, res, next) {
var params = _.pick(req.body, 'title', 'body');

req.models.message.create(params, function (err, message) {
if(err) {
if(Array.isArray(err)) {
return res.send(200, { errors: helpers.formatErrors(err) });
} else {
return next(err);
}
}

return res.send(200, message.serialize());
});
},
get: function (req, res, next) {

}
};
28 changes: 28 additions & 0 deletions examples/anontxt/app/models/comment.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
var moment = require('moment');

module.exports = function (orm, db) {
var Comment = db.define('comment', {
body : { type: 'text', required: true },
createdAt : { type: 'date', required: true, time: true }
},
{
hooks: {
beforeValidation: function () {
this.createdAt = new Date();
}
},
validations: {
body : orm.enforce.ranges.length(1, 1024)
},
methods: {
serialize: function () {
return {
body : this.body,
createdAt : moment(this.createdAt).fromNow()
}
}
}
});

Comment.hasOne('message', db.models.message, { required: true, reverse: 'comments', autoFetch: true });
};
22 changes: 22 additions & 0 deletions examples/anontxt/app/models/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
var orm = require('../../../../');
var settings = require('../../config/settings');

var connection = null;

function setup(db, cb) {
require('./message')(orm, db);
require('./comment')(orm, db);

return cb(null, db);
}

module.exports = function (cb) {
if (connection) return cb(null, connection);

orm.connect(settings.database, function (err, db) {
if (err) return cb(err);

db.settings.set('instance.returnAllErrors', true);
setup(db, cb);
});
};
45 changes: 45 additions & 0 deletions examples/anontxt/app/models/message.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
var moment = require('moment');

module.exports = function (orm, db) {
var Message = db.define('message', {
title : { type: 'text', required: true },
body : { type: 'text', required: true, big: true },
createdAt : { type: 'date', required: true, time: true }
},
{
hooks: {
beforeValidation: function () {
this.createdAt = new Date();
}
},
validations: {
title: [
orm.enforce.ranges.length(1, undefined, "must be atleast 1 letter long"),
orm.enforce.ranges.length(undefined, 96, "cannot be longer than 96 letters")
],
body: [
orm.enforce.ranges.length(1, undefined, "must be atleast 1 letter long"),
orm.enforce.ranges.length(undefined, 32768, "cannot be longer than 32768 letters")
]
},
methods: {
serialize: function () {
var comments;

if (this.comments) {
comments = this.comments.map(function (c) { return c.serialize(); });
} else {
comments = [];
}

return {
id : this.id,
title : this.title,
body : this.body,
createdAt : moment(this.createdAt).fromNow(),
comments : comments
};
}
}
});
};
24 changes: 24 additions & 0 deletions examples/anontxt/config/environment.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
var path = require('path');
var express = require('express');
var settings = require('./settings');
var models = require('../app/models/');

module.exports = function (app) {
app.configure(function () {
app.use(express.static(path.join(settings.path, 'public')));
app.use(express.logger({ format: 'dev' }));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(function (req, res, next) {
models(function (err, db) {
if (err) return next(err);

req.models = db.models;
req.db = db;

return next();
});
}),
app.use(app.router);
});
};
10 changes: 10 additions & 0 deletions examples/anontxt/config/routes.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@

var controllers = require('../app/controllers')

module.exports = function (app) {
app.get( '/' , controllers.home);
app.get( '/messages' , controllers.messages.list);
app.post('/messages' , controllers.messages.create);
app.get( '/message/:id' , controllers.messages.get);
app.post('/message/:messageId/comments', controllers.comments.create);
};
16 changes: 16 additions & 0 deletions examples/anontxt/config/settings.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
var path = require('path');

var settings = {
path : path.normalize(path.join(__dirname, '..')),
port : process.env.NODE_PORT || 3000,
database : {
protocol : "postgresql", // or "mysql"
query : { pool: true },
host : "127.0.0.1",
database : "anontxt_dev",
user : "anontxt",
password : "apassword"
}
};

module.exports = settings;
18 changes: 18 additions & 0 deletions examples/anontxt/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"name": "AnonTXT",
"description": "Post text snippets, quickly and easily",
"version": "0.1.0",
"repository" : "http://github.com/dresende/node-orm2.git",
"dependencies": {
"express": "3.3.*",
"lodash": "2.3.0",
"nodemon": "0.7.10",
"moment": "2.4.0",
"pg": "2.6.2",
"colors": "0.6.2"
},
"scripts": {
"start": "script/start",
"reset": "script/reset"
}
}
Loading

0 comments on commit 6ff996f

Please sign in to comment.