Created
March 27, 2014 00:45
-
-
Save jeffharnois/9797357 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
advertiserRepository = require '../repositories/advertiserRepository' | |
campaignRepository = require '../repositories/campaignRepository' | |
orderRepository = require '../repositories/orderRepository' | |
userRepository = require '../repositories/userRepository' | |
otterRepository = require '../repositories/otterRepository' | |
_ = require 'lodash' | |
fs = require 'fs' | |
Step = require 'step' | |
moment = require 'moment' | |
targeting = require 'isocket-targeting' | |
campaignSecurity = require '../middleware/security/campaignSecurityMiddleware' | |
geoTree = {} | |
targeting.sync (err) -> | |
unless err | |
targeting.getType 'geo', (err, geos) -> | |
geoTree[g.uid] = g.name for g in geos | |
class Campaign | |
constructor: (app, middleware) -> | |
app.namespace '/campaigns', middleware, => | |
app.post '/', @createCampaign | |
app.namespace '/:id', campaignSecurity.secureId, => | |
app.get '/', @campaignById | |
app.put '/', @updateCampaign | |
app.post '/consideration_list_items', @addToConsiderationList | |
_validateCampaign: (req) -> | |
rightBeforeStartDate = moment(req.body.campaign.start).subtract('milliseconds', 1).format('YYYY-MM-DD') | |
req.assert('campaign.name', 'Name is required').notEmpty() | |
req.assert('campaign.manager_user_id', 'Manager is required').notEmpty() | |
req.assert('campaign.start', 'Start date is required').notEmpty().isDate() | |
req.assert('campaign.end', 'End date is required and must be after the start date').notEmpty().isDate().isAfter(rightBeforeStartDate) | |
createCampaign: (req, res, next) => | |
@_validateCampaign req | |
if (errors = req.validationErrors()) | |
res.json 400, errors[0].msg | |
else | |
req.body.campaign.buyerId = req.user.buyerId | |
cb = (err, resp) -> | |
if err then next err else res.json redirect: '/campaigns/' + resp | |
if req.body.productUid | |
campaignRepository.createCampaignWithConsideration req.user, | |
req.body.campaign, | |
req.body.propertyUid, | |
req.body.productUid, | |
cb | |
else | |
campaignRepository.createCampaign req.body.campaign, cb | |
updateCampaign: (req, res, next) => | |
@_validateCampaign req | |
if (errors = req.validationErrors()) | |
res.json 400, errors[0].msg | |
else | |
campaignRepository.updateCampaign req.params.id, req.body.campaign, (err, resp) -> | |
if err | |
next err | |
else | |
res.json success: true | |
campaignById: (req, res, next) -> | |
campaign = req.sclera.campaign # provided by security middleware | |
Step( | |
-> | |
campaignRepository.getCampaignPageDatums req.user, req.params.id, @parallel() | |
targeting.getType "fcap", @parallel() | |
advertiserRepository.findAll { | |
where: | |
buyerId: req.user.buyerId | |
attributes: ['id', 'companyName'] | |
}, @parallel() | |
userRepository.findAll { | |
where: | |
buyerId: req.user.buyerId | |
attributes: ['id', 'firstName', 'lastName'] | |
}, @parallel() | |
return | |
(err, campaignPageDatums, frequencyCaps, advertisers, managers) -> | |
return next err if err | |
[otters, creativeSizesMap, productsMap, propertiesMap] = campaignPageDatums | |
mediaPlan = [] | |
considerationList = [] | |
for otter in otters | |
if otter.isInMediaPlan | |
mediaPlan.push otter | |
else | |
considerationList.push otter | |
advertiser = _.findWhere advertisers, id: campaign.advertiserId | |
if advertiser | |
campaign.advertiserName = advertiser.companyName | |
campaign.advertisers = advertisers | |
campaign.managers = managers | |
res.render 'campaigns/show', | |
campaign: campaign | |
geoTree: geoTree | |
# consideration list | |
considerationList: considerationList | |
frequencyCaps: frequencyCaps | |
creativeSizesMap: creativeSizesMap | |
productsMap: productsMap | |
propertiesMap: propertiesMap | |
mediaPlan: mediaPlan | |
# edit campaign modal | |
advertisers: advertisers | |
managers: managers | |
form_action: '/campaigns/' + req.params.id | |
) | |
addToConsiderationList: (req, res, next) -> | |
req.assert('propertyUid', 'Invalid property').notEmpty().is(/^P-*/) | |
req.assert('productUid', 'Invalid product').notEmpty().is(/^PR-*/) | |
if (errors = req.validationErrors()) | |
res.json 400, errors[0].msg | |
else | |
campaignRepository.addProductToCampaign req.user, | |
req.body.propertyUid, | |
req.body.productUid, | |
req.params.id, | |
(err) -> if err then next(err) else res.send req.body | |
module.exports = Campaign |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment