Skip to content

Commit

Permalink
Changed delighted behavior.
Browse files Browse the repository at this point in the history
  • Loading branch information
basicer committed Mar 8, 2017
1 parent cf85324 commit 1619569
Show file tree
Hide file tree
Showing 6 changed files with 194 additions and 27 deletions.
31 changes: 28 additions & 3 deletions server/delighted.coffee
@@ -1,8 +1,12 @@
config = require '../server_config'
request = require 'request'
log = require 'winston'
Prepaid = require './models/Prepaid'
Classroom = require './models/Classroom'
TrialRequest = require './models/TrialRequest'
co = require 'co'

DELIGHTED_EMAIL_DELAY = 10 * 86400 # in seconds
DELIGHTED_EMAIL_DELAY = 7 * 86400 # in seconds

isTargetedCountry = (country) ->
if /^u\.s\.?(\.a)?\.?$|^us$|usa|america|united states/ig.test(country)
Expand All @@ -19,7 +23,7 @@ isTargetedCountry = (country) ->

return false

module.exports.maybeAddDelightedUser = addDelightedUser = (user, trialRequest) ->
module.exports.maybeAddDelightedUser = addDelightedUser = (user, trialRequest, status='new') ->
props = trialRequest.get('properties')
return unless trialRequest.get('type') is 'course'
return unless isTargetedCountry props.country
Expand All @@ -34,12 +38,33 @@ module.exports.maybeAddDelightedUser = addDelightedUser = (user, trialRequest) -
testGroupNumber: user.get('testGroupNumber')
gender: user.get('gender')
lastLevel: user.get('lastLevel')
status: status
state: if props.nces_id and props.country is 'USA' then props.state else 'other'

@postPeople(form)
module.exports.postPeople(form)

module.exports.postPeople = (form) ->
console.log "Would post", JSON.stringify(form)
return unless key = config.mail.delightedAPIKey
request.post {uri: "https://#{key}:@api.delightedapp.com/v1/people.json", form: form}, (err, res, body) ->
return log.error 'Error sending Delighted request:', err or body if err or /error/i.test body
#log.info "Got DelightedApp response: #{body}"

module.exports.checkTriggerClassroomCreated = (user) ->
# Check if the user has exactly one classrom, if so, queue the email
co () ->
count = yield Classroom.find(ownerID: user._id).count()
return unless count is 1
trialRequest = yield TrialRequest.findOne({applicant: user._id})
return unless trialRequest?
addDelightedUser user, trialRequest, 'engaged'

module.exports.checkTriggerPrepaidAdded = (user, type) ->
# Check if the this is the first prepaid added to an account, if so, queue the email
co () ->
count = yield Prepaid.find(creator: user._id).count()
return unless count is 1
trialRequest = yield TrialRequest.findOne({applicant: user._id})
return unless trialRequest?
status = if type is 'starter_license' then 'paid starter' else 'paid full'
addDelightedUser user, trialRequest, status
2 changes: 2 additions & 0 deletions server/middleware/classrooms.coffee
Expand Up @@ -18,6 +18,7 @@ CourseInstance = require '../models/CourseInstance'
TrialRequest = require '../models/TrialRequest'
sendwithus = require '../sendwithus'
co = require 'co'
delighted = require '../delighted'

module.exports =
fetchByCode: wrap (req, res, next) ->
Expand Down Expand Up @@ -235,6 +236,7 @@ module.exports =
# finish
database.validateDoc(classroom)
classroom = yield classroom.save()
yield delighted.checkTriggerClassroomCreated(req.user)
res.status(201).send(classroom.toObject({req: req}))

updateCourses: wrap (req, res) ->
Expand Down
4 changes: 4 additions & 0 deletions server/middleware/prepaids.coffee
Expand Up @@ -15,6 +15,8 @@ StripeUtils = require '../lib/stripe_utils'
Promise.promisifyAll(StripeUtils)
moment = require 'moment'
slack = require '../slack'
delighted = require '../delighted'

{ STARTER_LICENSE_COURSE_IDS } = require '../../app/core/constants'
{formatDollarValue} = require '../../app/core/utils'

Expand All @@ -41,6 +43,8 @@ module.exports =
prepaid.set('redeemers', [])
database.validateDoc(prepaid)
yield prepaid.save()
if req.body.creator
yield delighted.checkTriggerPrepaidAdded user, req.body.type
res.status(201).send(prepaid.toObject())


Expand Down
1 change: 0 additions & 1 deletion server/middleware/trial-requests.coffee
Expand Up @@ -28,7 +28,6 @@ module.exports =
trialRequest.set 'type', attrs.type
database.validateDoc(trialRequest)
trialRequest = yield trialRequest.save()
delighted.maybeAddDelightedUser(req.user, trialRequest)
res.status(201).send(trialRequest.toObject({req: req}))

put: wrap (req, res) ->
Expand Down
160 changes: 160 additions & 0 deletions spec/server/functional/delighted.spec.coffee
@@ -0,0 +1,160 @@
require '../common'
utils = require '../utils'
_ = require 'lodash'
Promise = require 'bluebird'
User = require '../../../server/models/User'
TrialRequest = require '../../../server/models/TrialRequest'
Prepaid = require '../../../server/models/Prepaid'
Classroom = require '../../../server/models/Classroom'
Course = require '../../../server/models/Course'
CourseInstance = require '../../../server/models/CourseInstance'
Campaign = require '../../../server/models/Campaign'
LevelSession = require '../../../server/models/LevelSession'
Level = require '../../../server/models/Level'
request = require '../request'
delighted = require '../../../server/delighted'
co = require 'co'

trialRequestFixture = {
type: 'course'
properties:
location: 'SF, CA'
age: '14-17'
numStudents: 14
heardAbout: 'magical interwebs'
firstName: 'First'
lastName: 'Last'
}

setupTeacher = co.wrap (trialRequestData) ->
fixture = _.cloneDeep(trialRequestData)
user = yield utils.initUser({gender: 'male', lastLevel: 'abcd', preferredLanguage: 'en', testGroupNumber: 1, role: 'teacher'})
yield utils.loginUser(user)
fixture.properties.email ?= user.get('email')
fixture.properties.country ?= 'USA'
fixture.type ?= 'course'
[res, body] = yield request.postAsync(getURL('/db/trial.request'), { json: fixture })
expect(delighted.postPeople).not.toHaveBeenCalled()
user

makeClassroom = co.wrap (user, name) ->
data = { name: name }
[res, body] = yield request.postAsync {uri: getURL('/db/classroom'), json: data }
expect(res.statusCode).toBe(201)
expect(res.body.name).toBe(name)
expect(res.body.members.length).toBe(0)
expect(res.body.ownerID).toBe(user.id)

describe 'delighted', ->

beforeEach utils.wrap ->
yield utils.clearModels([User, TrialRequest, User, Classroom, Course, Level, Campaign])

admin = yield utils.initAdmin()
yield utils.loginUser(admin)

campaignJSON = { name: 'Campaign', levels: {} }

[res, body] = yield request.postAsync({uri: getURL('/db/campaign'), json: campaignJSON})
@campaign = yield Campaign.findById(res.body._id)
@course = Course({name: 'Course', campaignID: @campaign._id, releasePhase: 'released'})
yield @course.save()

spyOn(delighted, 'postPeople')

it 'no longer creates a profile trial creation', utils.wrap ->
@user = yield setupTeacher trialRequestFixture


it 'creates a profile when the first class is created', utils.wrap ->
@user = yield setupTeacher trialRequestFixture

# Add class one
yield makeClassroom @user, "Classroom 1"
expect(delighted.postPeople).toHaveBeenCalled()
delightedProps = delighted.postPeople.calls.first().args[0]

expect(delightedProps.delay).toBe(3600 * 24 * 7)
expect(delightedProps.properties.status).toBe('engaged')

# Add reset
delighted.postPeople.calls.reset()

#Add class two
yield makeClassroom @user, "Classroom 2"
expect(delighted.postPeople).not.toHaveBeenCalled()

it 'does not create a profile in Germany', utils.wrap ->
fixture = _.cloneDeep(trialRequestFixture)
fixture.properties.country = 'Germany'
@user = yield setupTeacher fixture
yield makeClassroom @user, "Classroom 1"
expect(delighted.postPeople).not.toHaveBeenCalled()

it 'creates a profile when the first course prepaid is added', utils.wrap ->
@user = yield setupTeacher trialRequestFixture
admin = yield utils.initAdmin()
yield utils.loginUser(admin)

[res, body] = yield request.postAsync({url: getURL('/db/prepaid'), json: {
type: 'course'
creator: @user.id
}})
expect(res.statusCode).toBe(201)
prepaid = yield Prepaid.findById(res.body._id)
expect(prepaid).toBeDefined()
expect(prepaid.get('creator').equals(@user._id)).toBe(true)
expect(prepaid.get('code')).toBeDefined()

expect(delighted.postPeople).toHaveBeenCalled()
delightedProps = delighted.postPeople.calls.first().args[0]
expect(delightedProps.delay).toBe(3600 * 24 * 7)
expect(delightedProps.properties.status).toBe('paid full')

delighted.postPeople.calls.reset()

[res, body] = yield request.postAsync({url: getURL('/db/prepaid'), json: {
type: 'course'
creator: @user.id
}})
expect(res.statusCode).toBe(201)
prepaid = yield Prepaid.findById(res.body._id)
expect(prepaid).toBeDefined()
expect(prepaid.get('creator').equals(@user._id)).toBe(true)
expect(prepaid.get('code')).toBeDefined()

expect(delighted.postPeople).not.toHaveBeenCalled()

it 'creates a profile when the first starter prepaid is added', utils.wrap ->
@user = yield setupTeacher trialRequestFixture
admin = yield utils.initAdmin()
yield utils.loginUser(admin)

[res, body] = yield request.postAsync({url: getURL('/db/prepaid'), json: {
type: 'starter_license'
creator: @user.id
}})
expect(res.statusCode).toBe(201)
prepaid = yield Prepaid.findById(res.body._id)
expect(prepaid).toBeDefined()
expect(prepaid.get('creator').equals(@user._id)).toBe(true)
expect(prepaid.get('code')).toBeDefined()

expect(delighted.postPeople).toHaveBeenCalled()
delightedProps = delighted.postPeople.calls.first().args[0]
expect(delightedProps.delay).toBe(3600 * 24 * 7)
expect(delightedProps.properties.status).toBe('paid starter')

delighted.postPeople.calls.reset()

[res, body] = yield request.postAsync({url: getURL('/db/prepaid'), json: {
type: 'starter_license'
creator: @user.id
}})
expect(res.statusCode).toBe(201)
prepaid = yield Prepaid.findById(res.body._id)
expect(prepaid).toBeDefined()
expect(prepaid.get('creator').equals(@user._id)).toBe(true)
expect(prepaid.get('code')).toBeDefined()

expect(delighted.postPeople).not.toHaveBeenCalled()
23 changes: 0 additions & 23 deletions spec/server/functional/trial_request.spec.coffee
Expand Up @@ -91,29 +91,6 @@ describe 'POST /db/trial.request', ->
expect(count).toBe(1)
done()

it 'creates a delighted profile in the US', utils.wrap (done) ->
@user = yield utils.initUser({gender: 'male', lastLevel: 'abcd', preferredLanguage: 'de', testGroupNumber: 1})
yield utils.loginUser(@user)
fixture.properties.email = @user.get('email')
fixture.properties.country = 'USA'
fixture.type = 'course'
[res, body] = yield request.postAsync(getURL('/db/trial.request'), { json: fixture })
expect(delighted.postPeople).toHaveBeenCalled()
args = delighted.postPeople.calls.argsFor(0)
expect(args[0]?.email).toBe(@user.get('email'))
expect(args[0]?.name).toBe('First Last')
done()

it 'doesnt create a delighted profile in Germany', utils.wrap (done) ->
@user = yield utils.initUser({gender: 'male', lastLevel: 'abcd', preferredLanguage: 'de', testGroupNumber: 1})
yield utils.loginUser(@user)
fixture.properties.email = @user.get('email')
fixture.properties.country = 'Germany'
fixture.type = 'course'
[res, body] = yield request.postAsync(getURL('/db/trial.request'), { json: fixture })
expect(delighted.postPeople).not.toHaveBeenCalled()
done()

describe 'GET /db/trial.request', ->

beforeEach utils.wrap (done) ->
Expand Down

0 comments on commit 1619569

Please sign in to comment.