Skip to content

Instantly share code, notes, and snippets.

@jeffharnois
Created March 27, 2014 00:45
Show Gist options
  • Save jeffharnois/9797357 to your computer and use it in GitHub Desktop.
Save jeffharnois/9797357 to your computer and use it in GitHub Desktop.
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