Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 73 additions & 4 deletions lib/api/devicestatus/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ function configure (app, wares, ctx, env) {
api.use(wares.jsonParser);
// also support url-encoded content-type
api.use(wares.urlencodedParser);
// text body types get handled as raw buffer stream
// Add format extension support
api.use(wares.extensions(['json', 'csv', 'txt', 'tsv']));

api.use(ctx.authorization.isPermitted('api:devicestatus:read'));

Expand All @@ -41,6 +42,46 @@ function configure (app, wares, ctx, env) {
}
}

/**
* @function formatWithSeparator
* Format devicestatus data as CSV/TSV
*/
function formatWithSeparator(data, separator) {
if (data === null || data.constructor !== Array || data.length == 0) return "";

// Flatten the devicestatus data for CSV export
var outputdata = [];
data.forEach(function(d) {
var devicestatus = {
"_id": d._id || '',
"device": d.device || '',
"created_at": d.created_at || '',
"mills": d.mills || '',
"uploaderBattery": d.uploaderBattery || '',
"pump": JSON.stringify(d.pump || ''),
"openaps": JSON.stringify(d.openaps || ''),
"loop": JSON.stringify(d.loop || '')
};
outputdata.push(devicestatus);
});

if (outputdata.length === 0) return "";

var fields = Object.keys(outputdata[0]);
var replacer = function(key, value) {
return value === null ? '' : value;
};
// Create header row
var csv = [fields.join(separator)];
// Add data rows
csv = csv.concat(outputdata.map(function(row) {
return fields.map(function(fieldName) {
return JSON.stringify(row[fieldName], replacer);
}).join(separator);
}));
return csv.join('\r\n');
}

// List settings available
api.get('/devicestatus/', function(req, res) {
var q = req.query;
Expand All @@ -51,19 +92,47 @@ function configure (app, wares, ctx, env) {
const inMemoryData = ctx.cache.devicestatus ? ctx.cache.devicestatus : [];
const canServeFromMemory = inMemoryData.length >= q.count && Object.keys(q).length == 1 ? true : false;

var results;
if (canServeFromMemory) {
const sorted = _.sortBy(inMemoryData, function(item) {
return -item.mills;
});

return res.json(processDates(_take(sorted, q.count)));
results = processDates(_take(sorted, q.count));
return serveResponse(req, res, results);
}

ctx.devicestatus.list(q, function(err, results) {
return res.json(processDates(results));
if (err) {
return res.sendJSONStatus(res, consts.HTTP_INTERNAL_ERROR, 'Mongo Error', err);
}
results = processDates(results);
return serveResponse(req, res, results);
});
});

function serveResponse(req, res, results) {
return res.format({
'text/plain': function() {
var output = formatWithSeparator(results, "\t");
res.send(output);
},
'text/tab-separated-values': function() {
var output = formatWithSeparator(results, '\t');
res.send(output);
},
'text/csv': function() {
var output = formatWithSeparator(results, ',');
res.send(output);
},
'application/json': function() {
res.json(results);
},
'default': function() {
res.json(results);
}
});
}

function config_authed (app, api, wares, ctx) {

function doPost (req, res) {
Expand Down
73 changes: 69 additions & 4 deletions lib/api/food/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,80 @@ function configure (app, wares, ctx) {
api.use(wares.jsonParser);
// also support url-encoded content-type
api.use(wares.urlencodedParser);
// text body types get handled as raw buffer stream
// shortcut to use extension to specify output content-type
// Add format extension support
api.use(wares.extensions(['json', 'csv', 'txt', 'tsv']));

api.use(ctx.authorization.isPermitted('api:food:read'));

/**
* @function formatWithSeparator
* Format food data as CSV/TSV
*/
function formatWithSeparator(data, separator) {
if (data === null || data.constructor !== Array || data.length == 0) return "";

// Flatten the food data for CSV export
var outputdata = [];
data.forEach(function(f) {
var food = {
"_id": f._id || '',
"name": f.name || '',
"category": f.category || '',
"subcategory": f.subcategory || '',
"portions": JSON.stringify(f.portions || ''),
"created_at": f.created_at || '',
"carbs": f.carbs || '',
"protein": f.protein || '',
"fat": f.fat || '',
"energy": f.energy || ''
};
outputdata.push(food);
});

if (outputdata.length === 0) return "";

var fields = Object.keys(outputdata[0]);
var replacer = function(key, value) {
return value === null ? '' : value;
};
// Create header row
var csv = [fields.join(separator)];
// Add data rows
csv = csv.concat(outputdata.map(function(row) {
return fields.map(function(fieldName) {
return JSON.stringify(row[fieldName], replacer);
}).join(separator);
}));
return csv.join('\r\n');
}

// List foods available
api.get('/food/', function(req, res) {
ctx.food.list(function (err, attribute) {
return res.json(attribute);
ctx.food.list(function (err, results) {
if (err) {
return res.sendJSONStatus(res, consts.HTTP_INTERNAL_ERROR, 'Mongo Error', err);
}

return res.format({
'text/plain': function() {
var output = formatWithSeparator(results, "\t");
res.send(output);
},
'text/tab-separated-values': function() {
var output = formatWithSeparator(results, '\t');
res.send(output);
},
'text/csv': function() {
var output = formatWithSeparator(results, ',');
res.send(output);
},
'application/json': function() {
res.json(results);
},
'default': function() {
res.json(results);
}
});
});
});

Expand Down
69 changes: 66 additions & 3 deletions lib/api/profile/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,56 @@ function configure (app, wares, ctx) {
api.use(wares.jsonParser);
// also support url-encoded content-type
api.use(wares.urlencodedParser);
// text body types get handled as raw buffer stream
// Add format extension support
api.use(wares.extensions(['json', 'csv', 'txt', 'tsv']));

api.use(ctx.authorization.isPermitted('api:profile:read'));

/**
* @function formatWithSeparator
* Format profile data as CSV/TSV
*/
function formatWithSeparator(data, separator) {
if (data === null || data.constructor !== Array || data.length == 0) return "";

// Flatten the profile data for CSV export
var outputdata = [];
data.forEach(function(p) {
var profile = {
"_id": p._id || '',
"defaultProfile": p.defaultProfile || '',
"created_at": p.created_at || '',
"startDate": p.startDate || '',
"mills": p.mills || '',
"units": p.units || '',
"dia": p.dia || '',
"timezone": p.timezone || ''
};
outputdata.push(profile);
});

if (outputdata.length === 0) return "";

var fields = Object.keys(outputdata[0]);
var replacer = function(key, value) {
return value === null ? '' : value;
};
// Create header row
var csv = [fields.join(separator)];
// Add data rows
csv = csv.concat(outputdata.map(function(row) {
return fields.map(function(fieldName) {
return JSON.stringify(row[fieldName], replacer);
}).join(separator);
}));
return csv.join('\r\n');
}

/**
* @function query_models
* Perform the standard query logic, translating API parameters into mongo
* db queries in a fairly regimented manner.
* This middleware executes the query, returning the results as JSON
* This middleware executes the query, returning the results as JSON/CSV
*/
function query_models (req, res, next) {
var query = req.query;
Expand All @@ -35,7 +75,30 @@ function configure (app, wares, ctx) {

// perform the query
ctx.profile.list_query(query, function payload(err, profiles) {
return res.json(profiles);
if (err) {
return res.sendJSONStatus(res, consts.HTTP_INTERNAL_ERROR, 'Mongo Error', err);
}

return res.format({
'text/plain': function() {
var output = formatWithSeparator(profiles, "\t");
res.send(output);
},
'text/tab-separated-values': function() {
var output = formatWithSeparator(profiles, '\t');
res.send(output);
},
'text/csv': function() {
var output = formatWithSeparator(profiles, ',');
res.send(output);
},
'application/json': function() {
res.json(profiles);
},
'default': function() {
res.json(profiles);
}
});
});
}

Expand Down
Loading
Loading