freeCodeCamp/api-server/server/boot/commit.js

195 lines
5.3 KiB
JavaScript
Raw Normal View History

import _ from 'lodash';
2015-10-07 00:52:57 +00:00
import { Observable } from 'rx';
import debugFactory from 'debug';
2015-10-06 07:13:51 +00:00
import dedent from 'dedent';
2015-10-07 02:49:38 +00:00
import { homeLocation } from '../../../config/env';
2018-08-29 19:52:41 +00:00
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';
2015-10-06 07:13:51 +00:00
const sendNonUserToSignIn = ifNoUserRedirectTo(
2018-08-29 19:52:41 +00:00
`${homeLocation}/signin`,
'You must be signed in to commit to a nonprofit.',
'info'
);
2015-10-07 01:22:12 +00:00
const sendNonUserToCommit = ifNoUserRedirectTo(
'/commit',
'You must be signed in to update commit',
'info'
2015-10-07 01:22:12 +00:00
);
2016-01-27 19:34:44 +00:00
const debug = debugFactory('fcc:commit');
2015-10-06 07:13:51 +00:00
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;
}
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();
const { Pledge } = app.models;
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;
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();
})
.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}.
Clicking "Commit" here will replace your old commitment. If you
do change your commitment, please remember to cancel your
previous recurring donation directly with ${pledge.displayName}.
2015-10-07 00:52:57 +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
function pledge(req, res, next) {
2015-10-06 07:13:51 +00:00
const { user } = req;
const {
nonprofit: nonprofitName = 'girl develop it',
2015-10-06 07:13:51 +00:00
amount = '5',
goal = commitGoals.respWebDesignCert
2015-10-06 07:13:51 +00:00
} = req.query;
const nonprofit = findNonprofit(nonprofitName);
observeQuery(user, 'pledge')
.flatMap(oldPledge => {
// create new pledge for user
const pledge = Pledge({
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',
dedent`
Congratulations, you have committed to giving
${displayName} $${amount} each month until you have completed
your ${goal}. Please remember to cancel your pledge directly
with ${displayName} once you finish.
`
);
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;
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);
})
.subscribe(pledge => {
let msg = dedent`
You have successfully stopped your pledge. Please
remember to cancel your recurring donation directly
with the nonprofit if you haven't already done so.
`;
if (!pledge) {
msg = dedent`
It doesn't look like you had an active pledge, so
there's no pledge to stop.
`;
}
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
}