2015-10-06 19:27:53 +00:00
|
|
|
import _ from 'lodash';
|
2015-10-07 00:52:57 +00:00
|
|
|
import { Observable } from 'rx';
|
2015-10-06 19:27:53 +00:00
|
|
|
import debugFactory from 'debug';
|
2015-10-06 07:13:51 +00:00
|
|
|
import dedent from 'dedent';
|
2015-10-07 02:49:38 +00:00
|
|
|
|
2018-08-31 15:04:04 +00:00
|
|
|
import { homeLocation } from '../../../config/env';
|
2018-08-29 19:52:41 +00:00
|
|
|
|
2015-10-06 19:27:53 +00:00
|
|
|
import nonprofits from '../utils/commit.json';
|
2019-02-18 19:32:49 +00:00
|
|
|
import { commitGoals, completeCommitment$ } from '../utils/commit';
|
2015-10-06 19:27:53 +00:00
|
|
|
|
2019-09-25 18:16:08 +00:00
|
|
|
import { unDasherize } from '../../../utils/slugs';
|
2015-10-06 19:27:53 +00:00
|
|
|
|
2019-02-18 19:32:49 +00:00
|
|
|
import { observeQuery, saveInstance } from '../utils/rx';
|
2015-10-06 19:27:53 +00:00
|
|
|
|
2019-02-18 19:32:49 +00:00
|
|
|
import { ifNoUserRedirectTo } from '../utils/middleware';
|
2015-10-06 07:13:51 +00:00
|
|
|
|
2015-12-28 20:41:37 +00:00
|
|
|
const sendNonUserToSignIn = ifNoUserRedirectTo(
|
2018-08-29 19:52:41 +00:00
|
|
|
`${homeLocation}/signin`,
|
2015-12-29 19:43:06 +00:00
|
|
|
'You must be signed in to commit to a nonprofit.',
|
|
|
|
'info'
|
2015-12-28 20:41:37 +00:00
|
|
|
);
|
|
|
|
|
2015-10-07 01:22:12 +00:00
|
|
|
const sendNonUserToCommit = ifNoUserRedirectTo(
|
|
|
|
'/commit',
|
2015-12-29 19:43:06 +00:00
|
|
|
'You must be signed in to update commit',
|
|
|
|
'info'
|
2015-10-07 01:22:12 +00:00
|
|
|
);
|
2015-12-28 20:41:37 +00:00
|
|
|
|
2016-01-27 19:34:44 +00:00
|
|
|
const debug = debugFactory('fcc:commit');
|
2015-10-06 07:13:51 +00:00
|
|
|
|
2015-10-06 21:54:59 +00:00
|
|
|
function findNonprofit(name) {
|
|
|
|
let nonprofit;
|
|
|
|
if (name) {
|
2019-02-18 19:32:49 +00:00
|
|
|
nonprofit = _.find(nonprofits, nonprofit => {
|
2015-10-06 21:54:59 +00:00
|
|
|
return name === nonprofit.name;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2019-02-18 19:32:49 +00:00
|
|
|
nonprofit = nonprofit || nonprofits[_.random(0, nonprofits.length - 1)];
|
2015-10-06 21:54:59 +00:00
|
|
|
return nonprofit;
|
|
|
|
}
|
|
|
|
|
2015-10-06 04:13:11 +00:00
|
|
|
export default function commit(app) {
|
|
|
|
const router = app.loopback.Router();
|
2016-06-17 19:35:10 +00:00
|
|
|
const api = app.loopback.Router();
|
2015-10-06 19:27:53 +00:00
|
|
|
const { Pledge } = app.models;
|
|
|
|
|
2019-02-18 19:32:49 +00:00
|
|
|
router.get('/commit', commitToNonprofit);
|
|
|
|
|
|
|
|
router.get('/commit/pledge', sendNonUserToSignIn, pledge);
|
|
|
|
|
|
|
|
router.get('/commit/directory', renderDirectory);
|
|
|
|
|
|
|
|
api.post('/commit/stop-commitment', sendNonUserToCommit, stopCommit);
|
|
|
|
|
|
|
|
api.post('/commit/complete-goal', sendNonUserToCommit, completeCommitment);
|
2015-10-07 02:49:38 +00:00
|
|
|
|
2016-06-17 19:35:10 +00:00
|
|
|
app.use(api);
|
2018-05-15 05:12:05 +00:00
|
|
|
app.use(router);
|
2015-10-06 04:13:11 +00:00
|
|
|
|
2015-10-07 00:52:57 +00:00
|
|
|
function commitToNonprofit(req, res, next) {
|
|
|
|
const { user } = req;
|
2015-10-06 19:27:53 +00:00
|
|
|
let nonprofitName = unDasherize(req.query.nonprofit);
|
|
|
|
|
|
|
|
debug('looking for nonprofit', nonprofitName);
|
2015-10-07 00:52:57 +00:00
|
|
|
const nonprofit = findNonprofit(nonprofitName);
|
|
|
|
|
|
|
|
Observable.just(user)
|
|
|
|
.flatMap(user => {
|
|
|
|
if (user) {
|
|
|
|
debug('getting user pledge');
|
|
|
|
return observeQuery(user, 'pledge');
|
|
|
|
}
|
|
|
|
return Observable.just();
|
|
|
|
})
|
2019-02-18 19:32:49 +00:00
|
|
|
.subscribe(pledge => {
|
|
|
|
if (pledge) {
|
|
|
|
debug('found previous pledge');
|
|
|
|
req.flash(
|
|
|
|
'info',
|
|
|
|
dedent`
|
2015-10-07 00:52:57 +00:00
|
|
|
Looks like you already have a pledge to ${pledge.displayName}.
|
2016-12-30 00:51:51 +00:00
|
|
|
Clicking "Commit" here will replace your old commitment. If you
|
|
|
|
do change your commitment, please remember to cancel your
|
2016-07-01 07:25:01 +00:00
|
|
|
previous recurring donation directly with ${pledge.displayName}.
|
2015-10-07 00:52:57 +00:00
|
|
|
`
|
|
|
|
);
|
2019-02-18 19:32:49 +00:00
|
|
|
}
|
|
|
|
res.render('commit/', {
|
|
|
|
title: 'Commit to a nonprofit. Commit to your goal.',
|
|
|
|
pledge,
|
|
|
|
...commitGoals,
|
|
|
|
...nonprofit
|
|
|
|
});
|
|
|
|
}, next);
|
2015-10-06 04:13:11 +00:00
|
|
|
}
|
2015-10-06 07:13:51 +00:00
|
|
|
|
2015-10-06 19:27:53 +00:00
|
|
|
function pledge(req, res, next) {
|
2015-10-06 07:13:51 +00:00
|
|
|
const { user } = req;
|
|
|
|
const {
|
2015-10-06 21:54:59 +00:00
|
|
|
nonprofit: nonprofitName = 'girl develop it',
|
2015-10-06 07:13:51 +00:00
|
|
|
amount = '5',
|
2017-12-21 01:15:23 +00:00
|
|
|
goal = commitGoals.respWebDesignCert
|
2015-10-06 07:13:51 +00:00
|
|
|
} = req.query;
|
|
|
|
|
2015-10-06 21:54:59 +00:00
|
|
|
const nonprofit = findNonprofit(nonprofitName);
|
|
|
|
|
2015-10-06 19:27:53 +00:00
|
|
|
observeQuery(user, 'pledge')
|
|
|
|
.flatMap(oldPledge => {
|
|
|
|
// create new pledge for user
|
2019-02-18 19:32:49 +00:00
|
|
|
const pledge = Pledge({
|
|
|
|
amount,
|
|
|
|
goal,
|
|
|
|
userId: user.id,
|
|
|
|
...nonprofit
|
|
|
|
});
|
2015-10-06 19:27:53 +00:00
|
|
|
|
|
|
|
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;
|
2019-02-18 19:32:49 +00:00
|
|
|
return saveInstance(oldPledge).flatMap(() => {
|
|
|
|
return saveInstance(pledge);
|
|
|
|
});
|
2015-10-06 19:27:53 +00:00
|
|
|
}
|
|
|
|
return saveInstance(pledge);
|
|
|
|
})
|
2019-02-18 19:32:49 +00:00
|
|
|
.subscribe(({ displayName, goal, amount }) => {
|
|
|
|
req.flash(
|
|
|
|
'success',
|
|
|
|
dedent`
|
2015-10-06 19:27:53 +00:00
|
|
|
Congratulations, you have committed to giving
|
2015-10-07 09:11:23 +00:00
|
|
|
${displayName} $${amount} each month until you have completed
|
2016-12-30 00:51:51 +00:00
|
|
|
your ${goal}. Please remember to cancel your pledge directly
|
2016-07-01 07:25:01 +00:00
|
|
|
with ${displayName} once you finish.
|
2015-10-06 19:27:53 +00:00
|
|
|
`
|
2019-02-18 19:32:49 +00:00
|
|
|
);
|
|
|
|
res.redirect('/' + user.username);
|
|
|
|
}, next);
|
2015-10-06 07:13:51 +00:00
|
|
|
}
|
2015-10-07 01:22:12 +00:00
|
|
|
|
2015-10-07 07:05:26 +00:00
|
|
|
function renderDirectory(req, res) {
|
|
|
|
res.render('commit/directory', {
|
|
|
|
title: 'Commit Directory',
|
|
|
|
nonprofits
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2015-10-07 02:49:38 +00:00
|
|
|
function completeCommitment(req, res, next) {
|
|
|
|
const { user } = req;
|
|
|
|
|
2019-02-18 19:32:49 +00:00
|
|
|
return completeCommitment$(user).subscribe(msgOrPledge => {
|
|
|
|
if (typeof msgOrPledge === 'string') {
|
|
|
|
return res.send(msgOrPledge);
|
|
|
|
}
|
|
|
|
return res.send(true);
|
|
|
|
}, next);
|
2015-10-07 02:49:38 +00:00
|
|
|
}
|
|
|
|
|
2015-10-07 01:22:12 +00:00
|
|
|
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);
|
|
|
|
})
|
2019-02-18 19:32:49 +00:00
|
|
|
.subscribe(pledge => {
|
|
|
|
let msg = dedent`
|
2016-12-30 00:51:51 +00:00
|
|
|
You have successfully stopped your pledge. Please
|
|
|
|
remember to cancel your recurring donation directly
|
2016-07-01 07:25:01 +00:00
|
|
|
with the nonprofit if you haven't already done so.
|
|
|
|
`;
|
2019-02-18 19:32:49 +00:00
|
|
|
if (!pledge) {
|
|
|
|
msg = dedent`
|
2016-12-30 00:51:51 +00:00
|
|
|
It doesn't look like you had an active pledge, so
|
2016-07-01 07:25:01 +00:00
|
|
|
there's no pledge to stop.
|
|
|
|
`;
|
2019-02-18 19:32:49 +00:00
|
|
|
}
|
|
|
|
req.flash('info', msg);
|
|
|
|
return res.redirect(`/${user.username}`);
|
|
|
|
}, next);
|
2015-10-07 01:22:12 +00:00
|
|
|
}
|
2015-10-06 04:13:11 +00:00
|
|
|
}
|