@speakr/speakr-module-services
Version:
SPEAKR Shared Service Module
188 lines (173 loc) • 5.82 kB
JavaScript
'use strict';
const db = require('../../db');
const _ = require('lodash');
module.exports = {
byId,
byPage,
allByPage,
allById,
byIdHash
};
function byPage(options) {
let page = options.page || 1;
let offset = (page - 1) * 50;
let order = null;
let initiativeWhere = {};
switch (options.sort) {
case 'Expired':
order = [db.Sequelize.literal('"creatives"."invite.initiative.end_date" DESC')];
initiativeWhere = ['end_date < CURRENT_TIMESTAMP'];
break;
case 'In Review':
order = [db.Sequelize.literal("creatives.submission_status = 'In review' DESC, creatives.submission_status = 'Published' DESC, creatives.submission_status = 'Approved' DESC, creatives.submission_status = 'Rejected' DESC"), ["updated_at", "DESC"]];
break;
case 'Approved':
order = [db.Sequelize.literal("creatives.submission_status = 'Approved' DESC, creatives.submission_status = 'In review' DESC, creatives.submission_status = 'Published' DESC, creatives.submission_status = 'Rejected' DESC"), ["updated_at", "DESC"]];
break;
case 'Rejected':
order = [db.Sequelize.literal("creatives.submission_status = 'Rejected' DESC, creatives.submission_status = 'In review' DESC, creatives.submission_status = 'Published' DESC, creatives.submission_status = 'Approved' DESC"), ["updated_at", "DESC"]];
break;
default:
order = [["updated_at", "DESC"]];
break;
}
let accountIds = options.accounts.map(account => account.id);
let where = { account_id: { $in: accountIds }, submission_status: {$not: null} };
return db.creatives.findAndCountAll({
where: where,
order: order,
include: [db.accounts, {model: db.invites, required: true,
paranoid: false, include: [{
model: db.initiatives,
where: initiativeWhere,
required: true,
paranoid: false,
include: [db.platforms, { model: db.campaigns, required: true, paranoid: false, include: [db.brands] }, db.networks]
}, db.creatives, db.accounts]}],
limit: 50,
offset: offset
})
.then(creatives => {
if(!!creatives) {
options.creatives = creatives;
return Promise.resolve(options);
} else {
return Promise.resolve(options);
}
})
.catch(err => {
return Promise.reject(err);
});
}
function allByPage(page) {
let offset = (page - 1) * 50 || 0;
let date = new Date().setFullYear(new Date().getFullYear() - 1);
let startDate = new Date(date);
return db.creatives.findAll({
where: {created_at: {$gt: startDate}},
order: [['created_at', 'DESC'], [db.creatives_statuses, 'created_at', 'DESC']],
include: [
{model: db.creatives_statuses, include: [db.creatives_status_types]},
{model: db.creatives_notes},
{model: db.invites, required: true},
{
model: db.accounts,
required: true,
include: [db.metrics, db.accounts_categories, db.influencers, db.accounts_networks]
},
{
model: db.initiatives, where: {initiative_status_id: 2}, required: true, include: [
{model: db.platforms},
{model: db.campaigns, required: true, include: [db.brands, db.agencies]}]
}
]
}).then(creatives => {
let listEnd = Math.min(offset + 50, creatives.length);
const total_followers = _.sumBy(creatives, function(c) {
return Number(c.account.metric.followers);
});
const total_offer_price = _.sumBy(creatives, function(c) {
return Number(c.invite.offer_price);
});
const total_xe = _.sumBy(creatives, function(c) {
return Number(c.account.metric.xe);
});
const total_xoe = _.sumBy(creatives, function(c) {
return Number(c.account.metric.xoe);
});
const total_xcpe = total_offer_price / total_xe;
return {
total_followers,
total_offer_price,
total_xe,
total_xcpe,
total_xoe,
records_count: creatives.length,
info: `showing records ${offset} - ${listEnd} of ${creatives.length}`,
records: creatives.slice(offset, listEnd) };
})
}
function byId(id) {
return db.creatives.findOne({
where: {id: id},
include: [
{model: db.creatives_statuses, include: [db.creatives_status_types]},
{model: db.creatives_notes},
{model: db.invites, required: true},
{
model: db.accounts,
required: true,
include: [db.metrics, db.accounts_categories, db.influencers, db.accounts_networks]
},
{
model: db.initiatives, required: true, include: [
{model: db.platforms},
{model: db.networks},
{
model: db.campaigns, include: [
{model: db.brands},
{model: db.agencies}
]
}
]
}
]
})
}
function allById(ids) {
return db.creatives.findAll({
where: {id: {$in: ids}},
order: [['created_at', 'DESC']],
include: [
{model: db.creatives_notes, paranoid: false},
{model: db.invites, required: true},
{model: db.accounts,
required: true,
include: [db.metrics, {model: db.accounts_categories, required: false}, db.influencers, db.accounts_networks]
},
{ model: db.initiatives, required: true, include: [
{model: db.platforms},
{model: db.campaigns, include: [
{model: db.brands},
{model: db.agencies}
]}]
}]
})
}
function byIdHash(options) {
const id_hash = options.req.params.id_hash;
return db.creatives.findOne({
where: {id_hash},
include: [{model: db.initiatives, include: [db.networks]}]
})
.then(creative => {
if(!creative) throw new Error({
code: 404,
message: 'Creative Not Found'
});
if(!!creative){
options.creatives = creative;
return options;
}
})
}