add sample for ch10s03 lab
This commit is contained in:
parent
c2f929499e
commit
e5e3675beb
6 changed files with 349 additions and 0 deletions
36
todo-backend/app.js
Normal file
36
todo-backend/app.js
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
var restify = require('restify');
|
||||||
|
|
||||||
|
var controller = require('./controllers/items');
|
||||||
|
var serverinfo = require('./controllers/serverinfo');
|
||||||
|
|
||||||
|
var db = require('./models/db');
|
||||||
|
var model = require('./models/items');
|
||||||
|
|
||||||
|
model.connect(db.params, function(err) {
|
||||||
|
if (err) throw err;
|
||||||
|
});
|
||||||
|
|
||||||
|
var server = restify.createServer()
|
||||||
|
.use(restify.fullResponse())
|
||||||
|
.use(restify.queryParser())
|
||||||
|
.use(restify.bodyParser())
|
||||||
|
.use(restify.CORS());;
|
||||||
|
|
||||||
|
controller.context(server, '/todo/api', model);
|
||||||
|
serverinfo.context(server, '/todo/api');
|
||||||
|
|
||||||
|
var port = process.env.PORT || 8080;
|
||||||
|
server.listen(port, function (err) {
|
||||||
|
if (err)
|
||||||
|
console.error(err);
|
||||||
|
else
|
||||||
|
console.log('App is ready at : ' + port);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
process.on('uncaughtException', function (err) {
|
||||||
|
console.error(JSON.parse(JSON.stringify(err, ['stack', 'message', 'inner'], 2)))
|
||||||
|
});
|
||||||
|
*/
|
||||||
|
|
||||||
131
todo-backend/controllers/items.js
Normal file
131
todo-backend/controllers/items.js
Normal file
|
|
@ -0,0 +1,131 @@
|
||||||
|
|
||||||
|
var model = undefined;
|
||||||
|
|
||||||
|
exports.context = function(server, path, itemsModel) {
|
||||||
|
if (!server)
|
||||||
|
done('has to provide a restify server object');
|
||||||
|
|
||||||
|
var context = "/items";
|
||||||
|
if (path)
|
||||||
|
context = path + context;
|
||||||
|
|
||||||
|
server.get(context + '/', this.list);
|
||||||
|
server.get(context + '/:id', this.read);
|
||||||
|
server.get(context + '-count', this.count);
|
||||||
|
server.post(context + '/', this.save);
|
||||||
|
server.del(context + '/:id', this.destroy);
|
||||||
|
|
||||||
|
model = itemsModel;
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.list = function(req, res, next) {
|
||||||
|
var page_no = req.query.page || 1;
|
||||||
|
var sortField = req.query.sortFields || "id";
|
||||||
|
var sortDirection = req.query.sortDirections || "asc";
|
||||||
|
|
||||||
|
model.listAll(page_no, sortField, sortDirection, function(err, items) {
|
||||||
|
if (err) {
|
||||||
|
res.send(err);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (items) {
|
||||||
|
model.countAll(function(err, n) {
|
||||||
|
if (err) {
|
||||||
|
res.send(err);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (n) {
|
||||||
|
var page = {
|
||||||
|
"currentPage" : page_no,
|
||||||
|
"list" : items,
|
||||||
|
"pageSize" : 10,
|
||||||
|
"sortDirections" : sortDirection,
|
||||||
|
"sortFields" : sortField,
|
||||||
|
"totalResults" : n
|
||||||
|
};
|
||||||
|
res.json(page);
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
res.send(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.read = function(req, res, next) {
|
||||||
|
var key = req.params.id;
|
||||||
|
model.read(key, function(err, item) {
|
||||||
|
if (err) {
|
||||||
|
res.send(err);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (item) {
|
||||||
|
res.json(item);
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
res.send(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
exports.count = function(req, res, next) {
|
||||||
|
model.countAll(function(err, n) {
|
||||||
|
if (err) {
|
||||||
|
res.send(err);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var page = {
|
||||||
|
count: n
|
||||||
|
};
|
||||||
|
res.json(page)
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
exports.save = function(req, res, next) {
|
||||||
|
if (req.params.id) {
|
||||||
|
model.update(req.params.id, req.params.description, req.params.done, function(err, item) {
|
||||||
|
if (err) {
|
||||||
|
res.send(err);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
res.json(item);
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
model.create(req.params.description, req.params.done, function(err, item) {
|
||||||
|
if (err) {
|
||||||
|
res.send(err);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
res.json(item);
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
exports.destroy = function(req, res, next) {
|
||||||
|
if (req.params.id) {
|
||||||
|
model.destroy(req.params.id, function(err, item) {
|
||||||
|
if (err) {
|
||||||
|
res.send(err);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
res.json(item);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
29
todo-backend/controllers/serverinfo.js
Normal file
29
todo-backend/controllers/serverinfo.js
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
var os = require('os');
|
||||||
|
|
||||||
|
exports.context = function(server, path) {
|
||||||
|
if (!server)
|
||||||
|
done('has to provide a restify server object');
|
||||||
|
|
||||||
|
server.get(path + '/host', this.serverInfo);
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.serverInfo = function(req, res, next) {
|
||||||
|
var address;
|
||||||
|
var ifaces = os.networkInterfaces();
|
||||||
|
|
||||||
|
for (var dev in ifaces) {
|
||||||
|
var iface = ifaces[dev].filter(function(details) {
|
||||||
|
return details.family === 'IPv4' && details.internal === false;
|
||||||
|
});
|
||||||
|
if (iface.length > 0)
|
||||||
|
address = iface[0].address;
|
||||||
|
}
|
||||||
|
|
||||||
|
var reply = {
|
||||||
|
ip: address,
|
||||||
|
hostname: os.hostname()
|
||||||
|
};
|
||||||
|
res.json(reply);
|
||||||
|
next();
|
||||||
|
};
|
||||||
|
|
||||||
10
todo-backend/models/db.js
Normal file
10
todo-backend/models/db.js
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
|
||||||
|
module.exports.params = {
|
||||||
|
dbname: process.env.DATABASE_NAME,
|
||||||
|
username: process.env.DATABASE_USER,
|
||||||
|
password: process.env.DATABASE_PASSWORD,
|
||||||
|
params: {
|
||||||
|
host: process.env.DATABASE_SVC,
|
||||||
|
dialect: 'mysql',
|
||||||
|
}
|
||||||
|
};
|
||||||
127
todo-backend/models/items.js
Normal file
127
todo-backend/models/items.js
Normal file
|
|
@ -0,0 +1,127 @@
|
||||||
|
var Sequelize = require("sequelize");
|
||||||
|
|
||||||
|
var Item = undefined;
|
||||||
|
|
||||||
|
module.exports.connect = function(params, callback) {
|
||||||
|
var sequlz = new Sequelize(
|
||||||
|
params.dbname, params.username, params.password,
|
||||||
|
params.params);
|
||||||
|
Item = sequlz.define('Item', {
|
||||||
|
id: { type: Sequelize.BIGINT,
|
||||||
|
primaryKey: true, unique: true, allowNull: false,
|
||||||
|
autoIncrement: true },
|
||||||
|
description: { type: Sequelize.STRING,
|
||||||
|
allowNull: true },
|
||||||
|
done: { type: Sequelize.BOOLEAN,
|
||||||
|
allowNull: true }
|
||||||
|
}, {
|
||||||
|
timestamps: false,
|
||||||
|
freezeTableName: true
|
||||||
|
});
|
||||||
|
|
||||||
|
if (process.env.DATABASE_INIT == 'true') {
|
||||||
|
Item.sync({ force: true }).then(function() {
|
||||||
|
callback();
|
||||||
|
}).catch(function(err) {
|
||||||
|
callback(err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.disconnect = function(callback) {
|
||||||
|
//XXX shouln'd to something to close or release the db connection?
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.create = function(description, done, callback) {
|
||||||
|
Item.create({
|
||||||
|
//id: id,
|
||||||
|
description: description,
|
||||||
|
done: (done) ? true : false
|
||||||
|
}).then(function(item) {
|
||||||
|
callback(null, item);
|
||||||
|
}).catch(function(err) {
|
||||||
|
callback(err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.update = function(key, description, done, callback) {
|
||||||
|
Item.find({ where:{ id: key } }).then(function(item) {
|
||||||
|
if (!item) {
|
||||||
|
callback(new Error("Nothing found for key " + key));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
item.updateAttributes({
|
||||||
|
description: description,
|
||||||
|
done: (done) ? true : false
|
||||||
|
}).then(function() {
|
||||||
|
callback(null, item);
|
||||||
|
}).error(function(err) {
|
||||||
|
callback(err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}).catch(function(err) {
|
||||||
|
callback(err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
exports.read = function(key, callback) {
|
||||||
|
Item.find({ where:{ id: key } }).then(function(item) {
|
||||||
|
if (!item) {
|
||||||
|
callback(new Error("Nothing found for key " + key));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
//XXX why recreating the item object?
|
||||||
|
callback(null, {
|
||||||
|
id: item.id,
|
||||||
|
description: item.description,
|
||||||
|
done: item.done
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}).catch(function(err) {
|
||||||
|
callback(err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.destroy = function(key, callback) {
|
||||||
|
Item.find({ where:{ id: key } }).then(function(item) {
|
||||||
|
if (!item) {
|
||||||
|
callback(new Error("Nothing found for " + key));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
item.destroy().then(function() {
|
||||||
|
callback(null, item);
|
||||||
|
}).error(function(err) {
|
||||||
|
callback(err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}).catch(function(err) {
|
||||||
|
callback(err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.countAll = function(callback) {
|
||||||
|
Item.findAll({
|
||||||
|
attributes: [[Sequelize.fn('COUNT', Sequelize.col('id')), 'no_items']]
|
||||||
|
}).then(function(n) {
|
||||||
|
callback(null, n[0].get('no_items'));
|
||||||
|
}).catch(function(err) {
|
||||||
|
callback(err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.listAll = function(page, sortField, sortDirection, callback) {
|
||||||
|
Item.findAll({ offset: 10 * (page - 1), limit: 10, order: [[sortField, sortDirection]] }).then(function(items) {
|
||||||
|
var theitems = [];
|
||||||
|
items.forEach(function(item) {
|
||||||
|
//XXX why recreating the item objects for theitems?
|
||||||
|
theitems.push({
|
||||||
|
id: item.id, description: item.description, done: item.done });
|
||||||
|
});
|
||||||
|
callback(null, theitems);
|
||||||
|
}).catch(function(err) {
|
||||||
|
callback(err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
16
todo-backend/package.json
Normal file
16
todo-backend/package.json
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
{
|
||||||
|
"name": "todo-single",
|
||||||
|
"description": "single container version of the todoapp",
|
||||||
|
"version": "0.0.2",
|
||||||
|
"private": true,
|
||||||
|
"author": "Red Hat Training",
|
||||||
|
"license": "ASL",
|
||||||
|
"scripts": {
|
||||||
|
"start": "node app.js"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"restify": "4.0.3",
|
||||||
|
"sequelize": "3.14.2",
|
||||||
|
"mysql": "2.9.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue