Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions dist/src/controllers/account.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
const account_1 = __importDefault(require("../models/account"));
const block_1 = __importDefault(require("../models/block"));
const crm_1 = __importDefault(require("../services/crm"));
const mailer_1 = __importDefault(require("../services/mailer"));
const logger_1 = __importDefault(require("../services/logger"));
const eventTracker_1 = __importDefault(require("../services/eventTracker"));
const recaptcha = __importStar(require("../services/recaptcha"));
// Logger setup
const logger = new logger_1.default('Account Controller');
Expand All @@ -54,7 +54,7 @@ class AccountController {
yield _account.store();
const { contactEmail } = params;
void crm_1.default.addNewUser(contactEmail, _account.uuid);
void mailer_1.default.sendWelcomeEmail(contactEmail, _account.uuid, _account.name);
void eventTracker_1.default.trackSignup(contactEmail, _account.uuid, _account.name);
logger.logAndSlack(`Account created for ${contactEmail}: ${_account.uuid}`);
return _account.uuid;
}
Expand Down
2 changes: 2 additions & 0 deletions dist/src/interfaces/plunkEvent.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
14 changes: 14 additions & 0 deletions dist/src/services/__mocks__/eventTracker.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
const EventTracker = {
trackSignup: jest.fn(() => __awaiter(void 0, void 0, void 0, function* () { })),
};
module.exports = EventTracker;
55 changes: 55 additions & 0 deletions dist/src/services/eventTracker.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const axios_1 = __importDefault(require("axios"));
const logger_1 = __importDefault(require("./logger"));
class EventTracker {
constructor(plunkEvent) {
this.apiKey = process.env.EVENT_TRACKING_API_KEY;
this.plunkEndpoint = 'https://next-api.useplunk.com/v1/track';
this.logger = new logger_1.default('Event Tracker');
const { email, event, data } = plunkEvent;
this.email = email;
this.event = event;
this.data = data;
}
static trackSignup(email, pantryID, pantryName) {
const _event = {
email,
event: 'pantry.created',
data: { pantryID, pantryName },
};
void new EventTracker(_event).track();
}
track() {
return __awaiter(this, void 0, void 0, function* () {
try {
yield (0, axios_1.default)({
method: 'POST',
headers: {
'Authorization': `Bearer ${this.apiKey}`,
'Content-Type': 'application/json',
},
url: this.plunkEndpoint,
data: { email: this.email, event: this.event, data: this.data },
});
this.logger.info(`Successfully tracked event ${this.event} for ${this.email}`);
}
catch (error) {
this.logger.info(`Failed to track event ${this.event} for ${this.email}: ${error}`);
}
});
}
}
exports.default = EventTracker;
1 change: 1 addition & 0 deletions env.sample
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ SLACK_LOG_WEBHOOK="string"
CRYPTO_KEY="32 Byte string"
CRYPTO_IV="16 Byte string"
MAILER_API_KEY='string'
EVENT_TRACKING_API_KEY='string'
WELCOME_TEMPLATE_ID='string
ACCOUNT_ERRORS_EMAIL_ID='string'
AIRTABLE_API_TOKEN='string'
Expand Down
4 changes: 2 additions & 2 deletions src/controllers/account.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
import Account from '../models/account'
import Block from '../models/block'
import Crm from '../services/crm'
import Mailer from '../services/mailer'
import logService from '../services/logger'
import EventTracker from '../services/eventTracker'
import * as recaptcha from '../services/recaptcha'

// Interfaces
Expand All @@ -29,7 +29,7 @@ class AccountController {

const { contactEmail } = params
void Crm.addNewUser(contactEmail, _account.uuid)
void Mailer.sendWelcomeEmail(contactEmail, _account.uuid, _account.name)
void EventTracker.trackSignup(contactEmail, _account.uuid, _account.name)

logger.logAndSlack(`Account created for ${contactEmail}: ${_account.uuid}`)
return _account.uuid
Expand Down
8 changes: 8 additions & 0 deletions src/interfaces/plunkEvent.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
export interface IPlunkEvent {
email: string,
event: string,
data: {
pantryID: string,
pantryName: string
}
}
5 changes: 5 additions & 0 deletions src/services/__mocks__/eventTracker.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
const EventTracker = {
trackSignup: jest.fn(async () => { }),
}

export = EventTracker
50 changes: 50 additions & 0 deletions src/services/eventTracker.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import axios from 'axios'

import { IPlunkEvent } from '../interfaces/plunkEvent'
import logService from './logger'

class EventTracker {
private apiKey: string = process.env.EVENT_TRACKING_API_KEY
private plunkEndpoint: string = 'https://next-api.useplunk.com/v1/track'
private logger = new logService('Event Tracker')
private email: string
private event: string
private data: unknown

public constructor(plunkEvent: IPlunkEvent) {
const { email, event, data } = plunkEvent
this.email = email
this.event = event
this.data = data
}

public static trackSignup(email: string, pantryID: string,
pantryName: string): void {
const _event: IPlunkEvent = {
email,
event: 'pantry.created',
data: { pantryID, pantryName },
}
void new EventTracker(_event).track()
}


public async track(): Promise<void> {
try {
await axios({
method: 'POST',
headers: {
'Authorization': `Bearer ${this.apiKey}`,
'Content-Type': 'application/json',
},
url: this.plunkEndpoint,
data: { email: this.email, event: this.event, data: this.data },
})
this.logger.info(`Successfully tracked event ${this.event} for ${this.email}`)
} catch (error) {
this.logger.info(`Failed to track event ${this.event} for ${this.email}: ${error}`)
}
}
}

export default EventTracker
8 changes: 4 additions & 4 deletions tests/controllers/account.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
import AccountController from '../../src/controllers/account'
import Account from '../../src/models/account'
import Crm from '../../src/services/crm'
import Mailer from '../../src/services/mailer'
import EventTracker from '../../src/services/eventTracker'
import * as dataStore from '../../src/services/dataStore'
import * as recaptcha from '../../src/services/recaptcha'

jest.mock('../../src/services/dataStore')
jest.mock('../../src/services/mailer')
jest.mock('../../src/services/eventTracker')
jest.mock('../../src/services/crm')
jest.mock('../../src/services/recaptcha')

Expand Down Expand Up @@ -61,8 +61,8 @@ describe('When creating an account', () => {
expect(_uuid).toBeDefined()
})

it ('sends a welcome email', async () => {
const _spy = jest.spyOn(Mailer, 'sendWelcomeEmail')
it ('tracks signup as an event', async () => {
const _spy = jest.spyOn(EventTracker, 'trackSignup')

const _uuid: string = await AccountController.create(_newAccountParams)

Expand Down
Loading