diff --git a/README.md b/README.md
index 13007cd912..d62477d7bd 100644
--- a/README.md
+++ b/README.md
@@ -98,7 +98,6 @@ TWITTER_TOKEN=stuff
TWITTER_TOKEN_SECRET=stuff
BLOGGER_KEY=stuff
-SLACK_WEBHOOK=stuff
SESSION_SECRET=secretstuff
COOKIE_SECRET='this is a secret'
diff --git a/common/models/User-Identity.js b/common/models/User-Identity.js
index 87a7ffef57..779ad2f48f 100644
--- a/common/models/User-Identity.js
+++ b/common/models/User-Identity.js
@@ -79,7 +79,7 @@ export default function(UserIdent) {
}
// if user signed in with github refresh their info
- if (userIdent.provider === 'github-login') {
+ if (/github/.test(userIdent.provider)) {
debug("user isn't github cool or username from github is different");
setProfileFromGithub(user, profile, profile._json);
userChanged = true;
diff --git a/common/models/challenge.json b/common/models/challenge.json
index 743332107d..84cf3a4c6b 100644
--- a/common/models/challenge.json
+++ b/common/models/challenge.json
@@ -4,6 +4,10 @@
"idInjection": true,
"trackChanges": false,
"properties": {
+ "id": {
+ "type": "string",
+ "id": true
+ },
"name": {
"type": "string",
"index": {
@@ -22,6 +26,9 @@
"order": {
"type": "number"
},
+ "suborder": {
+ "type": "number"
+ },
"dashedName": {
"type": "string"
},
diff --git a/common/models/job.json b/common/models/job.json
index 12473628cc..a3392fee82 100644
--- a/common/models/job.json
+++ b/common/models/job.json
@@ -4,6 +4,10 @@
"idInjection": true,
"trackChanges": false,
"properties": {
+ "id": {
+ "type": "string",
+ "id": true
+ },
"position": {
"type": "string"
},
diff --git a/common/models/nonprofit.json b/common/models/nonprofit.json
index 5d8dddbc3d..d83bd55739 100644
--- a/common/models/nonprofit.json
+++ b/common/models/nonprofit.json
@@ -4,6 +4,10 @@
"idInjection": true,
"trackChanges": false,
"properties": {
+ "id": {
+ "type": "string",
+ "id": true
+ },
"name": {
"type": "string",
"index": {
diff --git a/common/models/story.json b/common/models/story.json
index 6f252cefb3..5d8e56dfb2 100644
--- a/common/models/story.json
+++ b/common/models/story.json
@@ -4,6 +4,10 @@
"idInjection": true,
"trackChanges": false,
"properties": {
+ "id": {
+ "type": "string",
+ "id": true
+ },
"name": {
"type": "string",
"index": {
diff --git a/seed/challenges/basic-javascript.json b/seed/challenges/basic-javascript.json
index c8cd7046a9..0aa6f4f02f 100644
--- a/seed/challenges/basic-javascript.json
+++ b/seed/challenges/basic-javascript.json
@@ -1071,17 +1071,17 @@
"title": "Create a JavaScript Slot Machine",
"difficulty":"9.988",
"description":[
- "We are now going to try and combine some of the stuff we've just learnt abd create the logic for a slot machine game",
+ "We are now going to try and combine some of the stuff we've just learned and create the logic for a slot machine game",
"For this we will need to generate three random numbers between 1
and 5
to represent the possible values of each individual slot",
"Store the three random numbers in slotOne
, slotTwo
and slotThree
",
"Generate the random numbers by using the system we used earlier in /challenges/random-whole-numbers-in-a-range",
"Math.floor(Math.random() * (5 - 1 + 1)) + 1;
"
],
"tests":[
- "assert(typeof(runSlots($('.slot'))[0]) == 'number', 'SlotOne should be a random number');",
- "assert(typeof(runSlots($('.slot'))[1]) == 'number', 'SlotTwo should be a random number');",
- "assert(typeof(runSlots($('.slot'))[2]) == 'number', 'SlotThree should be a random number');",
- "assert((function(){if(editor.match(/Math.floor\\(Math\\.random\\(\\)\\s\\*\\s\\(5\\s\\-\\s1\\s\\+\\s1\\)\\)\\s\\+\\s1;/gi) !== null){return(editor.match(/Math.floor\\(Math\\.random\\(\\)\\s\\*\\s\\(5\\s\\-\\s1\\s\\+\\s1\\)\\)\\s\\+\\s1;/gi).length >= 3);}else{return(false);}})(), 'You should have used Math.floor(Math.random() * (5 - 1 + 1)) + 1; three times to generate your random numbers');"
+ "assert(typeof(runSlots($('.slot'))[0]) == 'number', 'slotOne should be a random number');",
+ "assert(typeof(runSlots($('.slot'))[1]) == 'number', 'slotTwo should be a random number');",
+ "assert(typeof(runSlots($('.slot'))[2]) == 'number', 'slotThree should be a random number');",
+ "assert((function(){if(editor.match(/Math\\.floor\\(\\s?Math\\.random\\(\\)\\s?\\*\\s?\\(\\s?5\\s?\\-\\s?1\\s?\\+\\s?1\\s?\\)\\s?\\)\\s?\\+\\s?1;/gi) !== null){return(editor.match(/Math\\.floor\\(\\s?Math\\.random\\(\\)\\s?\\*\\s?\\(\\s?5\\s?\\-\\s?1\\s?\\+\\s?1\\s?\\)\\s?\\)\\s?\\+\\s?1;/gi).length >= 3);}else{return(false);}})(), 'You should have used Math.floor(Math.random() * (5 - 1 + 1)) + 1; three times to generate your random numbers');"
],
"challengeSeed":[
"fccss",
diff --git a/seed/index.js b/seed/index.js
index 38305428a2..334a11d3dc 100644
--- a/seed/index.js
+++ b/seed/index.js
@@ -63,7 +63,8 @@ Challenge.destroyAll(function(err, info) {
.toLowerCase()
.replace(/\:/g, '')
.replace(/\s/g, '-');
- challenge.order = +('' + order + (index + 1));
+ challenge.order = order;
+ challenge.suborder = index + 1;
challenge.block = block;
return challenge;
diff --git a/server/boot/challenge.js b/server/boot/challenge.js
index 1fc4342def..cbcc47e614 100644
--- a/server/boot/challenge.js
+++ b/server/boot/challenge.js
@@ -38,9 +38,10 @@ function updateUserProgress(user, challengeId, completedChallenge) {
return id === challengeId;
});
- if (alreadyCompleted) {
+ if (!alreadyCompleted) {
user.progressTimestamps.push({
- timestamp: Date.now()
+ timestamp: Date.now(),
+ completedChallenge
});
}
user.completedChallenges.push(completedChallenge);
@@ -458,7 +459,10 @@ module.exports = function(app) {
.map(camperCount => numberWithCommas(camperCount));
const query = {
- order: 'order ASC'
+ order: [
+ 'order ASC',
+ 'suborder ASC'
+ ]
};
// create a stream of all the challenges
diff --git a/server/boot/home.js b/server/boot/home.js
index 1e40fb01a3..177a2eff2b 100644
--- a/server/boot/home.js
+++ b/server/boot/home.js
@@ -1,29 +1,29 @@
-var defaultProfileImage =
- require('../../common/utils/constantStrings.json').defaultProfileImage;
-var message =
+import { defaultProfileImage } from '../../common/utils/constantStrings.json';
+
+const message =
'Learn to Code JavaScript and get a Coding Job by Helping Nonprofits';
module.exports = function(app) {
var router = app.loopback.Router();
- router.get('/', index);
+ router.get('/', addDefaultImage, index);
app.use(router);
- function index(req, res, next) {
- if (req.user)
- if (!req.user.picture) {
- req.user.picture = defaultProfileImage;
-
- req.user.save(function (err) {
- if (err) {
- return next(err);
- }
- res.render('get-started', {title: message});
- });
- } else {
- res.render('resources/get-started', {title: message});
- } else {
- res.render('home', { title: message });
+ function addDefaultImage(req, res, next) {
+ if (!req.user || req.user.picture) {
+ return next();
}
+ req.user.picture = defaultProfileImage;
+ req.user.save(function(err) {
+ if (err) { return next(err); }
+ next();
+ });
+ }
+
+ function index(req, res) {
+ if (req.user) {
+ return res.render('resources/get-started', { title: message });
+ }
+ res.render('home', { title: message });
}
};
diff --git a/server/passport-providers.js b/server/passport-providers.js
index ddd29f64db..5ffcbf1a09 100644
--- a/server/passport-providers.js
+++ b/server/passport-providers.js
@@ -141,5 +141,19 @@ module.exports = {
clientSecret: process.env.GITHUB_SECRET,
scope: ['email'],
failureFlash: true
+ },
+ 'github-link': {
+ provider: 'github',
+ authScheme: 'oauth2',
+ module: 'passport-github',
+ authPath: '/link/github',
+ callbackURL: '/link/github/callback',
+ callbackPath: '/link/github/callback',
+ successRedirect: successRedirect,
+ failureRedirect: failureRedirect,
+ clientID: process.env.GITHUB_ID,
+ clientSecret: process.env.GITHUB_SECRET,
+ scope: ['email'],
+ failureFlash: true
}
};
diff --git a/server/server.js b/server/server.js
index 93a0f06d8d..bf0cb8c396 100755
--- a/server/server.js
+++ b/server/server.js
@@ -102,7 +102,7 @@ var passportOptions = {
userObj.email = email;
}
- if (provider === 'github-login') {
+ if (/github/.test(provider)) {
setProfileFromGithub(userObj, profile, profile._json);
}
return userObj;