update all instances of progressTimestamp to check for objects
This commit is contained in:
@ -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);
|
||||||
|
@ -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(
|
||||||
|
@ -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')
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@ -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)
|
||||||
|
Reference in New Issue
Block a user