Skip to content

Commit

Permalink
feat: added Segment track for CLI scripts (#2617)
Browse files Browse the repository at this point in the history
* feat: added Segment track for CLI scripts

* refactor: refactoring after review

* refactor: refactoring after review

* refactor: refactoring after review

* refactor: code refactoring
  • Loading branch information
PKulkoRaccoonGang authored Nov 9, 2023
1 parent 56836f0 commit 9af9a64
Show file tree
Hide file tree
Showing 8 changed files with 62 additions and 80 deletions.
3 changes: 3 additions & 0 deletions bin/paragon-scripts.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ const helpCommand = require('../lib/help');
const buildTokensCommand = require('../lib/build-tokens');
const replaceVariablesCommand = require('../lib/replace-variables');
const buildScssCommand = require('../lib/build-scss');
const { sendTrackInfo } = require('../utils');

const COMMANDS = {
/**
Expand Down Expand Up @@ -181,9 +182,11 @@ const COMMANDS = {

try {
await executor.executor(commandArgs);
sendTrackInfo('openedx.paragon.cli-command.used', { command, status: 'success' });
} catch (error) {
// eslint-disable-next-line no-console
console.error(chalk.red.bold('An error occurred:', error.message));
sendTrackInfo('openedx.paragon.cli-command.used', { command, status: 'error', errorMsg: error.message });
process.exit(1);
}
})();
4 changes: 2 additions & 2 deletions component-generator/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,17 @@ const path = require('path');
const { COMPONENT_FILES } = require('./constants');
const {
validateComponentName,
sendTrackInfo,
createFile,
addComponentToExports,
addComponentToGit,
} = require('./utils');
const { sendTrackInfo } = require('../utils');

program
.argument('<ComponentName>', 'Component must have a name', validateComponentName)
.action((componentName) => {
// send data to analytics
sendTrackInfo(componentName);
sendTrackInfo('openedx.paragon.functions.track-generate-component.created', { componentName });
const componentDir = path.resolve(__dirname, `../src/${componentName}`);
// create directory for the component files
fs.mkdirSync(componentDir);
Expand Down
21 changes: 0 additions & 21 deletions component-generator/utils.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
const { InvalidOptionArgumentError } = require('commander');
const fs = require('fs');
const path = require('path');
const axios = require('axios');
const { exec } = require('child_process');
require('dotenv').config();

Expand Down Expand Up @@ -32,25 +31,6 @@ function validateComponentName(value) {
return value;
}

/**
* Sends request to the Netlify function to inform about generate-component usage.
* @param {string} componentName - component name
*/
function sendTrackInfo(componentName) {
const { BASE_URL, TRACK_ANONYMOUS_ANALYTICS } = process.env;
if (TRACK_ANONYMOUS_ANALYTICS) {
const url = `${BASE_URL}/.netlify/functions/trackGenerateComponent`;
axios.post(url, { componentName })
.then(result => {
// eslint-disable-next-line no-console
console.log(`Track info is successfully sent (status ${result.status})`);
}).catch(error => {
// eslint-disable-next-line no-console
console.log(`Track info request failed (${error})`);
});
}
}

/**
* Creates a file for the component based on the template.
* Note that 'componentName' string is a reserved placeholder,
Expand Down Expand Up @@ -97,7 +77,6 @@ function addComponentToGit(componentName) {
}

exports.validateComponentName = validateComponentName;
exports.sendTrackInfo = sendTrackInfo;
exports.createFile = createFile;
exports.addComponentToExports = addComponentToExports;
exports.addComponentToGit = addComponentToGit;
41 changes: 3 additions & 38 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
},
"dependencies": {
"@popperjs/core": "^2.11.4",
"axios": "^0.27.2",
"bootstrap": "^4.6.2",
"chalk": "^4.1.2",
"child_process": "^1.0.2",
Expand Down Expand Up @@ -125,7 +126,6 @@
"@types/uuid": "^9.0.0",
"@typescript-eslint/eslint-plugin": "^5.22.0",
"@typescript-eslint/parser": "^5.22.0",
"axios": "^0.27.2",
"axios-mock-adapter": "^1.21.1",
"babel-jest": "^28.1.2",
"babel-loader": "^8.2.4",
Expand Down
23 changes: 23 additions & 0 deletions utils.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
const axios = require('axios');

/**
* Sends request to the Netlify function to inform about specified event.
* @param {string} eventId - tracking event id
* @param {object} properties - tracking properties
*/
function sendTrackInfo(eventId, properties) {
const { BASE_URL, TRACK_ANONYMOUS_ANALYTICS } = process.env;
if (TRACK_ANONYMOUS_ANALYTICS) {
const url = `${BASE_URL}/.netlify/functions/sendTrackData`;
axios.post(url, { eventId, properties })
.then(result => {
// eslint-disable-next-line no-console
console.log(`Track info is successfully sent (status ${result.status})`);
}).catch(error => {
// eslint-disable-next-line no-console
console.log(`Track info request failed (${error})`);
});
}
}

module.exports = { sendTrackInfo };
23 changes: 23 additions & 0 deletions www/netlify/functions/sendAnalyticsData.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
const { v4: uuidv4 } = require('uuid');
const Analytics = require('analytics-node');

const analytics = new Analytics(process.env.SEGMENT_KEY);

exports.handler = async function eventHandler(event) {
// Only allow POST
if (event.httpMethod !== 'POST') {
return { statusCode: 405, body: 'Method Not Allowed' };
}
const { eventId, properties } = JSON.parse(event.body);
// dispatch event to Segment
analytics.track({
anonymousId: uuidv4(),
event: eventId,
properties,
});

return {
statusCode: 200,
body: JSON.stringify({ success: true }),
};
};
25 changes: 7 additions & 18 deletions www/netlify/functions/trackGenerateComponent.js
Original file line number Diff line number Diff line change
@@ -1,23 +1,12 @@
const { v4: uuidv4 } = require('uuid');
const Analytics = require('analytics-node');

const analytics = new Analytics(process.env.SEGMENT_KEY);
const { handler: actualHandler } = require('./sendAnalyticsData');

exports.handler = async function eventHandler(event) {
// Only allow POST
if (event.httpMethod !== 'POST') {
return { statusCode: 405, body: 'Method Not Allowed' };
}
const { componentName } = JSON.parse(event.body);
// dispatch event to Segment
analytics.track({
anonymousId: uuidv4(),
event: 'openedx.paragon.functions.track-generate-component.created',
properties: { componentName },
const body = JSON.parse(event.body);
event.body = JSON.stringify({
...body,
eventId: 'openedx.paragon.functions.track-generate-component.created',
properties: { componentName: body.componentName },
});

return {
statusCode: 200,
body: JSON.stringify({ success: true }),
};
return actualHandler(event);
};

0 comments on commit 9af9a64

Please sign in to comment.