Skip to content

Commit

Permalink
add cookieparser middleware, add parse parseUtmString to Mautic, add …
Browse files Browse the repository at this point in the history
…utm fields to the mautic record in addUserSteps
  • Loading branch information
serdiukov-o-nordwhale committed Sep 8, 2020
1 parent 141d50c commit bf80b37
Show file tree
Hide file tree
Showing 9 changed files with 180 additions and 123 deletions.
212 changes: 100 additions & 112 deletions package-lock.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions package.json
Expand Up @@ -65,6 +65,7 @@
"bip39-light": "^1.0.7",
"body-parser": "^1.19.0",
"convict": "^4.4.1",
"cookie-parser": "^1.4.5",
"cors": "^2.8.5",
"cron": "^1.8.2",
"cross-fetch": "^3.0.3",
Expand Down
3 changes: 3 additions & 0 deletions src/server/__util__/index.js
Expand Up @@ -8,6 +8,9 @@ const web3 = new Web3()

const { networkId } = ContractsAddress[conf.network]

export const utmString =
'utmcsr=twitter|utmcmd=banner|utmccn=Test_campaign_name_%3A-)|utmctr=test-term|utmcct=test-contant'

export const getCreds = async (random = false) => {
let randomCreds = {}
//0x7ac080f6607405705aed79675789701a48c76f55
Expand Down
25 changes: 25 additions & 0 deletions src/server/mautic/__tests__/mauticAPI.js
Expand Up @@ -4,6 +4,7 @@

import { Mautic } from '../mauticAPI'
import conf from '../../server.config'
import { utmString } from '../../__util__'

describe('Send', () => {
var mauticId = ''
Expand Down Expand Up @@ -90,4 +91,28 @@ describe('Send', () => {
})
)
})

it('should parse utm tags', () => {
const tags = Mautic.parseUtmString(utmString)

expect(tags).toEqual({
utm_source: 'twitter',
utm_medium: 'banner',
utm_campaign: 'Test_campaign_name_:-)',
utm_term: 'test-term',
utm_content: 'test-contant'
})
})

it('should skip empty tags', () => {
const tags = Mautic.parseUtmString('utmcsr=|utmcmd=(not set)|utmccn=(not%20set)|utmctr=test-term')

expect(tags).toEqual({ utm_term: 'test-term' })
})

it('should skip unknown tags', () => {
const tags = Mautic.parseUtmString('utmtest=test|utmctr=test-term')

expect(tags).toEqual({ utm_term: 'test-term' })
})
})
25 changes: 25 additions & 0 deletions src/server/mautic/mauticAPI.js
Expand Up @@ -9,6 +9,14 @@ import requestTimeout from '../utils/timeout'

// TODO: use axios instead
export const Mautic = new (class {
tagsMap = {
utmctr: 'utm_term',
utmcct: 'utm_content',
utmcsr: 'utm_source',
utmcmd: 'utm_medium',
utmccn: 'utm_campaign'
}

constructor(config, log) {
const { mauticURL, mauticBasicToken, mauticToken } = config

Expand Down Expand Up @@ -44,6 +52,23 @@ export const Mautic = new (class {
})
}

parseUtmString(utmString) {
const { tagsMap } = this

return (utmString || '').split('|').reduce((tags, record) => {
const [name, value] = record.split('=')
const tagValue = decodeURIComponent(value)

if (name in tagsMap && tagValue && '(not set)' !== tagValue) {
const mappedName = tagsMap[name]

tags[mappedName] = tagValue
}

return tags
}, {})
}

async contactExists(mauticId) {
const { baseHeaders, log } = this
let isExists = true
Expand Down
5 changes: 4 additions & 1 deletion src/server/server-middlewares.js
Expand Up @@ -2,8 +2,10 @@
import express, { Router } from 'express'
import type { NextFunction } from 'express'
import bodyParser from 'body-parser'
import cookieParser from 'cookie-parser'
import cors from 'cors'
import { version as contractsVersion } from '@gooddollar/goodcontracts/package.json'

import addLoginMiddlewares from './login/login-middleware'
import { setup as addGunMiddlewares, GunDBPublic } from './gun/gun-middleware'
import UserDBPrivate from './db/mongo/user-privat-provider'
Expand All @@ -18,7 +20,6 @@ import VerificationAPI from './verification/verification'
import createDisposeEnrollmentsTask from './verification/cron/DisposeEnrollmentsTask'
import addClaimQueueMiddlewares from './claimQueue/claimQueueAPI'
import { fishInactiveTask, collectFundsTask } from './blockchain/stakingModelTasks'
import conf from './server.config'
import AdminWallet from './blockchain/AdminWallet'
import requestTimeout from './utils/timeout'

Expand All @@ -41,6 +42,8 @@ export default (app: Router, env: any) => {
app.use(express.json({ limit: '100mb', extended: true }))
// parse application/json
app.use(bodyParser.json({ limit: '100mb' }))
// parse UTM cookies
app.use(cookieParser())

app.options(cors())
app.use(cors())
Expand Down
6 changes: 4 additions & 2 deletions src/server/storage/__tests__/storage.js
Expand Up @@ -6,7 +6,7 @@ import UserDBPrivate from '../../db/mongo/user-privat-provider'
import type { UserRecord } from '../../../imports/types'

import addUserSteps from '../addUserSteps'
import { getCreds } from '../../__util__'
import { getCreds, utmString } from '../../__util__'

jest.setTimeout(30000)

Expand Down Expand Up @@ -44,8 +44,10 @@ describe('storageAPI', () => {
test('check updateMauticRecord', async () => {
const creds = await getCreds()
const userRecord = { ...creds, ...user }
await addUserSteps.updateMauticRecord(userRecord, console)

await addUserSteps.updateMauticRecord(userRecord, utmString, console)
const mauticId = await UserDBPrivate.getUserField(user.identifier, 'mauticId')

expect(mauticId).toBeTruthy()
})

Expand Down
20 changes: 15 additions & 5 deletions src/server/storage/addUserSteps.js
Expand Up @@ -40,8 +40,8 @@ const addUserToWhiteList = async (userRecord: UserRecord, logger: any) => {
}
}

const updateMauticRecord = async (userRecord: UserRecord, logger: any) => {
const fieldsForMautic = pick(userRecord, [
const updateMauticRecord = async (userRecord: UserRecord, utmString: string, logger: any) => {
const userFields = pick(userRecord, [
'fullName',
'mobile',
'email',
Expand All @@ -50,14 +50,24 @@ const updateMauticRecord = async (userRecord: UserRecord, logger: any) => {
'regMethod',
'torusProvider'
])
const nameParts = get(userRecord, 'fullName', '').split(' ')
fieldsForMautic.firstName = nameParts[0]
fieldsForMautic.lastName = nameParts.length > 1 && nameParts.pop()

const utmFields = Mautic.parseUtmString(utmString)
const [firstName, lastName] = get(userFields, 'fullName', '').split(' ')

const fieldsForMautic = {
firstName,
lastName,
...userFields,
...utmFields
}

const mauticRecord = await Mautic.createContact(fieldsForMautic).catch(e => {
logger.error('updateMauticRecord Create Mautic Record Failed', e.message, e, { fieldsForMautic, userRecord })
throw e
})

const mauticId = get(mauticRecord, 'contact.id', userRecord.mauticId)

await UserDBPrivate.updateUser({ identifier: userRecord.identifier, mauticId })
logger.debug('updateMauticRecord user mautic record updated', { fieldsForMautic, userRecord, mauticId, mauticRecord })

Expand Down
6 changes: 3 additions & 3 deletions src/server/storage/storageAPI.js
Expand Up @@ -27,9 +27,9 @@ const setup = (app: Router, gunPublic: StorageAPI, storage: StorageAPI) => {
wrapAsync(async (req, res) => {
const { env, skipEmailVerification, disableFaceVerification, mauticBasicToken, mauticToken } = conf
const isNonDevelopMode = process.env.NODE_ENV !== 'development'
const { body, user: userRecord } = req
const { cookies, body, log: logger, user: userRecord } = req
const { user: userPayload = {} } = body
const logger = req.log
const { __utmzz: utmString = '' } = cookies

logger.debug('new user request:', { data: userPayload, userRecord })

Expand Down Expand Up @@ -113,7 +113,7 @@ const setup = (app: Router, gunPublic: StorageAPI, storage: StorageAPI) => {

if (isNonDevelopMode || mauticBasicToken || mauticToken) {
const p3 = addUserSteps
.updateMauticRecord(userRecordWithPII, logger)
.updateMauticRecord(userRecordWithPII, utmString, logger)
.then(r => logger.debug('updateMauticRecord success'))
.catch(e => {
logger.error('updateMauticRecord failed', e.message, e, { userRecordWithPII })
Expand Down

0 comments on commit bf80b37

Please sign in to comment.