Skip to content

Commit

Permalink
Added CRUD example.
Browse files Browse the repository at this point in the history
  • Loading branch information
cskr committed Jul 30, 2010
1 parent a4c0c77 commit a323bc5
Show file tree
Hide file tree
Showing 27 changed files with 656 additions and 0 deletions.
15 changes: 15 additions & 0 deletions examples/CRUD/boot.js
@@ -0,0 +1,15 @@
var gh = require('./grasshopper');

gh.configure({
viewsDir: './views',
layout: 'layout',
locales: require('./locales')
});

[
'./controllers/home', './controllers/paradigms', './controllers/executions', './controllers/languages'
].forEach(function(controller) {
require(controller);
});

gh.serve(8080);
61 changes: 61 additions & 0 deletions examples/CRUD/controllers/executions.js
@@ -0,0 +1,61 @@
var gh = require('../grasshopper'),
executionRepo = require('../repositories/executions'),
Execution = require('../models').Execution;

gh.get('/executions', function() {
var self = this;
executionRepo.all(function(err, p) {
self.model['executions'] = p;
self.render('executions/index');
});
});

gh.get('/executions/add', function() {
this.model['execution'] = new Execution();
this.render('executions/add');
});

gh.get('/executions/{id}/edit', function(args) {
var self = this;
executionRepo.get(args.id, function(err, p) {
self.model['execution'] = p;
self.render('executions/edit');
});
});

gh.post('/executions', function() {
var p = new Execution().update(this.params['execution']);
var self = this;
if(!p.isValid()) {
this.model['execution'] = p;
this.render('executions/add');
} else {
executionRepo.save(p, function() {
self.redirect('/executions');
});
}
});

gh.post('/executions/{id}/update', function(args) {
var self = this;
executionRepo.get(args.id, function(err, p) {
p.update(self.params['execution']);
if(!p.isValid()) {
self.model['execution'] = p;
self.render('executions/edit');
} else {
executionRepo.save(p, function() {
self.redirect('/executions');
});
}
});
});

gh.post('/executions/{id}/delete', function(args) {
var self = this;
executionRepo.get(args.id, function(err, p) {
executionRepo.remove(p, function() {
self.redirect('/executions');
});
});
});
5 changes: 5 additions & 0 deletions examples/CRUD/controllers/home.js
@@ -0,0 +1,5 @@
var gh = require('../grasshopper');

gh.get('/', function() {
this.render('index');
});
82 changes: 82 additions & 0 deletions examples/CRUD/controllers/languages.js
@@ -0,0 +1,82 @@
var gh = require('../grasshopper'),
languageRepo = require('../repositories/languages'),
executionRepo = require('../repositories/executions'),
paradigmRepo = require('../repositories/paradigms'),
Language = require('../models').Language;

gh.get('/languages', function() {
var self = this;
languageRepo.all(function(err, p) {
self.model['languages'] = p;
self.render('languages/index');
});
});

gh.get('/languages/add', function() {
this.model['language'] = new Language();
var self = this;
loadDeps(this.model, function() {
self.render('languages/add');
});
});

gh.get('/languages/{id}/edit', function(args) {
var self = this;
languageRepo.get(args.id, function(err, p) {
self.model['language'] = p;
loadDeps(self.model, function() {
self.render('languages/edit');
});
});
});

gh.post('/languages', function() {
var p = new Language().update(this.params['language']);
var self = this;
if(!p.isValid()) {
this.model['language'] = p;
loadDeps(this.model, function() {
self.render('languages/add');
});
} else {
languageRepo.save(p, function() {
self.redirect('/languages');
});
}
});

gh.post('/languages/{id}/update', function(args) {
var self = this;
languageRepo.get(args.id, function(err, p) {
p.update(self.params['language']);
if(!p.isValid()) {
self.model['language'] = p;
loadDeps(self.model, function() {
self.render('languages/edit');
});
} else {
languageRepo.save(p, function() {
self.redirect('/languages');
});
}
});
});

gh.post('/languages/{id}/delete', function(args) {
var self = this;
languageRepo.get(args.id, function(err, p) {
languageRepo.remove(p, function() {
self.redirect('/languages');
});
});
});

function loadDeps(model, cb) {
paradigmRepo.all(function(err, p) {
model['paradigms'] = p;
executionRepo.all(function(err, e) {
model['executions'] = e;
cb();
});
});
}
61 changes: 61 additions & 0 deletions examples/CRUD/controllers/paradigms.js
@@ -0,0 +1,61 @@
var gh = require('../grasshopper'),
paradigmRepo = require('../repositories/paradigms'),
Paradigm = require('../models').Paradigm;

gh.get('/paradigms', function() {
var self = this;
paradigmRepo.all(function(err, p) {
self.model['paradigms'] = p;
self.render('paradigms/index');
});
});

gh.get('/paradigms/add', function() {
this.model['paradigm'] = new Paradigm();
this.render('paradigms/add');
});

gh.get('/paradigms/{id}/edit', function(args) {
var self = this;
paradigmRepo.get(args.id, function(err, p) {
self.model['paradigm'] = p;
self.render('paradigms/edit');
});
});

gh.post('/paradigms', function() {
var p = new Paradigm().update(this.params['paradigm']);
var self = this;
if(!p.isValid()) {
this.model['paradigm'] = p;
this.render('paradigms/add');
} else {
paradigmRepo.save(p, function() {
self.redirect('/paradigms');
});
}
});

gh.post('/paradigms/{id}/update', function(args) {
var self = this;
paradigmRepo.get(args.id, function(err, p) {
p.update(self.params['paradigm']);
if(!p.isValid()) {
self.model['paradigm'] = p;
self.render('paradigms/edit');
} else {
paradigmRepo.save(p, function() {
self.redirect('/paradigms');
});
}
});
});

gh.post('/paradigms/{id}/delete', function(args) {
var self = this;
paradigmRepo.get(args.id, function(err, p) {
paradigmRepo.remove(p, function() {
self.redirect('/paradigms');
});
});
});
40 changes: 40 additions & 0 deletions examples/CRUD/createdb.js
@@ -0,0 +1,40 @@
var couchdb = require('../support/node-couchdb/lib/couchdb'),
client = couchdb.createClient();

client.request('put', '/ghcrud');

client.db('ghcrud').saveDesign('paradigm', {
views: {
all: {
map: function(doc) {
if(doc.Type == 'Paradigm') {
emit(null, doc);
}
}
}
}
});

client.db('ghcrud').saveDesign('execution', {
views: {
all: {
map: function(doc) {
if(doc.Type == 'Execution') {
emit(null, doc);
}
}
}
}
});

client.db('ghcrud').saveDesign('language', {
views: {
all: {
map: function(doc) {
if(doc.Type == 'Language') {
emit(null, doc);
}
}
}
}
});
1 change: 1 addition & 0 deletions examples/CRUD/grasshopper
19 changes: 19 additions & 0 deletions examples/CRUD/layout.html
@@ -0,0 +1,19 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Programming Languages Portal</title>
</head>
<body>
<a href="/">Home</a>
|
<a href="/paradigms">Manage Paradigms</a>
|
<a href="/executions">Manage Executions</a>
|
<a href="/languages">Manage Languages</a>

<p />

<%= include(view) %>
</body>
</html>
4 changes: 4 additions & 0 deletions examples/CRUD/locales.js
@@ -0,0 +1,4 @@
exports['en-us'] = {
'required': 'Value is required.',
'Language.paradigmIds.required': 'Select at least one paradigm.'
};
36 changes: 36 additions & 0 deletions examples/CRUD/models.js
@@ -0,0 +1,36 @@
var gh = require('./grasshopper');

function Paradigm() {
}

Paradigm.prototype.validate = function() {
this.validateRequired('name', false); // Avoid prefix
this.validateRequired('description', false);
};

exports.Paradigm = gh.initModel(Paradigm, 'id', 'name', 'description');

function Execution() {
}

Execution.prototype.validate = function() {
this.validateRequired('name', false); // Avoid prefix
this.validateRequired('description', false);
};

exports.Execution = gh.initModel(Execution, 'id', 'name', 'description');

function Language() {
}

Language.prototype.validate = function() {
this.validateRequired('name', false); // Avoid prefix
this.validateRequired('executionId', false);
this.validateRequired('paradigmIds');
if(!this.static() && !this.dynamic()) {
this.addError('typing', 'Select at least one type system.', false);
}
};

exports.Language = gh.initModel(Language, 'name', 'static',
'dynamic', 'executionId', 'paradigmIds');
24 changes: 24 additions & 0 deletions examples/CRUD/repositories/couchUtil.js
@@ -0,0 +1,24 @@
exports.getValues = function(rows, map) {
var values = [];
rows.forEach(function(row) {
var val = map(row);
val._id = row.value._id;
val._rev = row.value._rev;
values.push(val);
});

return values;
};

exports.getDoc = function(value, map) {
var doc = {}
if(value._id) {
doc._id = value._id;
}
if(value._rev) {
doc._rev = value._rev;
}
doc.Type = value.constructor.name;
map(value, doc);
return doc;
};

0 comments on commit a323bc5

Please sign in to comment.