@speakr/speakr-module-services
Version:
SPEAKR Shared Service Module
515 lines (501 loc) • 17.6 kB
JavaScript
"use strict";
const db = require("../../db/");
module.exports = {
index,
byNetworkIdHash,
indexWithAssociations,
byId,
byIdHash,
list,
byInitiativeId,
reportByIdHash
};
function index(options) {
return db.campaigns
.findAll()
.then(campaigns => {
if (!!campaigns) {
options.campaigns = campaigns;
return Promise.resolve(options);
} else {
return Promise.resolve(options);
}
})
.catch(err => {
return Promise.reject(err);
});
}
function byNetworkIdHash(options) {
return db.networks
.find({
where: { id_hash: options.req.params.network_id_hash },
attributes: ["id"]
})
.then(network => {
if (!network) {
return Promise.reject({
code: 404,
message: `Could not find the network with the network id hash of ${
options.req.params.network_id_hash
}`,
purpose: "Network id hash could not be found"
});
}
const network_id = network.dataValues.id;
const where = { network_id: network_id };
return db.campaigns
.findAll({
order: "created_at desc",
where: where,
include: [
db.brands,
db.agencies,
{ model: db.networks, attributes: ["id_hash"] }
]
})
.then(campaigns => {
if (!!campaigns) {
options.campaigns = campaigns;
return Promise.resolve(options);
} else {
return Promise.resolve(options);
}
})
.catch(err => {
console.log(error);
return Promise.reject({
code: 400,
message: `Could not find any campaigns for the network id hash of ${
options.req.params.network_id_hash
}`,
purpose: "Network has no campaigns"
});
});
});
}
function indexWithAssociations(options) {
return db.networks
.find({
where: { id_hash: options.req.headers.networkidhash },
attributes: ["id"]
})
.then(n => {
const network_id = n.dataValues.id;
const where = network_id === 1 ? {} : { network_id: network_id };
return db.campaigns
.findAll({
order: "created_at desc",
where: where,
include: [
{
model: db.initiatives,
required: false,
include: [db.platforms, db.statuses]
},
{
model: db.contacts
},
{
model: db.networks
},
{
model: db.agencies,
required: false
},
{
model: db.brands,
required: false
}
]
})
.then(campaigns => {
if (!!campaigns) {
options.campaigns = campaigns;
return Promise.resolve(options);
} else {
return Promise.resolve(options);
}
})
.catch(err => {
return Promise.reject(err);
});
});
}
function byId(options) {
let where = { id: options.req.id };
if (options.req.headers.networkidhash) {
return db.networks
.find({
where: { id_hash: options.req.headers.networkidhash },
attributes: ["id"]
})
.then(n => {
const network_id = n.dataValues.id;
let where = {
id: options.req.id,
network_id: network_id
};
return db.campaigns
.findOne({
where,
include: [
{
model: db.initiatives,
required: false,
include: [db.platforms, db.statuses]
},
{
model: db.contacts
},
{
model: db.brands,
required: true
},
{
model: db.agencies,
required: true
}
]
})
.then(campaigns => {
if (!!campaigns) {
options.campaigns = campaigns;
return Promise.resolve(options);
} else {
return Promise.resolve(options);
}
})
.catch(err => {
return Promise.reject(err);
});
});
} else {
let where = {
id: options.req.id
};
return db.campaigns
.findOne({
where,
include: [
{
model: db.initiatives,
required: false,
include: [db.platforms, db.statuses]
},
{
model: db.contacts
},
{
model: db.brands,
required: true
},
{
model: db.agencies,
required: true
}
]
})
.then(campaigns => {
if (!!campaigns) {
options.campaigns = campaigns;
return Promise.resolve(options);
} else {
return Promise.resolve(options);
}
})
.catch(err => {
return Promise.reject(err);
});
}
}
function byIdHash(options) {
if (options.req.headers.networkidhash) {
return db.networks
.find({
where: { id_hash: options.req.headers.networkidhash },
attributes: ["id"]
})
.then(n => {
const network_id = n.dataValues.id;
let where;
if (options.req.headers.networkidhash === "PrqitYPaJK") {
where = {
id_hash: options.req.params.id_hash
};
} else {
where = {
id_hash: options.req.params.id_hash,
network_id: network_id
};
}
return db.campaigns
.findOne({
where,
include: [
{
model: db.initiatives,
required: false,
include: [db.platforms, db.statuses]
},
{
model: db.contacts
},
{
model: db.point_of_contacts
},
{
model: db.brands,
required: true
},
{
model: db.agencies,
required: true
}
]
})
.then(campaigns => {
if (!!campaigns) {
options.campaigns = campaigns;
return Promise.resolve(options);
} else {
return Promise.resolve(options);
}
})
.catch(err => {
return Promise.reject(err);
});
});
} else {
let where = {
id_hash: options.req.params.id_hash
};
return db.campaigns
.findOne({
where,
include: [
{
model: db.initiatives,
required: false,
include: [db.platforms, db.statuses]
},
{
model: db.contacts
},
{
model: db.point_of_contacts
},
{
model: db.brands,
required: true
},
{
model: db.agencies,
required: true
}
]
})
.then(campaigns => {
if (!!campaigns) {
options.campaigns = campaigns;
return Promise.resolve(options);
} else {
return Promise.resolve(options);
}
})
.catch(err => {
return Promise.reject(err);
});
}
}
function list(options) {
if (options.req.headers.networkidhash) {
return db.networks
.find({
where: { id_hash: options.req.headers.networkidhash },
attributes: ["id", "title"],
order: "title asc"
})
.then(n => {
const where =
n.dataValues.id === 1
? null
: { where: { network_id: n.dataValues.id } };
return db.campaigns
.findAll(where)
.then(campaigns => {
if (!!campaigns) {
options.campaigns = campaigns;
return Promise.resolve(options);
} else {
return Promise.resolve(options);
}
})
.catch(err => {
return Promise.reject(err);
});
});
} else {
return db.campaigns
.findAll({
attributes: ["id", "title"],
order: "title asc"
})
.then(campaigns => {
if (!!campaigns) {
options.campaigns = campaigns;
return Promise.resolve(options);
} else {
return Promise.resolve(options);
}
})
.catch(err => {
return Promise.reject(err);
});
}
}
function byInitiativeId(options) {
const id = options.initiatives.dataValues
? options.initiatives.dataValues.campaign_id
: options.initiatives.campaign_id;
const where = { id };
return db.campaigns
.findOne({ where })
.then(campaign => {
if (!campaign) throw new Error("no campaign");
options.campaigns = campaign.dataValues
? campaign.dataValues
: campaign;
return options;
})
.catch(err => {
return Promise.reject({
code: 404,
message: "Can not find campaign",
purpose: err.message
});
});
}
function reportByIdHash(options) {
if (
options.req.headers.networkidhash &&
!options.req.params.public_report
) {
return db.networks
.find({
where: { id_hash: options.req.headers.networkidhash },
attributes: ["id"]
})
.then(n => {
const network_id = n.dataValues.id;
let where = {
id_hash: options.req.params.id_hash,
network_id: network_id
};
return db.campaigns
.findOne({
where: { id_hash: options.req.params.id_hash },
include: [
db.campaign_reports_custom,
{
model: db.initiatives,
required: false,
include: [db.platforms, db.statuses]
}
]
})
.then(campaign => {
if (!!campaign) {
options.campaigns = campaign;
return db.tracking_stats
.findAll({
where: {
campaign_id_hash: campaign.id_hash
}
})
.then(stats => {
options.tracking_stats = stats || [];
return options;
});
} else {
return options;
}
})
.then(options => {
const creative_id_hashes = options.tracking_stats
? options.tracking_stats.map(
stat => stat.creative_id_hash
)
: [];
return db.creatives
.findAll({
where: {
id_hash: {
$in: creative_id_hashes
}
},
include: [db.initiatives]
})
.then(creatives => {
if (creatives) {
options.creatives = creatives;
return options;
} else {
Promise.resolve(options);
}
});
})
.catch(err => {
return Promise.reject(err);
});
});
} else {
return db.campaigns
.findOne({
where: { id_hash: options.req.params.id_hash },
include: [
db.campaign_reports_custom,
{
model: db.initiatives,
required: false,
include: [db.platforms, db.statuses]
}
]
})
.then(campaign => {
if (!!campaign) {
options.campaigns = campaign;
return db.tracking_stats
.findAll({
where: { campaign_id_hash: campaign.id_hash }
})
.then(stats => {
options.tracking_stats = stats || [];
return options;
});
} else {
return options;
}
})
.then(options => {
const creative_id_hashes = options.tracking_stats.length
? options.tracking_stats.map(stat => stat.creative_id_hash)
: [];
return db.creatives
.findAll({
where: { id_hash: { $in: creative_id_hashes } },
include: [db.initiatives]
})
.then(creatives => {
if (creatives) {
options.creatives = creatives;
return options;
} else {
Promise.resolve(options);
}
});
})
.catch(err => {
return Promise.reject(err);
});
}
}