From 71a02ed8b7c4d676349f77ea961c3f6426ff3a1d Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Fri, 7 Aug 2015 13:31:48 -0700 Subject: [PATCH] update all instances of progressTimestamp to check for objects --- server/boot/challenge.js | 11 ++- server/boot/story.js | 8 +- server/boot/user.js | 160 +++++++++++---------------------- server/views/account/show.jade | 4 +- 4 files changed, 68 insertions(+), 115 deletions(-) diff --git a/server/boot/challenge.js b/server/boot/challenge.js index 4eb361b9b2..d88f2acec0 100644 --- a/server/boot/challenge.js +++ b/server/boot/challenge.js @@ -28,7 +28,9 @@ function updateUserProgress(user, challengeId, completedChallenge) { }); if (alreadyCompleted) { - user.progressTimestamps.push(Date.now()); + user.progressTimestamps.push({ + timestamp: Date.now() + }); } user.completedChallenges.push(completedChallenge); return user; @@ -330,7 +332,12 @@ module.exports = function(app) { saveUser(req.user) .subscribe( - function(user) { debug('user save', user && user.progressTimestamps); }, + function(user) { + debug( + 'user save points %s', + user && user.progressTimestamps && user.progressTimestamps.length + ); + }, next, function() { res.sendStatus(200); diff --git a/server/boot/story.js b/server/boot/story.js index 8839cf7e4a..8be0735421 100755 --- a/server/boot/story.js +++ b/server/boot/story.js @@ -234,7 +234,9 @@ module.exports = function(app) { .flatMap(function(user) { // if user deletes account then this will not exist if (user) { - user.progressTimestamps.push(Date.now()); + user.progressTimestamps.push({ + timestamp: Date.now() + }); } return saveUser(user); }) @@ -378,7 +380,9 @@ module.exports = function(app) { return saveInstance(newStory); }); - req.user.progressTimestamps.push(Date.now()); + req.user.progressTimestamps.push({ + timestamp: Date.now() + }); return saveUser(req.user) .flatMap(savedStory) .subscribe( diff --git a/server/boot/user.js b/server/boot/user.js index b1d3c6d8d3..aa925e6ac9 100644 --- a/server/boot/user.js +++ b/server/boot/user.js @@ -1,12 +1,29 @@ var _ = require('lodash'), - R = require('ramda'), - async = require('async'), - crypto = require('crypto'), - nodemailer = require('nodemailer'), - moment = require('moment'), - // debug = require('debug')('freecc:cntr:userController'), + async = require('async'), + crypto = require('crypto'), + nodemailer = require('nodemailer'), + moment = require('moment'), + // 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) { var router = app.loopback.Router(); @@ -39,11 +56,6 @@ module.exports = function(app) { app.use(router); - /** - * GET /signin - * Siginin page. - */ - function getSignin(req, res) { if (req.user) { return res.redirect('/'); @@ -53,21 +65,11 @@ module.exports = function(app) { }); } - /** - * GET /signout - * Log out. - */ - function signout(req, res) { req.logout(); res.redirect('/'); } - /** - * GET /email-signup - * Signup page. - */ - function getEmailSignin(req, res) { if (req.user) { return res.redirect('/'); @@ -77,11 +79,6 @@ module.exports = function(app) { }); } - /** - * GET /signin - * Signup page. - */ - function getEmailSignup(req, res) { if (req.user) { return res.redirect('/'); @@ -91,11 +88,6 @@ module.exports = function(app) { }); } - /** - * GET /account - * Profile page. - */ - function getAccount(req, res) { if (!req.user) { return res.redirect('/'); @@ -105,22 +97,12 @@ module.exports = function(app) { }); } - /** - * Angular API Call - */ - function getAccountAngular(req, res) { res.json({ user: req.user || {} }); } - - /** - * GET /campers/:username - * Public Profile page. - */ - function returnUser(req, res, next) { const username = req.params.username.toLowerCase(); const { path } = req; @@ -144,78 +126,40 @@ module.exports = function(app) { }); return res.redirect('/'); } - user.progressTimestamps = - user.progressTimestamps.sort(function(a, b) { - return a - b; + + var cals = user + .progressTimestamps + .map(objOrNum => { + return typeof objOrNum === 'number' ? + objOrNum : + objOrNum.timestamp; + }) + .map(time => { + return moment(time).format('YYYY-MM-DD'); }); - var timeObject = Object.create(null); - R.forEach(function(time) { - timeObject[moment(time).format('YYYY-MM-DD')] = time; - }, user.progressTimestamps); + user.currentStreak = calcCurrentStreak(cals); - var tmpLongest = 1; - var timeKeys = R.keys(timeObject); - - 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; - } + if (user.currentStreak > user.longestStreak) { + user.longestStreak = user.currentStreak; } - timeKeys = timeKeys.reverse(); - tmpLongest = 1; + const data = user + .progressTimestamps + .map((objOrNum) => { + return typeof objOrNum === 'number' ? + objOrNum : + objOrNum.timestamp; + }) + .reduce((data, timeStamp) => { + data[(timeStamp / 1000)] = 1; + return data; + }, {}); - user.currentStreak = 1; - 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 ) { + const challenges = user.completedChallenges.filter(function(obj) { return obj.challengeType === 3 || obj.challengeType === 4; }); - user.currentStreak = user.currentStreak || 1; - user.longestStreak = user.longestStreak || 1; - res.render('account/show', { title: 'Camper ' + user.username + '\'s portfolio', username: user.username, @@ -234,10 +178,8 @@ module.exports = function(app) { calender: data, challenges: challenges, moment: moment, - longestStreak: user.longestStreak + - (user.longestStreak === 1 ? ' day' : ' days'), - currentStreak: user.currentStreak + - (user.currentStreak === 1 ? ' day' : ' days') + longestStreak: user.longestStreak, + currentStreak: user.currentStreak }); } ); diff --git a/server/views/account/show.jade b/server/views/account/show.jade index 9463f78fc9..bc65c80b17 100644 --- a/server/views/account/show.jade +++ b/server/views/account/show.jade @@ -77,8 +77,8 @@ block content .row .hidden-xs.col-sm-12.text-center .row.text-primary - h4.col-sm-6.text-right Longest Streak: #{longestStreak} - h4.col-sm-6.text-left Current Streak: #{currentStreak} + h4.col-sm-6.text-right Longest Streak: #{longestStreak + longestStreak === 1 ? ' day' : ' days'} + h4.col-sm-6.text-left Current Streak: #{currentStreak + currentStreak === 1 ? ' day' : ' days'} if (challenges.length > 0)