@speakr/speakr-module-services
Version:
SPEAKR Shared Service Module
224 lines (190 loc) • 5.31 kB
JavaScript
"use strict";
const db = require('../../db/');
module.exports = {
index,
byId,
byIdHash,
byInitiativeIdHash,
byIdHashSingle,
byPage,
byAccountId,
byIdOrCreate,
byInitiativeIdHashIncludeDeleted
};
function index(options) {
let where = { id_hash: options.req.params.id_hash };
return db.invites.findOne({ where })
.then(invites => {
options.invites = invites;
return Promise.resolve(options);
})
}
function byId(options, id) {
let where = { id: options ? options.req.body.id : id };
return db.invites.findOne({ where, include: [db.accounts] })
.then(invites => {
options.invites = invites;
return Promise.resolve(options);
})
}
function byIdHash(options) {
let where = { id_hash: options.req.params.id_hash };
return db.invites.findOne({ where, include: [db.accounts, {
model: db.initiatives,
where: { initiative_status_id: 2 },
required: true,
include: [db.platforms, { model: db.campaigns, required: true, include: [db.brands, db.point_of_contacts] }, db.networks]
}, db.creatives]})
.then(invites => {
options.invites = invites;
return Promise.resolve(options);
})
}
function byInitiativeIdHash(options) {
let where = { id_hash: options.req.params.id_hash };
return db.initiatives.findOne({ where })
.then(initiatives => {
options.initiatives = initiatives;
let where = { initiative_id: initiatives.id };
return db.invites.findAll({
where,
include: [
{
model: db.accounts,
include: [
{ model: db.accounts_networks }
]
}
]})
.then(invites => {
options.invites = invites;
return Promise.resolve(options)
})
}).catch(err => {
console.log(err);
});
}
function byInitiativeIdHashIncludeDeleted(options) {
let where = { id_hash: options.req.params.id_hash };
return db.initiatives.findOne({ where })
.then(initiatives => {
options.initiatives = initiatives;
let where = { initiative_id: initiatives.id };
return db.invites.findAll({
where,
include: [
{
model: db.accounts,
include: [
{ model: db.accounts_networks }
]
}
],
paranoid: false})
.then(invites => {
options.invites = invites;
return Promise.resolve(options)
})
}).catch(err => {
console.log(err);
});
}
function byIdHashSingle(options) {
const where = { id_hash: options.req.params.id_hash };
return db.invites.findOne({ where })
.then(invite => {
if(!invite) throw new Error('Invite not found with ID_HASH');
options.invites = invite.dataValues ? invite.dataValues : invite;
return Promise.resolve(options);
})
.catch(err => {
return Promise.reject(err)
})
}
function byPage(options) {
let page = options.page || 1;
let offset = (page - 1) * 50;
let order = [];
switch (options.sort) {
case 'Biggest Offer':
order = [['offer_price', 'DESC NULLS LAST']];
break;
case 'Ending Soon':
order = [db.Sequelize.literal('"invites"."initiative.end_date" ASC')];
break;
default:
order = [['updated_at', 'DESC']];
break;
}
let accountIds = options.accounts.map(account => account.id);
let where = { account_id: { $in: accountIds } };
let totalCount = null;
return db.invites.findAndCountAll({
where: where,
order: order,
paranoid: true,
include: [{
model: db.initiatives,
required: true,
paranoid: false,
where: db.Sequelize.literal('initiative.end_date > CURRENT_TIMESTAMP AND initiative.initiative_status_id = 2'),
include: [{ model: db.campaigns, required: true, paranoid: false }]
}],
limit: 50,
offset: offset
})
.then(invites => {
totalCount = invites.count;
return db.invites.findAll({
where: {id: {$in: invites.rows.map(i => i.id)}},
order: order,
include: [{
model: db.initiatives,
paranoid: false,
include: [{ model: db.campaigns, paranoid: false, include: [db.brands] }, db.platforms, db.networks]
}, db.creatives, db.accounts]
})
})
.then(invites => {
if(!!invites) {
options.invites = {count: totalCount, rows: invites};
return Promise.resolve(options);
} else {
return Promise.resolve(options);
}
})
.catch(err => {
return Promise.reject(err);
});
}
function byAccountId(options){
const ids = options.accounts.map(account => account.id);
return db.invites.findAll({
where: { account_id: {
$in: ids
}}
}).then(invites => {
options.invites = invites;
return options;
})
}
function byIdOrCreate(id, account_id, initiative_id) {
if(!id) {
return db.invites.create({
account_id: account_id,
initiative_id: initiative_id,
offer_price: 1
});
}
return db.invites.findOne({where: {id: id}})
.then(invite => {
if(!invite) {
return db.invites.create({
account_id: account_id,
initiative_id: initiative_id,
offer_price: 1
});
}
return invite;
})
}