Skip to content

Commit ab6b9c8

Browse files
committed
Initial commit
0 parents  commit ab6b9c8

File tree

10 files changed

+350
-0
lines changed

10 files changed

+350
-0
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
node_modules

.tm_properties

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
softWrap = true
2+
tabSize = 2
3+
softTabs = true

README.md

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# node-express-postgres-restful
2+
3+
> Sample application for a node/express RESTful application backed by postgresql
4+
5+
```
6+
npm install
7+
```

app.js

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
var express = require('express');
2+
var expressJwt = require('express-jwt');
3+
var path = require('path');
4+
var logger = require('morgan');
5+
var cookieParser = require('cookie-parser');
6+
var bodyParser = require('body-parser');
7+
var unless = require('express-unless');
8+
9+
var routes = require('./routes/api');
10+
11+
var app = express();
12+
13+
app.set('secret', 'SECRET');
14+
15+
app.use(logger('dev'));
16+
app.use(bodyParser.json());
17+
app.use(bodyParser.urlencoded({ extended: false }));
18+
app.use(cookieParser());
19+
20+
// Routing
21+
app.use('/api', routes);
22+
23+
// catch 404 and forward to error handler
24+
app.use(function(req, res, next) {
25+
var err = new Error('Not Found');
26+
err.status = 404;
27+
next(err);
28+
});
29+
30+
// error handlers
31+
32+
// development error handler
33+
// will print stacktrace
34+
if (app.get('env') === 'development') {
35+
app.use(function(err, req, res, next) {
36+
res.status(err.status || 500);
37+
res.render('error', {
38+
message: err.message,
39+
error: err
40+
});
41+
});
42+
}
43+
44+
// production error handler
45+
// no stacktraces leaked to user
46+
app.use(function(err, req, res, next) {
47+
res.status(err.status || 500);
48+
console.log('status ' + err.status);
49+
/*res.render('error', {
50+
message: err.message,
51+
error: {}
52+
});*/
53+
res.send();
54+
});
55+
56+
57+
module.exports = app;

bin/www

+90
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
#!/usr/bin/env node
2+
3+
/**
4+
* Module dependencies.
5+
*/
6+
7+
var app = require('../app');
8+
var debug = require('debug')('cadre-test:server');
9+
var http = require('http');
10+
11+
/**
12+
* Get port from environment and store in Express.
13+
*/
14+
15+
var port = normalizePort(process.env.PORT || '3000');
16+
app.set('port', port);
17+
18+
/**
19+
* Create HTTP server.
20+
*/
21+
22+
var server = http.createServer(app);
23+
24+
/**
25+
* Listen on provided port, on all network interfaces.
26+
*/
27+
28+
server.listen(port);
29+
server.on('error', onError);
30+
server.on('listening', onListening);
31+
32+
/**
33+
* Normalize a port into a number, string, or false.
34+
*/
35+
36+
function normalizePort(val) {
37+
var port = parseInt(val, 10);
38+
39+
if (isNaN(port)) {
40+
// named pipe
41+
return val;
42+
}
43+
44+
if (port >= 0) {
45+
// port number
46+
return port;
47+
}
48+
49+
return false;
50+
}
51+
52+
/**
53+
* Event listener for HTTP server "error" event.
54+
*/
55+
56+
function onError(error) {
57+
if (error.syscall !== 'listen') {
58+
throw error;
59+
}
60+
61+
var bind = typeof port === 'string'
62+
? 'Pipe ' + port
63+
: 'Port ' + port;
64+
65+
// handle specific listen errors with friendly messages
66+
switch (error.code) {
67+
case 'EACCES':
68+
console.error(bind + ' requires elevated privileges');
69+
process.exit(1);
70+
break;
71+
case 'EADDRINUSE':
72+
console.error(bind + ' is already in use');
73+
process.exit(1);
74+
break;
75+
default:
76+
throw error;
77+
}
78+
}
79+
80+
/**
81+
* Event listener for HTTP server "listening" event.
82+
*/
83+
84+
function onListening() {
85+
var addr = server.address();
86+
var bind = typeof addr === 'string'
87+
? 'pipe ' + addr
88+
: 'port ' + addr.port;
89+
debug('Listening on ' + bind);
90+
}

models/index.js

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
"use strict";
2+
3+
var fs = require("fs");
4+
var path = require("path");
5+
var Sequelize = require("sequelize");
6+
var env = process.env.NODE_ENV || "development";
7+
//var config = require(__dirname + '/../config/config.json')[env];
8+
var sequelize = new Sequelize("postgres", "nik", null, {
9+
dialect: 'postgres',
10+
native: true
11+
});
12+
var db = {};
13+
14+
// Change to true to update the model in the database.
15+
// NOTE: This will erase your data.
16+
sequelize.sync({force: false});
17+
18+
fs
19+
.readdirSync(__dirname)
20+
.filter(function(file) {
21+
return (file.indexOf(".") !== 0) && (file !== "index.js");
22+
})
23+
.forEach(function(file) {
24+
var model = sequelize.import(path.join(__dirname, file));
25+
db[model.name] = model;
26+
});
27+
28+
Object.keys(db).forEach(function(modelName) {
29+
if ("associate" in db[modelName]) {
30+
db[modelName].associate(db);
31+
}
32+
});
33+
34+
db.sequelize = sequelize;
35+
db.Sequelize = Sequelize;
36+
37+
module.exports = db;

models/task.js

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
"use strict";
2+
3+
module.exports = function(sequelize, DataTypes) {
4+
var Task = sequelize.define("Task", {
5+
title: DataTypes.STRING
6+
}, {
7+
classMethods: {
8+
associate: function(models) {
9+
Task.belongsTo(models.User, {
10+
onDelete: "CASCADE",
11+
foreignKey: {
12+
allowNull: false
13+
}
14+
});
15+
}
16+
}
17+
});
18+
19+
return Task;
20+
};

models/user.js

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
"use strict";
2+
3+
module.exports = function(sequelize, DataTypes) {
4+
var User = sequelize.define("User", {
5+
username: DataTypes.STRING
6+
}, {
7+
classMethods: {
8+
associate: function(models) {
9+
User.hasMany(models.Task)
10+
}
11+
}
12+
});
13+
14+
return User;
15+
};

package.json

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{
2+
"name": "node-express-postgress-restful",
3+
"version": "0.0.0",
4+
"private": true,
5+
"scripts": {
6+
"start": "NODE_ENV=development supervisor ./bin/www"
7+
},
8+
"dependencies": {
9+
"body-parser": "^1.13.3",
10+
"cookie-parser": "^1.3.5",
11+
"debug": "^2.2.0",
12+
"express": "^4.13.3",
13+
"express-jwt": "^3.1.0",
14+
"express-unless": "^0.3.0",
15+
"jsonwebtoken": "^5.4.1",
16+
"morgan": "^1.6.1",
17+
"pg": "^4.4.3",
18+
"pg-hstore": "^2.3.2",
19+
"pg-native": "^1.9.0",
20+
"sequelize": "^3.13.0",
21+
"sequelize-cli": "^2.1.0"
22+
}
23+
}

routes/api.js

+97
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
var models = require('../models');
2+
var express = require('express');
3+
var router = express.Router();
4+
5+
/* GET all users */
6+
router.get('/users', function(req, res, next) {
7+
models.User.findAll().then(function(users) {
8+
res.send(users);
9+
});
10+
});
11+
12+
/* POST a new user */
13+
router.post('/user', function(req, res, next) {
14+
models.User.create(req.body).then(function() {
15+
res.send({'success': true});
16+
}, function() {
17+
res.send({'success': false});
18+
});
19+
});
20+
21+
/* GET one user */
22+
router.get('/user/:id', function(req, res, next) {
23+
if (!req.user) {
24+
res.status(401).send();
25+
}
26+
models.User.findOne({
27+
where: {id: req.params.id}
28+
}).then(function(user) {
29+
res.send(user);
30+
}, function() {
31+
res.send({'success': false});
32+
});
33+
});
34+
35+
/* PUT an update to one user */
36+
router.put('/user/:id', function(req, res, next) {
37+
models.User.update(req.body, {
38+
where: {id: req.params.id}
39+
}).then(function() {
40+
res.send({'success': true});
41+
}, function() {
42+
res.send({'success': false});
43+
});
44+
});
45+
46+
/* GET all tasks */
47+
router.get('/tasks', function(req, res, next) {
48+
models.Task.findAll().then(function(tasks) {
49+
res.send(tasks);
50+
}, function() {
51+
res.send({'success': false});
52+
});
53+
});
54+
55+
/* POST a new task */
56+
router.post('/user', function(req, res, next) {
57+
models.Task.create(req.body).then(function() {
58+
res.send({'success': true});
59+
}, function() {
60+
res.send({'success': false});
61+
});
62+
});
63+
64+
/* GET one task */
65+
router.get('/task/:id', function(req, res, next) {
66+
models.Task.findOne({
67+
where: {id: req.params.id}
68+
}).then(function(task) {
69+
res.send(task);
70+
}, function() {
71+
res.send({'success': false});
72+
});
73+
});
74+
75+
/* PUT an update to one task */
76+
router.put('/task/:id', function(req, res, next) {
77+
models.Task.update(req.body, {
78+
where: {id: req.params.id}
79+
}).then(function() {
80+
res.send({'success': true});
81+
}, function() {
82+
res.send({'success': false});
83+
});
84+
});
85+
86+
/* GET all users with their tasks */
87+
router.get('/users/tasks', function(req, res, next) {
88+
models.User.findAll({
89+
include: [ models.Task ]
90+
}).then(function(users) {
91+
res.send(users);
92+
}, function() {
93+
res.send({'success': false});
94+
});
95+
});
96+
97+
module.exports = router;

0 commit comments

Comments
 (0)