condensing the controllers for accessing each model separately
This commit is contained in:
@@ -1,3 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
organization: require('./organization.controller')
|
|
||||||
};
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
const db = require('../../../models'),
|
|
||||||
errorMaker = require('../../helpers/error.maker');
|
|
||||||
|
|
||||||
const { Grant, Cause, Region, Organization } = db;
|
|
||||||
|
|
||||||
// Verify charity
|
|
||||||
exports.verifyOrg = async (req, res, next) => {
|
|
||||||
const charity_id = req.params.charity_id;
|
|
||||||
|
|
||||||
await db.sequelize.query(
|
|
||||||
'UPDATE organizations SET verified = 1 WHERE id = :charity_id',
|
|
||||||
{ replacements: { charity_id } }
|
|
||||||
);
|
|
||||||
|
|
||||||
return res.status(200).json({ message: 'Successfully verified charity' });
|
|
||||||
};
|
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
const db = require('../../models'),
|
||||||
|
errorMaker = require('../helpers/error.maker'),
|
||||||
|
textCleaner = require('../helpers/text_cleaner');
|
||||||
|
|
||||||
|
const { Grant, Cause, Region, Organization } = db;
|
||||||
|
|
||||||
|
// ADD a cause into the database
|
||||||
|
exports.createCause = (req, res, next) => {
|
||||||
|
const { name } = req.body;
|
||||||
|
|
||||||
|
Cause.create({ name })
|
||||||
|
.then(cause => {
|
||||||
|
res.status(200).json({
|
||||||
|
message: 'Cause created',
|
||||||
|
cause
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch(error => next(error));
|
||||||
|
};
|
||||||
|
|
||||||
|
// FETCH all causes
|
||||||
|
exports.getAllCauses = (req, res, next) => {
|
||||||
|
Cause.findAll()
|
||||||
|
.then(causes => {
|
||||||
|
causes = causes.map(cause => {
|
||||||
|
cause.name = textCleaner.titleCase(cause.name);
|
||||||
|
return cause;
|
||||||
|
});
|
||||||
|
|
||||||
|
res.status(200).json({
|
||||||
|
causes,
|
||||||
|
number_items: causes.length
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch(error => next(error));
|
||||||
|
};
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
const db = require('../../../models'),
|
const db = require('../../models'),
|
||||||
bcrypt = require('bcrypt-nodejs'),
|
bcrypt = require('bcrypt-nodejs'),
|
||||||
errorMaker = require('../../helpers/error.maker'),
|
errorMaker = require('../helpers/error.maker'),
|
||||||
uuidv4 = require('uuid/v4');
|
uuidv4 = require('uuid/v4');
|
||||||
|
|
||||||
const Donor = db.Donor;
|
const Donor = db.Donor;
|
||||||
|
|
||||||
// Create/post a Donor
|
// Create/post a Donor
|
||||||
exports.create = (req, res, next) => {
|
exports.createDonor = (req, res, next) => {
|
||||||
// see if user already in db
|
// see if user already in db
|
||||||
Donor.findAll({
|
Donor.findAll({
|
||||||
where: {
|
where: {
|
||||||
@@ -53,7 +53,7 @@ exports.create = (req, res, next) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// FETCH all Donor
|
// FETCH all Donor
|
||||||
exports.findAll = (req, res, next) => {
|
exports.getAllDonors = (req, res, next) => {
|
||||||
Donor.findAll().then(donors => {
|
Donor.findAll().then(donors => {
|
||||||
// Send all donors to Client
|
// Send all donors to Client
|
||||||
res.status(200).json({
|
res.status(200).json({
|
||||||
@@ -64,14 +64,14 @@ exports.findAll = (req, res, next) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Find a Donor by Id
|
// Find a Donor by Id
|
||||||
exports.findById = (req, res) => {
|
exports.findDonorById = (req, res) => {
|
||||||
Donor.findById(req.params.donor_id).then(donor => {
|
Donor.findById(req.params.donor_id).then(donor => {
|
||||||
res.send(donor);
|
res.send(donor);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// Delete a Donor by Id
|
// Delete a Donor by Id
|
||||||
exports.delete = (req, res) => {
|
exports.deleteDonor = (req, res) => {
|
||||||
const id = req.params.donor_id;
|
const id = req.params.donor_id;
|
||||||
Donor.destroy({
|
Donor.destroy({
|
||||||
where: { id: id }
|
where: { id: id }
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
donor: require('./donor.controller'),
|
|
||||||
grant: require('./grant.controller'),
|
|
||||||
organization: require('./organization.controller'),
|
|
||||||
stripe: require('./stripe.controller')
|
|
||||||
};
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
const db = require('../../../models'),
|
|
||||||
errorMaker = require('../../helpers/error.maker');
|
|
||||||
|
|
||||||
const { Grant, Cause, Region, Organization } = db;
|
|
||||||
|
|
||||||
const log10 = val => {
|
|
||||||
return Math.log(val) / Math.log(10);
|
|
||||||
};
|
|
||||||
|
|
||||||
// POST to get suggested organizations based on chosen causes + regions
|
|
||||||
exports.findSuggested = (req, res, next) => {
|
|
||||||
const { amount, causes, regions } = req.body;
|
|
||||||
|
|
||||||
if (amount == 0 || causes.length == 0 || regions.length == 0) {
|
|
||||||
return next(errorMaker(400, 'Invalid options for grant suggestions'));
|
|
||||||
}
|
|
||||||
|
|
||||||
// formula for max amount of organizations to choose
|
|
||||||
const max_orgs = Math.floor(1.5 * log10(amount));
|
|
||||||
|
|
||||||
const QUERY =
|
|
||||||
'SELECT * from organizations ' +
|
|
||||||
'WHERE primary_cause IN (:causes) or primary_region IN (:regions) ' +
|
|
||||||
'LIMIT :max_orgs';
|
|
||||||
db.sequelize
|
|
||||||
.query(QUERY, {
|
|
||||||
replacements: { causes, regions, max_orgs },
|
|
||||||
type: db.Sequelize.QueryTypes.SELECT
|
|
||||||
})
|
|
||||||
.then(organizations => {
|
|
||||||
res.status(200).json({
|
|
||||||
organizations,
|
|
||||||
num_items: organizations.length,
|
|
||||||
max_orgs,
|
|
||||||
distribution: amount / organizations.length
|
|
||||||
});
|
|
||||||
})
|
|
||||||
.catch(error => next(error));
|
|
||||||
};
|
|
||||||
|
|
||||||
// GET min and optimal amounts for the chosen causes + regions
|
|
||||||
exports.findAmounts = (req, res, next) => {
|
|
||||||
const { num_causes, num_regions } = req.body;
|
|
||||||
|
|
||||||
const feature_factor = parseInt(num_causes) + parseFloat(num_regions / 2);
|
|
||||||
|
|
||||||
// calculate min amount for chosen causes and regions
|
|
||||||
const min_amount = Math.ceil(feature_factor * 15);
|
|
||||||
|
|
||||||
// calculate optimal for chosen causes and regions
|
|
||||||
const optimal_amount = Math.ceil(Math.pow(5, feature_factor));
|
|
||||||
|
|
||||||
res.status(200).json({
|
|
||||||
min_amount,
|
|
||||||
optimal_amount
|
|
||||||
});
|
|
||||||
};
|
|
||||||
@@ -1,13 +1,20 @@
|
|||||||
const db = require('../../../models'),
|
const db = require('../../models'),
|
||||||
errorMaker = require('../../helpers/error.maker');
|
errorMaker = require('../helpers/error.maker');
|
||||||
|
|
||||||
const stripe = require('./stripe.controller');
|
const stripe = require('./stripe.controller');
|
||||||
const sendgrid = require('../sendgrid.controller');
|
const sendgrid = require('./sendgrid.controller');
|
||||||
|
|
||||||
const { Grant, Cause, Region, Organization, GrantOrganization, sequelize } = db;
|
const {
|
||||||
console.log(db);
|
Grant,
|
||||||
|
Cause,
|
||||||
|
Region,
|
||||||
|
Organization,
|
||||||
|
GrantOrganization,
|
||||||
|
Project,
|
||||||
|
sequelize
|
||||||
|
} = db;
|
||||||
// Create a grant for certain donor
|
// Create a grant for certain donor
|
||||||
exports.create = async (req, res, next) => {
|
exports.createGrant = async (req, res, next) => {
|
||||||
const user = req.user;
|
const user = req.user;
|
||||||
|
|
||||||
var { name, monthly, organizations, amount, stripeToken } = req.body;
|
var { name, monthly, organizations, amount, stripeToken } = req.body;
|
||||||
@@ -49,10 +56,12 @@ exports.create = async (req, res, next) => {
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// mapping between bundle and orgs
|
||||||
await GrantOrganization.bulkCreate(grantsOrgs, {
|
await GrantOrganization.bulkCreate(grantsOrgs, {
|
||||||
transaction
|
transaction
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// one time charge
|
||||||
await stripe.grantCharge({
|
await stripe.grantCharge({
|
||||||
grant,
|
grant,
|
||||||
stripeToken,
|
stripeToken,
|
||||||
@@ -63,6 +72,7 @@ exports.create = async (req, res, next) => {
|
|||||||
user
|
user
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// send email
|
||||||
await sendgrid.paymentReceipt({
|
await sendgrid.paymentReceipt({
|
||||||
organizations,
|
organizations,
|
||||||
total_amount: actual_total,
|
total_amount: actual_total,
|
||||||
@@ -83,7 +93,7 @@ exports.create = async (req, res, next) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Find grants with causes, regions, and organizations by donor_id
|
// Find grants with causes, regions, and organizations by donor_id
|
||||||
exports.findByDonorId = (req, res, next) => {
|
exports.findGrantsByDonorId = (req, res, next) => {
|
||||||
const donor_id = req.user.id;
|
const donor_id = req.user.id;
|
||||||
|
|
||||||
Grant.findAll({
|
Grant.findAll({
|
||||||
@@ -101,7 +111,7 @@ exports.findByDonorId = (req, res, next) => {
|
|||||||
.catch(error => next(error));
|
.catch(error => next(error));
|
||||||
};
|
};
|
||||||
|
|
||||||
exports.delete = (req, res, next) => {
|
exports.deleteGrant = (req, res, next) => {
|
||||||
const { grant_id } = req.body;
|
const { grant_id } = req.body;
|
||||||
const user = req.user;
|
const user = req.user;
|
||||||
|
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
module.exports = {
|
||||||
|
donor: require('./donor.controller'),
|
||||||
|
grant: require('./grant.controller'),
|
||||||
|
organization: require('./organization.controller'),
|
||||||
|
stripe: require('./stripe.controller'),
|
||||||
|
sendgrid: require('./sendgrid.controller'),
|
||||||
|
region: require('./region.controller'),
|
||||||
|
cause: require('./cause.controller'),
|
||||||
|
user: require('./user.controller'),
|
||||||
|
auth: require('./auth.controller')
|
||||||
|
};
|
||||||
@@ -0,0 +1,218 @@
|
|||||||
|
const db = require('../../models'),
|
||||||
|
bcrypt = require('bcrypt-nodejs'),
|
||||||
|
errorMaker = require('../helpers/error.maker'),
|
||||||
|
uuidv4 = require('uuid/v4');
|
||||||
|
|
||||||
|
const { Grant, Cause, Region, Organization } = db;
|
||||||
|
|
||||||
|
// Verify charity
|
||||||
|
exports.verifyCharity = async (req, res, next) => {
|
||||||
|
const charity_id = req.params.charity_id;
|
||||||
|
|
||||||
|
await db.sequelize.query(
|
||||||
|
'UPDATE organizations SET verified = 1 WHERE id = :charity_id',
|
||||||
|
{ replacements: { charity_id } }
|
||||||
|
);
|
||||||
|
|
||||||
|
return res.status(200).json({ message: 'Successfully verified charity' });
|
||||||
|
};
|
||||||
|
|
||||||
|
const log10 = val => {
|
||||||
|
return Math.log(val) / Math.log(10);
|
||||||
|
};
|
||||||
|
|
||||||
|
// POST to get suggested organizations based on chosen causes + regions
|
||||||
|
exports.findSuggestedCharities = (req, res, next) => {
|
||||||
|
const { amount, causes, regions } = req.body;
|
||||||
|
|
||||||
|
if (amount == 0 || causes.length == 0 || regions.length == 0) {
|
||||||
|
return next(errorMaker(400, 'Invalid options for grant suggestions'));
|
||||||
|
}
|
||||||
|
|
||||||
|
// formula for max amount of organizations to choose
|
||||||
|
const max_orgs = Math.floor(1.5 * log10(amount));
|
||||||
|
|
||||||
|
const QUERY =
|
||||||
|
'SELECT * from organizations ' +
|
||||||
|
'WHERE primary_cause IN (:causes) or primary_region IN (:regions) ' +
|
||||||
|
'LIMIT :max_orgs';
|
||||||
|
db.sequelize
|
||||||
|
.query(QUERY, {
|
||||||
|
replacements: { causes, regions, max_orgs },
|
||||||
|
type: db.Sequelize.QueryTypes.SELECT
|
||||||
|
})
|
||||||
|
.then(organizations => {
|
||||||
|
res.status(200).json({
|
||||||
|
organizations,
|
||||||
|
num_items: organizations.length,
|
||||||
|
max_orgs,
|
||||||
|
distribution: amount / organizations.length
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch(error => next(error));
|
||||||
|
};
|
||||||
|
|
||||||
|
// GET min and optimal amounts for the chosen causes + regions
|
||||||
|
exports.findOptimalBundleAmounts = (req, res, next) => {
|
||||||
|
const { num_causes, num_regions } = req.body;
|
||||||
|
|
||||||
|
const feature_factor = parseInt(num_causes) + parseFloat(num_regions / 2);
|
||||||
|
|
||||||
|
// calculate min amount for chosen causes and regions
|
||||||
|
const min_amount = Math.ceil(feature_factor * 15);
|
||||||
|
|
||||||
|
// calculate optimal for chosen causes and regions
|
||||||
|
const optimal_amount = Math.ceil(Math.pow(5, feature_factor));
|
||||||
|
|
||||||
|
res.status(200).json({
|
||||||
|
min_amount,
|
||||||
|
optimal_amount
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// POST create an organization
|
||||||
|
exports.createOrganization = async (req, res, next) => {
|
||||||
|
let {
|
||||||
|
name,
|
||||||
|
short_description,
|
||||||
|
|
||||||
|
primary_contact_email,
|
||||||
|
password,
|
||||||
|
|
||||||
|
address,
|
||||||
|
city,
|
||||||
|
country,
|
||||||
|
state,
|
||||||
|
zip,
|
||||||
|
|
||||||
|
primary_cause,
|
||||||
|
primary_region,
|
||||||
|
|
||||||
|
ein,
|
||||||
|
estimate_asset_value,
|
||||||
|
estimate_yearly_operating_cost,
|
||||||
|
|
||||||
|
is_nonprofit,
|
||||||
|
|
||||||
|
primary_contact_phone,
|
||||||
|
primary_contact_first_name,
|
||||||
|
primary_contact_last_name
|
||||||
|
} = req.body;
|
||||||
|
|
||||||
|
// primary_cause = primary_cause.trim().toLowerCase();
|
||||||
|
// primary_region = primary_region.trim().toLowerCase();
|
||||||
|
|
||||||
|
let transaction;
|
||||||
|
|
||||||
|
try {
|
||||||
|
transaction = await db.sequelize.transaction();
|
||||||
|
|
||||||
|
const orgs = await Organization.findAll({
|
||||||
|
where: { primary_contact_email }
|
||||||
|
});
|
||||||
|
|
||||||
|
if (orgs.length >= 1) {
|
||||||
|
return next(errorMaker(409, `Email Exists: ${primary_contact_email}`));
|
||||||
|
}
|
||||||
|
|
||||||
|
const CAUSE_QUERY = `SELECT name FROM causes
|
||||||
|
WHERE name = :primary_cause`;
|
||||||
|
const causes = await db.sequelize.query(CAUSE_QUERY, {
|
||||||
|
replacements: { primary_cause },
|
||||||
|
type: db.Sequelize.QueryTypes.SELECT
|
||||||
|
});
|
||||||
|
|
||||||
|
const REGION_QUERY = `SELECT name FROM regions
|
||||||
|
WHERE name = :primary_region`;
|
||||||
|
const regions = await db.sequelize.query(REGION_QUERY, {
|
||||||
|
replacements: { primary_region },
|
||||||
|
type: db.Sequelize.QueryTypes.SELECT
|
||||||
|
});
|
||||||
|
|
||||||
|
// cause or region not found
|
||||||
|
if (!causes.length || !regions.length) {
|
||||||
|
throw errorMaker(400, `No valid cause or region`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const saltRounds = await bcrypt.genSaltSync(10);
|
||||||
|
// hash with salt rounds
|
||||||
|
const hashedPass = await bcrypt.hashSync(password, saltRounds);
|
||||||
|
|
||||||
|
// Store hash in DB
|
||||||
|
const org = await Organization.create({
|
||||||
|
id: uuidv4(),
|
||||||
|
name,
|
||||||
|
short_description,
|
||||||
|
|
||||||
|
primary_contact_email,
|
||||||
|
password: hashedPass,
|
||||||
|
|
||||||
|
address,
|
||||||
|
city,
|
||||||
|
country,
|
||||||
|
state,
|
||||||
|
zip,
|
||||||
|
|
||||||
|
primary_cause,
|
||||||
|
primary_region,
|
||||||
|
|
||||||
|
ein,
|
||||||
|
estimate_asset_value,
|
||||||
|
estimate_yearly_operating_cost,
|
||||||
|
|
||||||
|
is_nonprofit,
|
||||||
|
|
||||||
|
primary_contact_phone,
|
||||||
|
primary_contact_first_name,
|
||||||
|
primary_contact_last_name
|
||||||
|
});
|
||||||
|
|
||||||
|
await transaction.commit();
|
||||||
|
|
||||||
|
return res.status(201).json({
|
||||||
|
message: 'Organization created',
|
||||||
|
org
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
await transaction.rollback();
|
||||||
|
next(error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// FETCH all organizations
|
||||||
|
exports.getAllOrganizations = (req, res, next) => {
|
||||||
|
Organization.findAll()
|
||||||
|
.then(organizations => {
|
||||||
|
res.status(200).json({
|
||||||
|
organizations,
|
||||||
|
number_items: organizations.length
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch(error => next(error));
|
||||||
|
};
|
||||||
|
|
||||||
|
// FETCH depending on the given search
|
||||||
|
exports.searchOrganizations = (req, res, next) => {
|
||||||
|
let { search } = req.params;
|
||||||
|
search = '%' + search + '%';
|
||||||
|
const limit = 10;
|
||||||
|
|
||||||
|
const QUERY = `SELECT * from organizations
|
||||||
|
WHERE name LIKE :search or
|
||||||
|
primary_cause LIKE :search or
|
||||||
|
primary_region LIKE :search
|
||||||
|
LIMIT :limit`;
|
||||||
|
db.sequelize
|
||||||
|
.query(QUERY, {
|
||||||
|
replacements: { search, limit },
|
||||||
|
type: db.Sequelize.QueryTypes.SELECT
|
||||||
|
})
|
||||||
|
.then(organizations => {
|
||||||
|
res.status(200).json({
|
||||||
|
organizations,
|
||||||
|
number_items: organizations.length
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch(error => next(error));
|
||||||
|
};
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
const db = require('../../../models'),
|
|
||||||
errorMaker = require('../../helpers/error.maker');
|
|
||||||
|
|
||||||
const { Grant, Cause, Region, Organization } = db;
|
|
||||||
|
|
||||||
// ADD a cause into the database
|
|
||||||
exports.create = (req, res, next) => {
|
|
||||||
const { name } = req.body;
|
|
||||||
|
|
||||||
Cause.create({ name })
|
|
||||||
.then(cause => {
|
|
||||||
res.status(200).json({
|
|
||||||
message: 'Cause created',
|
|
||||||
cause
|
|
||||||
});
|
|
||||||
})
|
|
||||||
.catch(error => next(error));
|
|
||||||
};
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
organization: require('./organization.controller'),
|
|
||||||
cause: require('./cause.controller'),
|
|
||||||
region: require('./region.controller')
|
|
||||||
};
|
|
||||||
@@ -1,116 +0,0 @@
|
|||||||
const db = require('../../../models'),
|
|
||||||
bcrypt = require('bcrypt-nodejs'),
|
|
||||||
errorMaker = require('../../helpers/error.maker'),
|
|
||||||
uuidv4 = require('uuid/v4');
|
|
||||||
|
|
||||||
const { Grant, Cause, Region, Organization } = db;
|
|
||||||
|
|
||||||
// POST create an organization
|
|
||||||
exports.create = async (req, res, next) => {
|
|
||||||
let {
|
|
||||||
name,
|
|
||||||
short_description,
|
|
||||||
|
|
||||||
primary_contact_email,
|
|
||||||
password,
|
|
||||||
|
|
||||||
address,
|
|
||||||
city,
|
|
||||||
country,
|
|
||||||
state,
|
|
||||||
zip,
|
|
||||||
|
|
||||||
primary_cause,
|
|
||||||
primary_region,
|
|
||||||
|
|
||||||
ein,
|
|
||||||
estimate_asset_value,
|
|
||||||
estimate_yearly_operating_cost,
|
|
||||||
|
|
||||||
is_nonprofit,
|
|
||||||
|
|
||||||
primary_contact_phone,
|
|
||||||
primary_contact_first_name,
|
|
||||||
primary_contact_last_name
|
|
||||||
} = req.body;
|
|
||||||
|
|
||||||
// primary_cause = primary_cause.trim().toLowerCase();
|
|
||||||
// primary_region = primary_region.trim().toLowerCase();
|
|
||||||
|
|
||||||
let transaction;
|
|
||||||
|
|
||||||
try {
|
|
||||||
transaction = await db.sequelize.transaction();
|
|
||||||
|
|
||||||
const orgs = await Organization.findAll({
|
|
||||||
where: { primary_contact_email }
|
|
||||||
});
|
|
||||||
|
|
||||||
if (orgs.length >= 1) {
|
|
||||||
return next(errorMaker(409, `Email Exists: ${primary_contact_email}`));
|
|
||||||
}
|
|
||||||
|
|
||||||
const CAUSE_QUERY = `SELECT name FROM causes
|
|
||||||
WHERE name = :primary_cause`;
|
|
||||||
const causes = await db.sequelize.query(CAUSE_QUERY, {
|
|
||||||
replacements: { primary_cause },
|
|
||||||
type: db.Sequelize.QueryTypes.SELECT
|
|
||||||
});
|
|
||||||
|
|
||||||
const REGION_QUERY = `SELECT name FROM regions
|
|
||||||
WHERE name = :primary_region`;
|
|
||||||
const regions = await db.sequelize.query(REGION_QUERY, {
|
|
||||||
replacements: { primary_region },
|
|
||||||
type: db.Sequelize.QueryTypes.SELECT
|
|
||||||
});
|
|
||||||
|
|
||||||
// cause or region not found
|
|
||||||
if (!causes.length || !regions.length) {
|
|
||||||
throw errorMaker(400, `No valid cause or region`);
|
|
||||||
}
|
|
||||||
|
|
||||||
const saltRounds = await bcrypt.genSaltSync(10);
|
|
||||||
// hash with salt rounds
|
|
||||||
const hashedPass = await bcrypt.hashSync(password, saltRounds);
|
|
||||||
|
|
||||||
// Store hash in DB
|
|
||||||
const org = await Organization.create({
|
|
||||||
id: uuidv4(),
|
|
||||||
name,
|
|
||||||
short_description,
|
|
||||||
|
|
||||||
primary_contact_email,
|
|
||||||
password: hashedPass,
|
|
||||||
|
|
||||||
address,
|
|
||||||
city,
|
|
||||||
country,
|
|
||||||
state,
|
|
||||||
zip,
|
|
||||||
|
|
||||||
primary_cause,
|
|
||||||
primary_region,
|
|
||||||
|
|
||||||
ein,
|
|
||||||
estimate_asset_value,
|
|
||||||
estimate_yearly_operating_cost,
|
|
||||||
|
|
||||||
is_nonprofit,
|
|
||||||
|
|
||||||
primary_contact_phone,
|
|
||||||
primary_contact_first_name,
|
|
||||||
primary_contact_last_name
|
|
||||||
});
|
|
||||||
|
|
||||||
await transaction.commit();
|
|
||||||
|
|
||||||
return res.status(201).json({
|
|
||||||
message: 'Organization created',
|
|
||||||
org
|
|
||||||
});
|
|
||||||
} catch (error) {
|
|
||||||
console.log(error);
|
|
||||||
await transaction.rollback();
|
|
||||||
next(error);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
const db = require('../../../models'),
|
|
||||||
errorMaker = require('../../helpers/error.maker');
|
|
||||||
|
|
||||||
const { Grant, Cause, Region, Organization } = db;
|
|
||||||
|
|
||||||
// ADD a region into the database
|
|
||||||
exports.create = (req, res, next) => {
|
|
||||||
const { name } = req.body;
|
|
||||||
|
|
||||||
Region.create({ name })
|
|
||||||
.then(region => {
|
|
||||||
res.status(200).json({
|
|
||||||
message: 'Region created',
|
|
||||||
region
|
|
||||||
});
|
|
||||||
})
|
|
||||||
.catch(error => next(error));
|
|
||||||
};
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
const db = require('../../../models'),
|
|
||||||
errorMaker = require('../../helpers/error.maker'),
|
|
||||||
textCleaner = require('../../helpers/text_cleaner');
|
|
||||||
|
|
||||||
const { Grant, Cause, Region, Organization } = db;
|
|
||||||
|
|
||||||
// FETCH all causes
|
|
||||||
exports.findAll = (req, res, next) => {
|
|
||||||
Cause.findAll()
|
|
||||||
.then(causes => {
|
|
||||||
causes = causes.map(cause => {
|
|
||||||
cause.name = textCleaner.titleCase(cause.name);
|
|
||||||
return cause;
|
|
||||||
});
|
|
||||||
|
|
||||||
res.status(200).json({
|
|
||||||
causes,
|
|
||||||
number_items: causes.length
|
|
||||||
});
|
|
||||||
})
|
|
||||||
.catch(error => next(error));
|
|
||||||
};
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
cause: require('./cause.controller'),
|
|
||||||
region: require('./region.controller'),
|
|
||||||
organization: require('./organization.controller'),
|
|
||||||
user: require('./user.controller')
|
|
||||||
};
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
const db = require('../../../models'),
|
|
||||||
errorMaker = require('../../helpers/error.maker');
|
|
||||||
|
|
||||||
const { Grant, Cause, Region, Organization } = db;
|
|
||||||
|
|
||||||
// FETCH all organizations
|
|
||||||
exports.findAll = (req, res, next) => {
|
|
||||||
Organization.findAll()
|
|
||||||
.then(organizations => {
|
|
||||||
res.status(200).json({
|
|
||||||
organizations,
|
|
||||||
number_items: organizations.length
|
|
||||||
});
|
|
||||||
})
|
|
||||||
.catch(error => next(error));
|
|
||||||
};
|
|
||||||
|
|
||||||
// FETCH depending on the given search
|
|
||||||
exports.searchOrgs = (req, res, next) => {
|
|
||||||
let { search } = req.params;
|
|
||||||
search = '%' + search + '%';
|
|
||||||
const limit = 10;
|
|
||||||
|
|
||||||
const QUERY = `SELECT * from organizations
|
|
||||||
WHERE name LIKE :search or
|
|
||||||
primary_cause LIKE :search or
|
|
||||||
primary_region LIKE :search
|
|
||||||
LIMIT :limit`;
|
|
||||||
db.sequelize
|
|
||||||
.query(QUERY, {
|
|
||||||
replacements: { search, limit },
|
|
||||||
type: db.Sequelize.QueryTypes.SELECT
|
|
||||||
})
|
|
||||||
.then(organizations => {
|
|
||||||
res.status(200).json({
|
|
||||||
organizations,
|
|
||||||
number_items: organizations.length
|
|
||||||
});
|
|
||||||
})
|
|
||||||
.catch(error => next(error));
|
|
||||||
};
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
const db = require('../../../models'),
|
|
||||||
errorMaker = require('../../helpers/error.maker'),
|
|
||||||
textCleaner = require('../../helpers/text_cleaner');
|
|
||||||
|
|
||||||
const { Grant, Cause, Region, Organization } = db;
|
|
||||||
|
|
||||||
// FETCH all regions
|
|
||||||
exports.findAll = (req, res, next) => {
|
|
||||||
Region.findAll()
|
|
||||||
.then(regions => {
|
|
||||||
regions = regions.map(region => {
|
|
||||||
region.name = textCleaner.titleCase(region.name);
|
|
||||||
return region;
|
|
||||||
});
|
|
||||||
|
|
||||||
res.status(200).json({
|
|
||||||
regions,
|
|
||||||
number_items: regions.length
|
|
||||||
});
|
|
||||||
})
|
|
||||||
.catch(error => next(error));
|
|
||||||
};
|
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
const db = require('../../models'),
|
||||||
|
errorMaker = require('../helpers/error.maker'),
|
||||||
|
textCleaner = require('../helpers/text_cleaner');
|
||||||
|
|
||||||
|
const { Grant, Cause, Region, Organization } = db;
|
||||||
|
|
||||||
|
// ADD a region into the database
|
||||||
|
exports.createRegion = (req, res, next) => {
|
||||||
|
const { name } = req.body;
|
||||||
|
|
||||||
|
Region.create({ name })
|
||||||
|
.then(region => {
|
||||||
|
res.status(200).json({
|
||||||
|
message: 'Region created',
|
||||||
|
region
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch(error => next(error));
|
||||||
|
};
|
||||||
|
|
||||||
|
// FETCH all regions
|
||||||
|
exports.getAllRegions = (req, res, next) => {
|
||||||
|
Region.findAll()
|
||||||
|
.then(regions => {
|
||||||
|
regions = regions.map(region => {
|
||||||
|
region.name = textCleaner.titleCase(region.name);
|
||||||
|
return region;
|
||||||
|
});
|
||||||
|
|
||||||
|
res.status(200).json({
|
||||||
|
regions,
|
||||||
|
number_items: regions.length
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch(error => next(error));
|
||||||
|
};
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
const db = require('../../../models'),
|
const db = require('../../models'),
|
||||||
errorMaker = require('../../helpers/error.maker');
|
errorMaker = require('../helpers/error.maker');
|
||||||
|
|
||||||
const stripe = require('stripe')(process.env.STRIPE_KEY);
|
const stripe = require('stripe')(process.env.STRIPE_KEY);
|
||||||
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
const db = require('../../../models'),
|
const db = require('../../models'),
|
||||||
errorMaker = require('../../helpers/error.maker');
|
errorMaker = require('../helpers/error.maker');
|
||||||
|
|
||||||
const { Grant, Cause, Region, Organization, User } = db;
|
const { Grant, Cause, Region, Organization, User } = db;
|
||||||
|
|
||||||
@@ -3,13 +3,10 @@ const express = require('express'),
|
|||||||
checkAuth = require('../middleware/check-auth'),
|
checkAuth = require('../middleware/check-auth'),
|
||||||
roles = require('../helpers/roles');
|
roles = require('../helpers/roles');
|
||||||
|
|
||||||
const controllers = require('../controllers/admin');
|
const { organization } = require('../controllers');
|
||||||
|
|
||||||
// Manual verification of a charity
|
// Manual verification of a charity
|
||||||
// TODO: Add checkAuth(roles.ADMIN) back into middleware
|
// TODO: Add checkAuth(roles.ADMIN) back into middleware
|
||||||
router.put(
|
router.put('/org/:charity_id', organization.verifyCharity);
|
||||||
'/org/:charity_id',
|
|
||||||
controllers.organization.verifyOrg
|
|
||||||
);
|
|
||||||
|
|
||||||
module.exports = router;
|
module.exports = router;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ const express = require('express'),
|
|||||||
router = express.Router(),
|
router = express.Router(),
|
||||||
checkAuth = require('../middleware/check-auth');
|
checkAuth = require('../middleware/check-auth');
|
||||||
|
|
||||||
const auth = require('../controllers/auth.controller.js');
|
const { auth } = require('../controllers');
|
||||||
|
|
||||||
// Check database for donor and get token with donor role
|
// Check database for donor and get token with donor role
|
||||||
router.post('/donor/login', auth.donorLogin);
|
router.post('/donor/login', auth.donorLogin);
|
||||||
|
|||||||
@@ -3,34 +3,30 @@ const express = require('express'),
|
|||||||
checkAuth = require('../middleware/check-auth'),
|
checkAuth = require('../middleware/check-auth'),
|
||||||
roles = require('../helpers/roles');
|
roles = require('../helpers/roles');
|
||||||
|
|
||||||
const controllers = require('../controllers/donor');
|
const { donor, grant, stripe, organization } = require('../controllers');
|
||||||
|
|
||||||
// POST donor signup
|
// POST donor signup
|
||||||
router.post('/', controllers.donor.create);
|
router.post('/', donor.createDonor);
|
||||||
|
|
||||||
// GET all Donors
|
// GET all Donors
|
||||||
router.get('/', checkAuth(roles.ADMIN), controllers.donor.findAll);
|
router.get('/', checkAuth(roles.ADMIN), donor.getAllDonors);
|
||||||
|
|
||||||
// GET grants with causes, regions, charities by donor_id
|
// GET grants with causes, regions, charities by donor_id
|
||||||
router.get('/grants/', checkAuth(roles.DONOR), controllers.grant.findByDonorId);
|
router.get('/grants/', checkAuth(roles.DONOR), grant.findGrantsByDonorId);
|
||||||
|
|
||||||
/** POST Create grants with following body:
|
/** POST Create grants with following body:
|
||||||
* - List of id's of selected causes, regions, charities
|
* - List of id's of selected causes, regions, charities
|
||||||
* - Monthly: true or false
|
* - Monthly: true or false
|
||||||
* - donor_id
|
* - donor_id
|
||||||
* */
|
* */
|
||||||
router.post(
|
router.post('/grants/', checkAuth(roles.DONOR), grant.createGrant);
|
||||||
'/grants/',
|
|
||||||
checkAuth(roles.DONOR),
|
|
||||||
controllers.grant.create
|
|
||||||
);
|
|
||||||
|
|
||||||
// DELETE a grant of a donor
|
// DELETE a grant of a donor
|
||||||
router.delete(
|
router.delete(
|
||||||
'/grants/',
|
'/grants/',
|
||||||
checkAuth(roles.DONOR),
|
checkAuth(roles.DONOR),
|
||||||
controllers.stripe.deleteGrant,
|
stripe.deleteGrant,
|
||||||
controllers.grant.delete
|
grant.deleteGrant
|
||||||
);
|
);
|
||||||
|
|
||||||
// POST to get suggested organizations to distribute to
|
// POST to get suggested organizations to distribute to
|
||||||
@@ -38,14 +34,14 @@ router.delete(
|
|||||||
router.post(
|
router.post(
|
||||||
'/organizations/',
|
'/organizations/',
|
||||||
checkAuth(roles.DONOR),
|
checkAuth(roles.DONOR),
|
||||||
controllers.organization.findSuggested
|
organization.findSuggestedCharities
|
||||||
);
|
);
|
||||||
|
|
||||||
// GET min and optimal amount to choose
|
// GET min and optimal amount to choose
|
||||||
router.get(
|
router.get(
|
||||||
'/organizations/amounts',
|
'/organizations/amounts',
|
||||||
checkAuth(roles.DONOR),
|
checkAuth(roles.DONOR),
|
||||||
controllers.organization.findAmounts
|
organization.findOptimalBundleAmounts
|
||||||
);
|
);
|
||||||
|
|
||||||
// // Retrieve a single Donor by Id
|
// // Retrieve a single Donor by Id
|
||||||
|
|||||||
@@ -3,19 +3,15 @@ const express = require('express'),
|
|||||||
checkAuth = require('../middleware/check-auth'),
|
checkAuth = require('../middleware/check-auth'),
|
||||||
roles = require('../helpers/roles');
|
roles = require('../helpers/roles');
|
||||||
|
|
||||||
const controllers = require('../controllers/organization');
|
const { organization, cause, region } = require('../controllers');
|
||||||
|
|
||||||
// Charity signup route
|
// Charity signup route
|
||||||
router.post('/', controllers.organization.create);
|
router.post('/', organization.createOrganization);
|
||||||
|
|
||||||
// Add cause
|
// // Add cause
|
||||||
router.post('/cause', checkAuth(roles.ORGANIZATION), controllers.cause.create);
|
// router.post('/cause', checkAuth(roles.ORGANIZATION), cause.createCause);
|
||||||
|
|
||||||
// Add region
|
// // Add region
|
||||||
router.post(
|
// router.post('/region', checkAuth(roles.ORGANIZATION), region.createRegion);
|
||||||
'/region',
|
|
||||||
checkAuth(roles.ORGANIZATION),
|
|
||||||
controllers.region.create
|
|
||||||
);
|
|
||||||
|
|
||||||
module.exports = router;
|
module.exports = router;
|
||||||
|
|||||||
@@ -1,27 +1,31 @@
|
|||||||
const express = require('express'),
|
const express = require('express'),
|
||||||
router = express.Router();
|
router = express.Router();
|
||||||
|
|
||||||
const controllers = require('../controllers/public');
|
const {
|
||||||
|
sendgrid,
|
||||||
const sgController = require('../controllers/sendgrid.controller');
|
cause,
|
||||||
|
region,
|
||||||
|
organization,
|
||||||
|
user
|
||||||
|
} = require('../controllers');
|
||||||
|
|
||||||
// Retrieve all causes
|
// Retrieve all causes
|
||||||
router.get('/causes', controllers.cause.findAll);
|
router.get('/causes', cause.getAllCauses);
|
||||||
|
|
||||||
// Retrieve all regions
|
// Retrieve all regions
|
||||||
router.get('/regions', controllers.region.findAll);
|
router.get('/regions', region.getAllRegions);
|
||||||
|
|
||||||
// Retrieve all organizations
|
// Retrieve all organizations
|
||||||
router.get('/organizations', controllers.organization.findAll);
|
router.get('/organizations', organization.getAllOrganizations);
|
||||||
|
|
||||||
// Retrieve charities based on inputted search
|
// Retrieve charities based on inputted search
|
||||||
// TODO: fix sql injection attack
|
// TODO: fix sql injection attack
|
||||||
router.get('/organizations/:search', controllers.organization.searchOrgs);
|
router.get('/organizations/:search', organization.searchOrganizations);
|
||||||
|
|
||||||
// Add user email to database from the landing page
|
// Add user email to database from the landing page
|
||||||
router.post('/users/landing', controllers.user.addEmail);
|
router.post('/users/landing', user.addEmail);
|
||||||
|
|
||||||
// Test sending an email
|
// Test sending an email
|
||||||
router.post('/email/test', sgController.testEmail);
|
router.post('/email/test', sendgrid.testEmail);
|
||||||
|
|
||||||
module.exports = router;
|
module.exports = router;
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
const express = require('express'),
|
|
||||||
router = express.Router(),
|
|
||||||
checkAuth = require('../middleware/check-auth'),
|
|
||||||
roles = require('../helpers/roles');
|
|
||||||
|
|
||||||
const controller = require('../controllers/donor/stripe.controller');
|
|
||||||
|
|
||||||
// POST create one time or monthly charge for grant
|
|
||||||
router.post('/donor/grant', checkAuth(roles.DONOR), controller.grantCharge);
|
|
||||||
|
|
||||||
// DELETE grant's plan under subscription
|
|
||||||
router.delete('/donor/grant', checkAuth(roles.DONOR), controller.deleteGrant);
|
|
||||||
|
|
||||||
module.exports = router;
|
|
||||||
@@ -70,8 +70,6 @@ app.use('/api/auth', require('./app/routes/auth.route.js'));
|
|||||||
app.use('/api', require('./app/routes/public.route.js'));
|
app.use('/api', require('./app/routes/public.route.js'));
|
||||||
//admin routes
|
//admin routes
|
||||||
app.use('/admin', require('./app/routes/admin.route'));
|
app.use('/admin', require('./app/routes/admin.route'));
|
||||||
//stripe routes
|
|
||||||
app.use('/api/stripe', require('./app/routes/stripe.route'));
|
|
||||||
|
|
||||||
//404 not found error handling on any other routes
|
//404 not found error handling on any other routes
|
||||||
app.use((req, res, next) => {
|
app.use((req, res, next) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user