update all instances of progressTimestamp to check for objects

This commit is contained in:
Berkeley Martinez
2015-08-07 13:31:48 -07:00
parent e1fb3856c4
commit 71a02ed8b7
4 changed files with 68 additions and 115 deletions

View File

@ -28,7 +28,9 @@ function updateUserProgress(user, challengeId, completedChallenge) {
}); });
if (alreadyCompleted) { if (alreadyCompleted) {
user.progressTimestamps.push(Date.now()); user.progressTimestamps.push({
timestamp: Date.now()
});
} }
user.completedChallenges.push(completedChallenge); user.completedChallenges.push(completedChallenge);
return user; return user;
@ -330,7 +332,12 @@ module.exports = function(app) {
saveUser(req.user) saveUser(req.user)
.subscribe( .subscribe(
function(user) { debug('user save', user && user.progressTimestamps); }, function(user) {
debug(
'user save points %s',
user && user.progressTimestamps && user.progressTimestamps.length
);
},
next, next,
function() { function() {
res.sendStatus(200); res.sendStatus(200);

View File

@ -234,7 +234,9 @@ module.exports = function(app) {
.flatMap(function(user) { .flatMap(function(user) {
// if user deletes account then this will not exist // if user deletes account then this will not exist
if (user) { if (user) {
user.progressTimestamps.push(Date.now()); user.progressTimestamps.push({
timestamp: Date.now()
});
} }
return saveUser(user); return saveUser(user);
}) })
@ -378,7 +380,9 @@ module.exports = function(app) {
return saveInstance(newStory); return saveInstance(newStory);
}); });
req.user.progressTimestamps.push(Date.now()); req.user.progressTimestamps.push({
timestamp: Date.now()
});
return saveUser(req.user) return saveUser(req.user)
.flatMap(savedStory) .flatMap(savedStory)
.subscribe( .subscribe(

View File

@ -1,12 +1,29 @@
var _ = require('lodash'), var _ = require('lodash'),
R = require('ramda'), async = require('async'),
async = require('async'), crypto = require('crypto'),
crypto = require('crypto'), nodemailer = require('nodemailer'),
nodemailer = require('nodemailer'), moment = require('moment'),
moment = require('moment'), // debug = require('debug')('freecc:cntr:userController'),
// debug = require('debug')('freecc:cntr:userController'),
secrets = require('../../config/secrets'); secrets = require('../../config/secrets');
function calcCurrentStreak(cals) {
const revCals = cals.slice().reverse();
let streakBroken = false;
return revCals
.reduce((current, cal, index) => {
// if streak not borken and diff between this cal and the call after it
// is equal to zero
// moment.diff will return the days between rounded down
if (
!streakBroken &&
moment(revCals[index === 0 ? 0 : index - 1]).diff(cal, 'days') === 0
) {
return current + 1;
}
return 1;
}, 1);
}
module.exports = function(app) { module.exports = function(app) {
var router = app.loopback.Router(); var router = app.loopback.Router();
@ -39,11 +56,6 @@ module.exports = function(app) {
app.use(router); app.use(router);
/**
* GET /signin
* Siginin page.
*/
function getSignin(req, res) { function getSignin(req, res) {
if (req.user) { if (req.user) {
return res.redirect('/'); return res.redirect('/');
@ -53,21 +65,11 @@ module.exports = function(app) {
}); });
} }
/**
* GET /signout
* Log out.
*/
function signout(req, res) { function signout(req, res) {
req.logout(); req.logout();
res.redirect('/'); res.redirect('/');
} }
/**
* GET /email-signup
* Signup page.
*/
function getEmailSignin(req, res) { function getEmailSignin(req, res) {
if (req.user) { if (req.user) {
return res.redirect('/'); return res.redirect('/');
@ -77,11 +79,6 @@ module.exports = function(app) {
}); });
} }
/**
* GET /signin
* Signup page.
*/
function getEmailSignup(req, res) { function getEmailSignup(req, res) {
if (req.user) { if (req.user) {
return res.redirect('/'); return res.redirect('/');
@ -91,11 +88,6 @@ module.exports = function(app) {
}); });
} }
/**
* GET /account
* Profile page.
*/
function getAccount(req, res) { function getAccount(req, res) {
if (!req.user) { if (!req.user) {
return res.redirect('/'); return res.redirect('/');
@ -105,22 +97,12 @@ module.exports = function(app) {
}); });
} }
/**
* Angular API Call
*/
function getAccountAngular(req, res) { function getAccountAngular(req, res) {
res.json({ res.json({
user: req.user || {} user: req.user || {}
}); });
} }
/**
* GET /campers/:username
* Public Profile page.
*/
function returnUser(req, res, next) { function returnUser(req, res, next) {
const username = req.params.username.toLowerCase(); const username = req.params.username.toLowerCase();
const { path } = req; const { path } = req;
@ -144,78 +126,40 @@ module.exports = function(app) {
}); });
return res.redirect('/'); return res.redirect('/');
} }
user.progressTimestamps =
user.progressTimestamps.sort(function(a, b) { var cals = user
return a - b; .progressTimestamps
.map(objOrNum => {
return typeof objOrNum === 'number' ?
objOrNum :
objOrNum.timestamp;
})
.map(time => {
return moment(time).format('YYYY-MM-DD');
}); });
var timeObject = Object.create(null); user.currentStreak = calcCurrentStreak(cals);
R.forEach(function(time) {
timeObject[moment(time).format('YYYY-MM-DD')] = time;
}, user.progressTimestamps);
var tmpLongest = 1; if (user.currentStreak > user.longestStreak) {
var timeKeys = R.keys(timeObject); user.longestStreak = user.currentStreak;
user.longestStreak = 0;
for (var i = 1; i <= timeKeys.length; i++) {
if (moment(timeKeys[i - 1]).add(1, 'd').toString()
=== moment(timeKeys[i]).toString()) {
tmpLongest++;
if (tmpLongest > user.longestStreak) {
user.longestStreak = tmpLongest;
}
} else {
tmpLongest = 1;
}
} }
timeKeys = timeKeys.reverse(); const data = user
tmpLongest = 1; .progressTimestamps
.map((objOrNum) => {
return typeof objOrNum === 'number' ?
objOrNum :
objOrNum.timestamp;
})
.reduce((data, timeStamp) => {
data[(timeStamp / 1000)] = 1;
return data;
}, {});
user.currentStreak = 1; const challenges = user.completedChallenges.filter(function(obj) {
var today = moment(Date.now()).format('YYYY-MM-DD');
const yesterday = moment(today).subtract(1, 'd').toString();
const yesteryesterday = moment(today).subtract(2, 'd').toString();
if (
moment(today).toString() === moment(timeKeys[0]).toString() ||
yesterday === moment(timeKeys[0]).toString() ||
yesteryesterday === moment(timeKeys[0]).toString()
) {
for (var _i = 1; _i <= timeKeys.length; _i++) {
if (
moment(timeKeys[_i - 1]).subtract(1, 'd').toString() ===
moment(timeKeys[_i]).toString()
) {
tmpLongest++;
if (tmpLongest > user.currentStreak) {
user.currentStreak = tmpLongest;
}
} else {
break;
}
}
} else {
user.currentStreak = 1;
}
var data = {};
var progressTimestamps = user.progressTimestamps;
progressTimestamps.forEach(function(timeStamp) {
data[(timeStamp / 1000)] = 1;
});
var challenges = user.completedChallenges.filter(function( obj ) {
return obj.challengeType === 3 || obj.challengeType === 4; return obj.challengeType === 3 || obj.challengeType === 4;
}); });
user.currentStreak = user.currentStreak || 1;
user.longestStreak = user.longestStreak || 1;
res.render('account/show', { res.render('account/show', {
title: 'Camper ' + user.username + '\'s portfolio', title: 'Camper ' + user.username + '\'s portfolio',
username: user.username, username: user.username,
@ -234,10 +178,8 @@ module.exports = function(app) {
calender: data, calender: data,
challenges: challenges, challenges: challenges,
moment: moment, moment: moment,
longestStreak: user.longestStreak + longestStreak: user.longestStreak,
(user.longestStreak === 1 ? ' day' : ' days'), currentStreak: user.currentStreak
currentStreak: user.currentStreak +
(user.currentStreak === 1 ? ' day' : ' days')
}); });
} }
); );

View File

@ -77,8 +77,8 @@ block content
.row .row
.hidden-xs.col-sm-12.text-center .hidden-xs.col-sm-12.text-center
.row.text-primary .row.text-primary
h4.col-sm-6.text-right Longest Streak: #{longestStreak} h4.col-sm-6.text-right Longest Streak: #{longestStreak + longestStreak === 1 ? ' day' : ' days'}
h4.col-sm-6.text-left Current Streak: #{currentStreak} h4.col-sm-6.text-left Current Streak: #{currentStreak + currentStreak === 1 ? ' day' : ' days'}
if (challenges.length > 0) if (challenges.length > 0)