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) {
|
||||
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);
|
||||
|
@ -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(
|
||||
|
@ -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
|
||||
});
|
||||
}
|
||||
);
|
||||
|
@ -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)
|
||||
|
Reference in New Issue
Block a user