Skip to content

Commit ca60d25

Browse files
committed
switch back from mers to basic express/mongoose to get better REST
control
1 parent a3a29b4 commit ca60d25

File tree

10 files changed

+262
-57
lines changed

10 files changed

+262
-57
lines changed

app.js

+26-55
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
* Module dependencies.
33
*/
44

5-
var express = require('express'), routes = require('./routes'), http = require('http'), path = require('path'), mers = require('mers');
5+
var express = require('express'), http = require('http'), path = require('path');
6+
var apiContext = '/api/rest/v0.1/';
67

78
var app = express();
89

@@ -17,65 +18,35 @@ app.use(express.methodOverride());
1718
app.use(app.router);
1819
app.use(express.static(path.join(__dirname, 'public')));
1920

20-
// development only
21-
if ('development' === app.get('env')) {
22-
app.use(express.errorHandler());
23-
}
24-
25-
// mongo setup vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
26-
var mongoose = require('mongoose/'), Schema = mongoose.Schema, ObjectId = mongoose.Schema.ObjectId;
21+
//mongo setup
22+
var mongoose = require('mongoose/');
2723
var mongourl;
28-
if (process.env.VCAP_SERVICES) {
29-
// app is running in the cloud
30-
var svcs = JSON.parse(process.env.VCAP_SERVICES);
31-
mongourl = svcs['mongodb'][0].credentials.uri;
32-
} else {
33-
// running locally or not on cloud foundry
34-
mongourl = 'mongodb://localhost/act-rest-db';
24+
25+
if(process.env.VCAP_SERVICES){
26+
//app is running in the cloud
27+
var svcs = JSON.parse(process.env.VCAP_SERVICES);
28+
mongourl = svcs['mongodb'][0].credentials.uri;
29+
}
30+
else{
31+
//running locally or not on cloud foundry
32+
mongourl = 'mongodb://localhost/act-standards-db';
3533
}
3634

37-
var StudentAssessmentsSchema = new Schema({
38-
title : String,
39-
date : Date,
40-
result : String
41-
});
42-
var StudentsSchema = new Schema({
43-
firstName : String,
44-
lastName : String,
45-
birthDate : Date,
46-
assessments : [ StudentAssessmentsSchema ]
47-
});
48-
StudentsSchema.statics.findNameLike = function findNameLike(q, term) {
49-
return this.find({
50-
'firstName' : new RegExp(q.firstName || term, 'i')
51-
});
52-
};
53-
var StudentAssessments = module.exports.StudentAssessments = mongoose.model(
54-
'StudentAssessments', StudentAssessmentsSchema);
55-
var Students = module.exports.Students = mongoose.model('Students',
56-
StudentsSchema);
57-
// mongo setup ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
35+
mongoose.connect(mongourl);
5836

59-
app.use('/api/rest/v0.1', mers({
60-
uri : mongourl,
61-
error : function(err, req, res, next){
62-
console.log(err);
63-
if('CastError' === err.name && 'ObjectId' === err.type) {
64-
res.status(404).send({
65-
status:404,
66-
error:err && err.message
67-
});
68-
} else {
69-
res.status(500).send({
70-
status:500,
71-
error:err && err.message
72-
});
73-
}
74-
}}).rest());
37+
var db = mongoose.connection;
38+
db.on('error', console.error.bind(console, 'connection error:'));
39+
db.once('open', function callback () {
40+
// yay!
41+
});
42+
43+
// development only
44+
if ('development' === app.get('env')) {
45+
app.use(express.errorHandler());
46+
}
7547

76-
77-
app.get('/', routes.index);
48+
var routes = require('./routes')(app, apiContext);
7849

7950
http.createServer(app).listen(app.get('port'), function() {
80-
console.log('Express server listening on port ' + app.get('port'));
51+
console.log('ACT Rest Server listening on port ' + app.get('port'));
8152
});
File renamed without changes.

handlers/learningObjectives.js

+98
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
var utility = require('../utility');
2+
var lom = require('../models/learningObjectives');
3+
var LearningObjectivesModel = lom.LearningObjectivesModel;
4+
5+
exports.list = function(req, res) {
6+
7+
LearningObjectivesModel.find(function(err, learningObjectives) {
8+
if (!err) {
9+
return res.status(200).send(learningObjectives);
10+
} else {
11+
return res.status(500).send(err);
12+
}
13+
});
14+
};
15+
16+
exports.create = function(req, res) {
17+
var learningObjective;
18+
19+
learningObjective = new LearningObjectivesModel({
20+
learningObjectiveId : req.body.learningObjectiveId,
21+
academicSubject : req.body.academicSubject,
22+
description : req.body.description,
23+
objective : req.body.objective,
24+
objectiveGradeLevel : req.body.objectiveGradeLevel
25+
});
26+
27+
learningObjective.save(function(err) {
28+
if (!err) {
29+
res.setHeader('Location', req.protocol + "://" + req.headers.host
30+
+ req.url + (utility.endsWith(req.url, '/') ? "" : "/")
31+
+ learningObjective._id);
32+
res.status(201).send(learningObjective);
33+
} else {
34+
res.status(500).send(err);
35+
}
36+
});
37+
};
38+
39+
exports.show = function(req, res) {
40+
LearningObjectivesModel.findById(req.params.id, function(err,
41+
learningObjective) {
42+
if (!err) {
43+
return res.status(200).send(learningObjective);
44+
} else {
45+
if ('CastError' === err.name && 'ObjectId' === err.type) {
46+
return res.status(404).send();
47+
} else {
48+
return res.status(500).send(err);
49+
}
50+
}
51+
});
52+
};
53+
54+
exports.destroy = function(req, res) {
55+
56+
LearningObjectivesModel.findById(req.params.id, function(err,
57+
learningObjective) {
58+
if (err || learningObjective === null) {
59+
return res.status(404).send();
60+
}
61+
learningObjective.remove(function(err) {
62+
if (!err) {
63+
return res.status(204).send();
64+
} else {
65+
return res.status(500).send(err);
66+
}
67+
});
68+
});
69+
};
70+
71+
exports.update = function(req, res) {
72+
LearningObjectivesModel
73+
.findById(
74+
req.params.id,
75+
function(err, learningObjective) {
76+
learningObjective.learningObjectiveId = req.body.learningObjectiveId,
77+
learningObjective.academicSubject = req.body.academicSubject,
78+
learningObjective.description = req.body.description,
79+
learningObjective.objective = req.body.objective,
80+
learningObjective.objectiveGradeLevel = req.body.objectiveGradeLevel;
81+
if (err || learningObjective === null) {
82+
return res.status(404).send();
83+
}
84+
learningObjective.save(function(err) {
85+
if (!err) {
86+
return res.status(200).send(learningObjective);
87+
} else {
88+
if ('CastError' === err.name
89+
&& 'ObjectId' === err.type) {
90+
return res.status(404).send();
91+
} else {
92+
return res.status(500).send(err);
93+
}
94+
}
95+
return res.send(product);
96+
});
97+
});
98+
};

handlers/students.js

+89
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
var utility = require('../utility');
2+
var sm = require('../models/students');
3+
var StudentsModel = sm.StudentsModel;
4+
5+
exports.list = function(req, res) {
6+
7+
StudentsModel.find(function(err, students) {
8+
if (!err) {
9+
return res.status(200).send(students);
10+
} else {
11+
return res.status(500).send(err);
12+
}
13+
});
14+
};
15+
16+
exports.create = function(req, res) {
17+
var student;
18+
19+
student = new StudentsModel({
20+
firstName : req.body.firstName,
21+
lastName : req.body.lastName,
22+
birthDate : req.body.birthDate
23+
});
24+
25+
student.save(function(err) {
26+
if (!err) {
27+
res.setHeader('Location', req.protocol + "://" + req.headers.host
28+
+ req.url + (utility.endsWith(req.url, '/') ? "" : "/")
29+
+ student._id);
30+
res.status(201).send(student);
31+
} else {
32+
res.status(500).send(err);
33+
}
34+
});
35+
};
36+
37+
exports.show = function(req, res) {
38+
StudentsModel.findById(req.params.id, function(err, student) {
39+
if (!err) {
40+
return res.status(200).send(student);
41+
} else {
42+
if ('CastError' === err.name && 'ObjectId' === err.type) {
43+
return res.status(404).send();
44+
} else {
45+
return res.status(500).send(err);
46+
}
47+
}
48+
});
49+
};
50+
51+
exports.destroy = function(req, res) {
52+
53+
StudentsModel.findById(req.params.id, function(err, student) {
54+
if (err || student === null) {
55+
return res.status(404).send();
56+
}
57+
student.remove(function(err) {
58+
if (!err) {
59+
return res.status(204).send();
60+
} else {
61+
return res.status(500).send(err);
62+
}
63+
});
64+
});
65+
};
66+
67+
exports.update = function(req, res) {
68+
StudentsModel.findById(req.params.id, function(err, student) {
69+
student.firstName = req.body.firstName,
70+
student.lastName = req.body.lastName,
71+
student.birthDate = req.body.birthDate;
72+
73+
if (err || student === null) {
74+
return res.status(404).send();
75+
}
76+
student.save(function(err) {
77+
if (!err) {
78+
return res.status(200).send(student);
79+
} else {
80+
if ('CastError' === err.name && 'ObjectId' === err.type) {
81+
return res.status(404).send();
82+
} else {
83+
return res.status(500).send(err);
84+
}
85+
}
86+
return res.send(product);
87+
});
88+
});
89+
};

models/learningObjectives.js

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
var mongoose = require('mongoose');
2+
3+
var learningObjectivesSchema = mongoose.Schema({
4+
learningObjectiveId : String,
5+
academicSubject : String,
6+
description : String,
7+
objective : String,
8+
objectiveGradeLevel : String
9+
});
10+
11+
exports.LearningObjectivesModel = mongoose.model('LearningObjectivesModel',
12+
learningObjectivesSchema);

models/students.js

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
var mongoose = require('mongoose');
2+
3+
var studentsSchema = mongoose.Schema({
4+
firstName : String,
5+
lastName : String,
6+
birthDate : Date
7+
});
8+
9+
exports.StudentsModel = mongoose.model('StudentsModel', studentsSchema);

package.json

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
"dependencies": {
1111
"express": "~3.3.4",
1212
"jade": "*",
13+
"mongoose": "*",
14+
"underscore": "*",
1315
"mers": "*"
1416
},
1517
"engines": {

routes.js

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
var routes = require('./handlers');
2+
var learningObjectives = require('./handlers/learningObjectives');
3+
var students = require('./handlers/students');
4+
5+
module.exports = function(app, apiContext) {
6+
app.get('/', routes.index);
7+
8+
app.get(apiContext + 'learningObjectives', learningObjectives.list);
9+
app.post(apiContext + 'learningObjectives', learningObjectives.create);
10+
app.get(apiContext + 'learningObjectives/:id', learningObjectives.show);
11+
app.delete(apiContext + 'learningObjectives/:id', learningObjectives.destroy);
12+
app.put(apiContext + 'learningObjectives/:id', learningObjectives.update);
13+
14+
app.get(apiContext + 'students', students.list);
15+
app.post(apiContext + 'students', students.create);
16+
app.get(apiContext + 'students/:id', students.show);
17+
app.delete(apiContext + 'students/:id', students.destroy);
18+
app.put(apiContext + 'students/:id', students.update);
19+
};

utility/index.js

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
2+
exports.endsWith = function endsWith(str, suffix) {
3+
return str.indexOf(suffix, str.length - suffix.length) !== -1;
4+
};

views/index.jade

+3-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ block content
55
p: a(href="https://github.com/act-org/act-rest-api") source
66
p API listing
77
ul
8+
li: a(href="#{apiContext}learningObjectives") #{apiContext}learningObjectives (GET, POST)
9+
li: a(href="#{apiContext}learningObjectives/1") #{apiContext}learningObjectives/{id} (GET, PUT, DELETE)
810
li: a(href="#{apiContext}students") #{apiContext}students (GET, POST)
9-
li: a(href="#{apiContext}students/1") #{apiContext}students/{id} (GET, PUT, DELETE)
10-
li: a(href="#{apiContext}students/finder/findNameLike/John") #{apiContext}students/finder/findNameLike/{name} (GET)
11+
li: a(href="#{apiContext}students/1") #{apiContext}students/{id} (GET, PUT, DELETE)

0 commit comments

Comments
 (0)