Merge branch 'staging' of github.com:FreeCodeCamp/freecodecamp into staging

This commit is contained in:
Quincy Larson
2015-08-18 15:21:38 -07:00
7 changed files with 146 additions and 105 deletions

View File

@ -69,7 +69,7 @@
"lodash": "^3.9.3", "lodash": "^3.9.3",
"loopback": "https://github.com/FreeCodeCamp/loopback.git#fix/no-password", "loopback": "https://github.com/FreeCodeCamp/loopback.git#fix/no-password",
"loopback-boot": "^2.8.0", "loopback-boot": "^2.8.0",
"loopback-component-passport": "^1.5.0", "loopback-component-passport": "https://github.com/FreeCodeCamp/loopback-component-passport.git#feature/flashfailure",
"loopback-connector-mongodb": "^1.10.0", "loopback-connector-mongodb": "^1.10.0",
"lusca": "~1.0.2", "lusca": "~1.0.2",
"method-override": "~2.3.0", "method-override": "~2.3.0",

View File

@ -388,3 +388,7 @@ var resetEditor = function resetEditor() {
editor.setValue(allSeeds); editor.setValue(allSeeds);
codeStorage.updateStorage(); codeStorage.updateStorage();
}; };
$(document).ready(function(){
bonfireExecute();
});

View File

@ -22,67 +22,6 @@ $(document).ready(function() {
setCSRFToken($('meta[name="csrf-token"]').attr('content')); setCSRFToken($('meta[name="csrf-token"]').attr('content'));
$('#i-want-help').on('click', function() {
$('#help-modal').modal('hide');
var editorValue = editor.getValue();
var currentLocation = window.location.href;
$.post(
'/get-help',
{
payload: {
code: editorValue,
challenge: currentLocation
}
},
function(res) {
if (res) {
window.open('https://gitter.im/FreeCodeCamp/Help', '_blank')
}
}
);
});
$('#i-want-help-editorless').on('click', function() {
$('#help-editorless-modal').modal('hide');
var currentLocation = window.location.href;
$.post(
'/get-help',
{
payload: {
challenge: currentLocation
}
},
function(res) {
if (res) {
window.open('https://gitter.im/FreeCodeCamp/Help', '_blank')
}
}
);
});
$('#report-issue').on('click', function() {
$('#issue-modal').modal('hide');
window.open('https://github.com/freecodecamp/freecodecamp/issues/new?&body=Challenge '+ window.location.href +' has an issue. Please describe how to reproduce it, and include links to screenshots if possible.', '_blank')
});
$('#i-want-to-pair').on('click', function() {
$('#pair-modal').modal('hide');
var currentLocation = window.location.href;
$.post(
'/get-pair',
{
payload: {
challenge: currentLocation
}
},
function(res) {
if (res) {
window.open('https://gitter.im/FreeCodeCamp/LetsPair', '_blank')
}
}
);
});
$('.checklist-element').each(function() { $('.checklist-element').each(function() {
var checklistElementId = $(this).attr('id'); var checklistElementId = $(this).attr('id');
if(!!localStorage[checklistElementId]) { if(!!localStorage[checklistElementId]) {
@ -118,41 +57,126 @@ $(document).ready(function() {
$(this).unbind("error").attr("src", "https://s3.amazonaws.com/freecodecamp/camper-image-placeholder.png"); $(this).unbind("error").attr("src", "https://s3.amazonaws.com/freecodecamp/camper-image-placeholder.png");
}); });
$('#completed-courseware').on('click', function() { function reBindModals(){
$('#complete-courseware-dialog').modal('show');
});
$('#completed-courseware-editorless').on('click', function() { $('#i-want-help').unbind('click');
$('#complete-courseware-editorless-dialog').modal('show'); $('#i-want-help').on('click', function() {
}); $('#help-modal').modal('hide');
var editorValue = editor.getValue();
var currentLocation = window.location.href;
$.post(
'/get-help',
{
payload: {
code: editorValue,
challenge: currentLocation
}
},
function(res) {
if (res) {
window.open('https://gitter.im/FreeCodeCamp/Help', '_blank')
}
}
);
});
$('#trigger-pair-modal').on('click', function() { $('#i-want-help-editorless').unbind('click');
$('#pair-modal').modal('show'); $('#i-want-help-editorless').on('click', function() {
}); $('#help-editorless-modal').modal('hide');
var currentLocation = window.location.href;
$.post(
'/get-help',
{
payload: {
challenge: currentLocation
}
},
function(res) {
if (res) {
window.open('https://gitter.im/FreeCodeCamp/Help', '_blank')
}
}
);
});
$('#trigger-reset-modal').on('click', function() { $('#report-issue').unbind('click');
$('#reset-modal').modal('show'); $('#report-issue').on('click', function() {
}); $('#issue-modal').modal('hide');
window.open('https://github.com/freecodecamp/freecodecamp/issues/new?&body=Challenge '+ window.location.href +' has an issue. Please describe how to reproduce it, and include links to screenshots if possible.', '_blank')
});
$('#trigger-help-modal').on('click', function() { $('#i-want-help').unbind('click');
$('#help-modal').modal('show'); $('#i-want-to-pair').on('click', function() {
}); $('#pair-modal').modal('hide');
var currentLocation = window.location.href;
$.post(
'/get-pair',
{
payload: {
challenge: currentLocation
}
},
function(res) {
if (res) {
window.open('https://gitter.im/FreeCodeCamp/LetsPair', '_blank')
}
}
);
});
$('#trigger-issue-modal').on('click', function() { $('#completed-courseware').unbind('click');
$('#issue-modal').modal('show'); $('#completed-courseware').on('click', function() {
}); $('#complete-courseware-dialog').modal('show');
});
$('#completed-zipline-or-basejump').on('click', function() { $('#completed-courseware-editorless').unbind('click');
$('#complete-zipline-or-basejump-dialog').modal('show'); $('#completed-courseware-editorless').on('click', function() {
}); $('#complete-courseware-editorless-dialog').modal('show');
});
$('#complete-courseware-dialog').on('hidden.bs.modal', function() { $('#trigger-pair-modal').unbind('click');
editor.focus(); $('#trigger-pair-modal').on('click', function() {
}); $('#pair-modal').modal('show');
});
$('#complete-challenge-dialog').on('hidden.bs.modal', function() { $('#trigger-reset-modal').unbind('click');
editor.focus(); $('#trigger-reset-modal').on('click', function() {
}); $('#reset-modal').modal('show');
});
$('#trigger-help-modal').unbind('click');
$('#trigger-help-modal').on('click', function() {
$('#help-modal').modal('show');
});
$('#trigger-issue-modal').unbind('click');
$('#trigger-issue-modal').on('click', function() {
$('#issue-modal').modal('show');
});
$('#completed-zipline-or-basejump').unbind('click');
$('#completed-zipline-or-basejump').on('click', function() {
$('#complete-zipline-or-basejump-dialog').modal('show');
});
$('#completed-courseware-dialog').unbind('click');
$('#complete-courseware-dialog').on('hidden.bs.modal', function() {
editor.focus();
});
$('#completed-zipline-or-basejump').unbind('click');
$('#complete-zipline-or-basejump').on('hidden.bs.modal', function() {
editor.focus();
});
};
$(window).resize(function(){
reBindModals();
});
reBindModals();
var challengeTypes = { var challengeTypes = {
'HTML_CSS_JQ': '0', 'HTML_CSS_JQ': '0',

View File

@ -1,5 +1,9 @@
import{ Observable } from 'rx';
import { observeMethod, observeQuery } from '../utils/rx'; import { observeMethod, observeQuery } from '../utils/rx';
import { getSocialProvider } from '../utils/auth'; import { getSocialProvider } from '../utils/auth';
import debugFactory from 'debug';
const debug = debugFactory('fcc:userIdent');
export default function({ models }) { export default function({ models }) {
const { User, UserIdentity, UserCredential } = models; const { User, UserIdentity, UserCredential } = models;
@ -20,15 +24,18 @@ export default function({ models }) {
options = {}; options = {};
} }
const user$ = findUserById(userId); const user$ = findUserById(userId);
console.log('provider', provider); const query = {
console.log('id', profile.id); where: {
findIdent({ provider: getSocialProvider(provider),
provider: getSocialProvider(provider), externalId: profile.id
externalId: profile.id }
}) };
debug('link identity query', query);
findIdent(query)
.flatMap(identity => { .flatMap(identity => {
const modified = new Date(); const modified = new Date();
if (!identity || identity.externalId !== profile.id) { if (!identity) {
return observeQuery(UserIdentity, 'create', { return observeQuery(UserIdentity, 'create', {
provider: getSocialProvider(provider), provider: getSocialProvider(provider),
externalId: profile.id, externalId: profile.id,
@ -40,6 +47,11 @@ export default function({ models }) {
modified modified
}); });
} }
if (identity.userId !== userId) {
return Observable.throw(
new Error('An account is already linked to that profile')
);
}
identity.credentials = credentials; identity.credentials = credentials;
return observeQuery(identity, 'updateAttributes', { return observeQuery(identity, 'updateAttributes', {
profile: getSocialProvider(provider), profile: getSocialProvider(provider),

View File

@ -1,5 +1,6 @@
var successRedirect = '/'; var successRedirect = '/';
var failureRedirect = '/login'; var failureRedirect = '/login';
var linkFailureRedirect = '/account';
module.exports = { module.exports = {
local: { local: {
provider: 'local', provider: 'local',
@ -34,7 +35,7 @@ module.exports = {
callbackURL: '/link/facebook/callback', callbackURL: '/link/facebook/callback',
callbackPath: '/link/facebook/callback', callbackPath: '/link/facebook/callback',
successRedirect: successRedirect, successRedirect: successRedirect,
failureRedirect: failureRedirect, failureRedirect: linkFailureRedirect,
scope: ['email', 'user_likes'], scope: ['email', 'user_likes'],
link: true, link: true,
failureFlash: true failureFlash: true
@ -63,7 +64,7 @@ module.exports = {
callbackURL: '/link/google/callback', callbackURL: '/link/google/callback',
callbackPath: '/link/google/callback', callbackPath: '/link/google/callback',
successRedirect: successRedirect, successRedirect: successRedirect,
failureRedirect: failureRedirect, failureRedirect: linkFailureRedirect,
scope: ['email', 'profile'], scope: ['email', 'profile'],
link: true, link: true,
failureFlash: true failureFlash: true
@ -89,7 +90,7 @@ module.exports = {
callbackURL: '/link/twitter/callback', callbackURL: '/link/twitter/callback',
callbackPath: '/link/twitter/callback', callbackPath: '/link/twitter/callback',
successRedirect: successRedirect, successRedirect: successRedirect,
failureRedirect: failureRedirect, failureRedirect: linkFailureRedirect,
consumerKey: process.env.TWITTER_KEY, consumerKey: process.env.TWITTER_KEY,
consumerSecret: process.env.TWITTER_SECRET, consumerSecret: process.env.TWITTER_SECRET,
link: true, link: true,
@ -120,7 +121,7 @@ module.exports = {
callbackURL: '/link/linkedin/callback', callbackURL: '/link/linkedin/callback',
callbackPath: '/link/linkedin/callback', callbackPath: '/link/linkedin/callback',
successRedirect: successRedirect, successRedirect: successRedirect,
failureRedirect: failureRedirect, failureRedirect: linkFailureRedirect,
clientID: process.env.LINKEDIN_ID, clientID: process.env.LINKEDIN_ID,
clientSecret: process.env.LINKEDIN_SECRET, clientSecret: process.env.LINKEDIN_SECRET,
scope: ['r_basicprofile', 'r_emailaddress'], scope: ['r_basicprofile', 'r_emailaddress'],
@ -152,7 +153,7 @@ module.exports = {
callbackURL: '/auth/github/callback/link', callbackURL: '/auth/github/callback/link',
callbackPath: '/auth/github/callback/link', callbackPath: '/auth/github/callback/link',
successRedirect: successRedirect, successRedirect: successRedirect,
failureRedirect: failureRedirect, failureRedirect: linkFailureRedirect,
clientID: process.env.GITHUB_ID, clientID: process.env.GITHUB_ID,
clientSecret: process.env.GITHUB_SECRET, clientSecret: process.env.GITHUB_SECRET,
scope: ['email'], scope: ['email'],

View File

@ -34,7 +34,7 @@
| . | .
h3 If you've already read the errors and searched Google, you should ask for help. h3 If you've already read the errors and searched Google, you should ask for help.
h3 This will take you to our help room. h3 This will take you to our help room.
a.btn.btn-lg.btn-primary.btn-block(href='https://gitter.im/FreeCodeCamp/LetsPair', data-dismiss='modal', aria-hidden='true' target='_blank') Take me to the help room a.btn.btn-lg.btn-primary.btn-block(href='https://gitter.im/FreeCodeCamp/help', data-dismiss='modal', aria-hidden='true' target='_blank') Take me to the help room
a.btn.btn-lg.btn-info.btn-block(href='#', data-dismiss='modal', aria-hidden='true') Cancel a.btn.btn-lg.btn-info.btn-block(href='#', data-dismiss='modal', aria-hidden='true') Cancel
#reset-modal.modal(tabindex='-1') #reset-modal.modal(tabindex='-1')

View File

@ -1,11 +1,11 @@
.row .row
.col-xs-12 .col-xs-12
if messages.errors if (messages.errors || messages.error)
.alert.alert-danger.fade.in .alert.alert-danger.fade.in
button.close(type='button', data-dismiss='alert') button.close(type='button', data-dismiss='alert')
span.ion-close-circled span.ion-close-circled
for error in messages.errors for error in (messages.errors || messages.error)
div!= error.msg div!= error.msg || error
if messages.info if messages.info
.alert.alert-info.fade.in .alert.alert-info.fade.in
button.close(type='button', data-dismiss='alert') button.close(type='button', data-dismiss='alert')