diff --git a/package.json b/package.json index 8d7d1f36d8..b4accf98a9 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,9 @@ "validator": "~1.5.1", "nodemailer": "~0.5.2", "grunt-cli": "~0.1.9", - "paypal-ipn": "~1.0.1" + "paypal-ipn": "~1.0.1", + "express-csv": "~0.6.0", + "moment": "2.4.0" }, "private": true, "subdomain": "habitrpg", diff --git a/public/js/app.js b/public/js/app.js index 261931989f..cfc78abded 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -61,6 +61,10 @@ window.habitrpg = angular.module('habitrpg', url: "/profile", templateUrl: "partials/options.profile.profile.html" }) + .state('options.profile.data', { + url: "/profile/data", + templateUrl: "partials/options.profile.data.html" + }) // Options > Groups .state('options.social', { diff --git a/src/controllers/dataexport.js b/src/controllers/dataexport.js new file mode 100644 index 0000000000..6c7e71a58b --- /dev/null +++ b/src/controllers/dataexport.js @@ -0,0 +1,51 @@ +var _ = require('lodash'); +var csv = require('express-csv'); +var User = require('../models/user').model; +var nconf = require('nconf'); +var moment = require('moment'); +var dataexport = module.exports; + + +/* + ------------------------------------------------------------------------ + Data export + ------------------------------------------------------------------------ +*/ + +dataexport.history = function(req, res) { + var user = res.locals.user; + var output = [ + ["Task Name", "Task ID", "Task Type", "Date", "Value"] + ]; + _.each(user.tasks, function(task) { + _.each(task.history, function(history) { + output.push( + [task.text, task.id, task.type, moment(history.date).format("MM-DD-YYYY HH:mm:ss"), history.value] + ); + }); + }); + return res.csv(output); +} + +dataexport.auth = function(req, res, next) { //[todo] there is probably a more elegant way of doing this... + var uid; + uid = req.session.userId; + if (!(req.session && req.session.userId)) { + return res.json(401, "You must be logged in."); + } + return User.findOne({ + _id: uid, + }, function(err, user) { + if (err) { + return res.json(500, { + err: err + }); + } + if (_.isEmpty(user)) { + return res.json(401, "No user found."); + } + + res.locals.user = user; + return next(); + }); +}; diff --git a/src/routes/api.js b/src/routes/api.js index 7f0ef08b3f..4eaaa796c2 100644 --- a/src/routes/api.js +++ b/src/routes/api.js @@ -4,6 +4,7 @@ var user = require('../controllers/user'); var groups = require('../controllers/groups'); var auth = require('../controllers/auth'); var challenges = require('../controllers/challenges'); +var dataexport = require('../controllers/dataexport'); var nconf = require('nconf'); /* @@ -25,6 +26,9 @@ router.get('/status', function(req, res) { }); }); +/* Data export */ +router.get('/export/history',auth.auth,dataexport.history); //[todo] encode data output options in the data controller and use these to build routes + /* Scoring*/ router.post('/user/task/:id/:direction', auth.auth, cron, user.scoreTask); router.post('/user/tasks/:id/:direction', auth.auth, cron, user.scoreTask); diff --git a/src/routes/dataexport.js b/src/routes/dataexport.js new file mode 100644 index 0000000000..9efdd39bf9 --- /dev/null +++ b/src/routes/dataexport.js @@ -0,0 +1,9 @@ +var express = require('express'); +var router = new express.Router(); +var dataexport = require('../controllers/dataexport'); +var nconf = require('nconf'); + +/* Data export */ +router.get('/history.csv',dataexport.auth,dataexport.history); //[todo] encode data output options in the data controller and use these to build routes + +module.exports = router; \ No newline at end of file diff --git a/src/server.js b/src/server.js index 6c4a8f8feb..f0daa02a80 100644 --- a/src/server.js +++ b/src/server.js @@ -116,6 +116,7 @@ if ("development" === app.get("env")) { app.use(require('./routes/pages').middleware); app.use(require('./routes/auth').middleware); app.use('/api/v1', require('./routes/api').middleware); +app.use('/export', require('./routes/dataexport').middleware); app.use(require('./controllers/deprecated').middleware); server = http.createServer(app).listen(app.get("port"), function() { return console.log("Express server listening on port " + app.get("port")); diff --git a/views/options/profile.jade b/views/options/profile.jade index 7ae3f23b01..d3dcc4cc7c 100644 --- a/views/options/profile.jade +++ b/views/options/profile.jade @@ -121,6 +121,9 @@ script(id='partials/options.profile.profile.html', type='text/ng-template') a(ng-click='removeWebsite($index)') i.icon-remove +script(id='partials/options.profile.data.html', type="text/ng-template") + a(href="/export/history.csv") Export History (CSV) + script(id='partials/options.profile.html', type="text/ng-template") ul.nav.nav-tabs li(ng-class="{ active: $state.includes('options.profile.avatar') }") @@ -132,6 +135,9 @@ script(id='partials/options.profile.html', type="text/ng-template") li(ng-class="{ active: $state.includes('options.profile.profile') }") a(ui-sref='options.profile.profile') | Profile + li(ng-class="{ active: $state.includes('options.profile.data') }") + a(ui-sref='options.profile.data') + | My Data .tab-content .tab-pane.active