UNPKG

@speakr/speakr-module-services

Version:
188 lines (173 loc) • 5.82 kB
'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; } }) }