Skip to content

Instantly share code, notes, and snippets.

@brianc
Last active December 20, 2015 16:59
Show Gist options
  • Save brianc/6165368 to your computer and use it in GitHub Desktop.
Save brianc/6165368 to your computer and use it in GitHub Desktop.
//move queries into a simple object
//to make the more explicit
var queries = {
_extend: function(query) {
query.exec = function(callback) {
db.query(query.query, query.values, callback);
}
}
getRestaurant: (restaurantId) {
var query = {
type: 'select'
, table: 'restaurants'
, columns: ['*']
, where: {id: restaurantId}
};
return this._extend(db.builder.sql(query));
},
getCategoriesForRestaurant: (restaurantId) {
var query = {
type: 'select'
, table: 'categories'
, columns: ['*']
, where: {restaurant_id: restaurantId}
, order: {order: 'asc'}
}
return this._extend(db.builder.sql(query));
},
getItemsForRestaurant: (restaurantId) {
var query = {
type: 'select'
, table: 'items'
, columns: ['*']
, where: {restaurant_id: restaurantId}
, order: {order: 'asc'}
}
return this._extend(db.builder.sql(query));
}
};
var ok = require('okay');
module.exports.menu = function(req, res) {
//introduce variable to describe query parameters
var restaurantId = parseInt(req.params.id);
var tasks = {
getRestaurant: function(callback) {
var sql = queries.getRestaurant(restaurantId);
sql.exec(ok(callback, function(results) {
var data = {
restaurant: results[0],
categories: null
items: null
};
return callback(null, data);
}));
}
, getCategories: function(data, callback) {
var sql = queries.getCategoriesForRestaurant(restaurantId);
sql.exec(ok(callback, function(results) {
data.categories = results;
return callback(null, data);
}));
}
, getItems: function(data, callback) {
var sql = queries.getCategoriesForRestaurant(restaurantId);
sql.exec(ok(callback, function(results) {
data.items = results;
return callback(null, data);
}));
}
}
var done = function(error, data) {
if (error) return res.error(errors.internal.DB_FAILURE, error, callback);
var menu = [];
var categoryIdMenuIndex = {};
for(var i=0; i<data.categories.length; i++) {
var category = data.categories[i];
category.items = [];
menu.push(category);
categoryIdMenuIndex[category.id] = i;
}
for(var i=0; i<data.items.length; i ++) {
var item = data.items[i];
var category = menu[categoryIdMenuIndex[item.category_id]];
category.items.push(item);
}
res.render('menu', {restaurant: data.restaurant, menu: menu}, function(error, html) {
if (error) return res.error(errors.internal.UNKNOWN, error);
res.render('index', {content: html}, function(error, html) {
if (error) return res.error(errors.internal.UNKNOWN, error);
return res.send(html);
})
});
}
utils.async.waterfall(tasks, done);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment