Permalink
Cannot retrieve contributors at this time
Fetching contributors…

import _ from 'lodash'; | |
import { Observable } from 'rx'; | |
import debugFactory from 'debug'; | |
import dedent from 'dedent'; | |
import nonprofits from '../utils/commit.json'; | |
import { | |
commitGoals, | |
completeCommitment$ | |
} from '../utils/commit'; | |
import { | |
unDasherize | |
} from '../utils'; | |
import { | |
observeQuery, | |
saveInstance | |
} from '../utils/rx'; | |
import { | |
ifNoUserRedirectTo | |
} from '../utils/middleware'; | |
const sendNonUserToSignIn = ifNoUserRedirectTo( | |
'/login', | |
'You must be signed in to commit to a nonprofit.', | |
'info' | |
); | |
const sendNonUserToCommit = ifNoUserRedirectTo( | |
'/commit', | |
'You must be signed in to update commit', | |
'info' | |
); | |
const debug = debugFactory('fcc:commit'); | |
function findNonprofit(name) { | |
let nonprofit; | |
if (name) { | |
nonprofit = _.find(nonprofits, (nonprofit) => { | |
return name === nonprofit.name; | |
}); | |
} | |
nonprofit = nonprofit || nonprofits[ _.random(0, nonprofits.length - 1) ]; | |
return nonprofit; | |
} | |
export default function commit(app) { | |
const router = app.loopback.Router(); | |
const { Pledge } = app.models; | |
router.get( | |
'/commit', | |
commitToNonprofit | |
); | |
router.get( | |
'/commit/pledge', | |
sendNonUserToSignIn, | |
pledge | |
); | |
router.get( | |
'/commit/directory', | |
renderDirectory | |
); | |
router.post( | |
'/commit/stop-commitment', | |
sendNonUserToCommit, | |
stopCommit | |
); | |
router.post( | |
'/commit/complete-goal', | |
sendNonUserToCommit, | |
completeCommitment | |
); | |
app.use(router); | |
function commitToNonprofit(req, res, next) { | |
const { user } = req; | |
let nonprofitName = unDasherize(req.query.nonprofit); | |
debug('looking for nonprofit', nonprofitName); | |
const nonprofit = findNonprofit(nonprofitName); | |
Observable.just(user) | |
.flatMap(user => { | |
if (user) { | |
debug('getting user pledge'); | |
return observeQuery(user, 'pledge'); | |
} | |
return Observable.just(); | |
}) | |
.subscribe( | |
pledge => { | |
if (pledge) { | |
debug('found previous pledge'); | |
req.flash('info', { | |
msg: dedent` | |
Looks like you already have a pledge to ${pledge.displayName}. | |
Hitting commit here will replace your old commitment. | |
` | |
}); | |
} | |
res.render( | |
'commit/', | |
Object.assign( | |
{ | |
title: 'Commit to a nonprofit. Commit to your goal.', | |
pledge | |
}, | |
commitGoals, | |
nonprofit | |
) | |
); | |
}, | |
next | |
); | |
} | |
function pledge(req, res, next) { | |
const { user } = req; | |
const { | |
nonprofit: nonprofitName = 'girl develop it', | |
amount = '5', | |
goal = commitGoals.frontEndCert | |
} = req.query; | |
const nonprofit = findNonprofit(nonprofitName); | |
observeQuery(user, 'pledge') | |
.flatMap(oldPledge => { | |
// create new pledge for user | |
const pledge = Pledge( | |
Object.assign( | |
{ | |
amount, | |
goal, | |
userId: user.id | |
}, | |
nonprofit | |
) | |
); | |
if (oldPledge) { | |
debug('user already has pledge, creating a new one'); | |
// we orphan last pledge since a user only has one pledge at a time | |
oldPledge.userId = ''; | |
oldPledge.formerUser = user.id; | |
oldPledge.endDate = new Date(); | |
oldPledge.isOrphaned = true; | |
return saveInstance(oldPledge) | |
.flatMap(() => { | |
return saveInstance(pledge); | |
}); | |
} | |
return saveInstance(pledge); | |
}) | |
.subscribe( | |
({ displayName, goal, amount }) => { | |
req.flash('success', { | |
msg: dedent` | |
Congratulations, you have committed to giving | |
${displayName} $${amount} each month until you have completed | |
your ${goal}. | |
` | |
}); | |
res.redirect('/' + user.username); | |
}, | |
next | |
); | |
} | |
function renderDirectory(req, res) { | |
res.render('commit/directory', { | |
title: 'Commit Directory', | |
nonprofits | |
}); | |
} | |
function completeCommitment(req, res, next) { | |
const { user } = req; | |
return completeCommitment$(user) | |
.subscribe( | |
msgOrPledge => { | |
if (typeof msgOrPledge === 'string') { | |
return res.send(msgOrPledge); | |
} | |
return res.send(true); | |
}, | |
next | |
); | |
} | |
function stopCommit(req, res, next) { | |
const { user } = req; | |
observeQuery(user, 'pledge') | |
.flatMap(pledge => { | |
if (!pledge) { | |
return Observable.just(); | |
} | |
pledge.formerUserId = pledge.userId; | |
pledge.userId = null; | |
pledge.isOrphaned = true; | |
pledge.dateEnded = new Date(); | |
return saveInstance(pledge); | |
}) | |
.subscribe( | |
pledge => { | |
let msg = 'You have successfully stopped your pledge.'; | |
if (!pledge) { | |
msg = `No pledge found for user ${user.username}.`; | |
} | |
req.flash('errors', { msg }); | |
return res.redirect(`/${user.username}`); | |
}, | |
next | |
); | |
} | |
} |