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
6 changes: 3 additions & 3 deletions plugins/alerts/api/alertModules/cohorts.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ const commonLib = require("../parts/common-lib.js");
const { ObjectId } = require('mongodb');

module.exports.check = async function({ alertConfigs: alert, done, scheduledTo: date }) {
const app = await common.db.collection("apps").findOne({ _id: ObjectId(alert.selectedApps[0]) });
const app = await common.readBatcher.getOne("apps", { _id: new ObjectId(alert.selectedApps[0]) });
if (!app) {
log.e(`App ${alert.selectedApps[0]} couldn't be found`);
return done();
Expand All @@ -22,7 +22,7 @@ module.exports.check = async function({ alertConfigs: alert, done, scheduledTo:

if (compareType === commonLib.COMPARE_TYPE_ENUM.MORE_THAN) {
if (metricValue > compareValue) {
await commonLib.trigger({ alert, app, metricValue, date });
await commonLib.trigger({ alert, app, metricValue, date }, log);
}
}
else {
Expand All @@ -38,7 +38,7 @@ module.exports.check = async function({ alertConfigs: alert, done, scheduledTo:
: change <= -compareValue;

if (shouldTrigger) {
await commonLib.trigger({ alert, app, date, metricValue, metricValueBefore });
await commonLib.trigger({ alert, app, date, metricValue, metricValueBefore }, log);
}
}

Expand Down
8 changes: 4 additions & 4 deletions plugins/alerts/api/alertModules/dataPoints.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ module.exports.check = async function({ alertConfigs: alert, done, scheduledTo:
const selectedApp = alert.selectedApps[0];
let apps;
if (selectedApp === "all") {
apps = await common.db.collection("apps").find().toArray();
apps = await common.readBatcher.getMany("apps", {});
}
else {
apps = [await common.db.collection("apps").findOne({ _id: ObjectId(selectedApp) })];
apps = [await common.readBatcher.getOne("apps", { _id: new ObjectId(selectedApp) })];
}

for (let app of apps) {
Expand All @@ -33,7 +33,7 @@ module.exports.check = async function({ alertConfigs: alert, done, scheduledTo:

if (compareType === commonLib.COMPARE_TYPE_ENUM.MORE_THAN) {
if (metricValue > compareValue) {
await commonLib.trigger({ alert, app, metricValue, date });
await commonLib.trigger({ alert, app, metricValue, date }, log);
}
}
else {
Expand All @@ -49,7 +49,7 @@ module.exports.check = async function({ alertConfigs: alert, done, scheduledTo:
: change <= -compareValue;

if (shouldTrigger) {
await commonLib.trigger({ alert, app, date, metricValue, metricValueBefore });
await commonLib.trigger({ alert, app, date, metricValue, metricValueBefore }, log);
}
}
}
Expand Down
14 changes: 4 additions & 10 deletions plugins/alerts/api/alertModules/events.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,8 @@ const METRIC_TO_PROPERTY_MAP = {

const AVERAGE_METRICS = ["average sum", "average duration"];

/**
* Alert triggering logic
* @param {Alert} alert - alert document
* @param {function} done - callback function
* @param {Date} date - scheduled date for the alert (job.next)
*/
module.exports.check = async({ alertConfigs: alert, done, scheduledTo: date }) => {
const app = await common.db.collection("apps").findOne({ _id: ObjectId(alert.selectedApps[0]) });
const app = await common.readBatcher.getOne("apps", { _id: new ObjectId(alert.selectedApps[0]) });
if (!app) {
log.e(`App ${alert.selectedApps[0]} couldn't be found`);
return done();
Expand All @@ -55,7 +49,7 @@ module.exports.check = async({ alertConfigs: alert, done, scheduledTo: date }) =

if (compareType === commonLib.COMPARE_TYPE_ENUM.MORE_THAN) {
if (metricValue > compareValue) {
await commonLib.trigger({ alert, app, metricValue, date });
await commonLib.trigger({ alert, app, metricValue, date }, log);
}
}
else {
Expand All @@ -81,7 +75,7 @@ module.exports.check = async({ alertConfigs: alert, done, scheduledTo: date }) =
: change <= -compareValue;

if (shouldTrigger) {
await commonLib.trigger({ alert, app, date, metricValue, metricValueBefore });
await commonLib.trigger({ alert, app, date, metricValue, metricValueBefore }, log);
}
}
done();
Expand All @@ -97,7 +91,7 @@ module.exports.getEventMetricByDate = getEventMetricByDate;
* @param {string} metric - c, s, dur
* @param {Date} date - date of the value you're looking for
* @param {string} period - hourly|daily|monthly
* @param {object} segments - segmentation filter. e.g. {Category:"Electronics"}
* @param {object=} segments - segmentation filter. e.g. {Category:"Electronics"}
* @returns {Promise<number|undefined>} - a promise resolves to metric value or undefined
*/
async function getEventMetricByDate(app, event, metric, date, period, segments) {
Expand Down
39 changes: 22 additions & 17 deletions plugins/alerts/api/alertModules/nps.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,9 @@ module.exports.triggerByEvent = triggerByEvent;
*/
async function triggerByEvent(payload) {
const allEvents = payload?.events;
const appKey = payload?.app_key;
if (!Array.isArray(allEvents) || !appKey) {
return;
}
const app = payload?.app;

const app = await common.db.collection("apps").findOne({ key: appKey });
if (!app) {
if (!Array.isArray(allEvents) || !app) {
return;
}

Expand All @@ -34,22 +30,28 @@ async function triggerByEvent(payload) {
);

for (let event of validNPSEvents) {
const alert = await common.db.collection("alerts").findOne({
const alerts = await common.readBatcher.getMany("alerts", {
selectedApps: app._id.toString(),
alertDataSubType2: event.segmentation.widget_id,
alertDataType: "nps",
alertDataSubType: commonLib.TRIGGERED_BY_EVENT.nps,
});
if (!alert) {

if (!alerts || !alerts.length) {
continue;
}

await commonLib.trigger({ alert, app, date: new Date }, log);
// trigger all alerts
await Promise.all(alerts.map(alert => commonLib.trigger({
alert,
app,
date: new Date,
}, log)));
}
}

module.exports.check = async function({ alertConfigs: alert, done, scheduledTo: date }) {
const app = await common.db.collection("apps").findOne({ _id: ObjectId(alert.selectedApps[0]) });
const app = await common.readBatcher.getOne("apps", { _id: new ObjectId(alert.selectedApps[0]) });
if (!app) {
log.e(`App ${alert.selectedApps[0]} couldn't be found`);
return done();
Expand All @@ -62,7 +64,7 @@ module.exports.check = async function({ alertConfigs: alert, done, scheduledTo:

if (compareType === commonLib.COMPARE_TYPE_ENUM.MORE_THAN) {
if (metricValue > compareValue) {
await commonLib.trigger({ alert, app, metricValue, date });
await commonLib.trigger({ alert, app, metricValue, date }, log);
}
}
else {
Expand All @@ -78,7 +80,7 @@ module.exports.check = async function({ alertConfigs: alert, done, scheduledTo:
: change <= -compareValue;

if (shouldTrigger) {
await commonLib.trigger({ alert, app, date, metricValue, metricValueBefore });
await commonLib.trigger({ alert, app, date, metricValue, metricValueBefore }, log);
}
}

Expand All @@ -91,7 +93,7 @@ module.exports.check = async function({ alertConfigs: alert, done, scheduledTo:
* @param {string} nps - _id of the from feedback_widgets
* @param {Date} date - date of the value you're looking for
* @param {string} period - hourly|daily|monthly
* @param {string} score - detractor|passive|promoter
* @param {string=} score - detractor|passive|promoter
* @returns {Promise<number|undefined>} - a promise resolves to metric value or undefined
*/
async function getResponsesByDate(app, nps, date, period, score) {
Expand Down Expand Up @@ -132,13 +134,16 @@ async function getResponsesByDate(app, nps, date, period, score) {
* Calculates the sum of all valid responses inside a nps{app_id} date record.
* @param {object} scope - object scope: Daily or hourly object from db
* @param {string} nps - feedback_widgets _id
* @param {string} score - detractor|passive|promoter
* @param {string=} score - detractor|passive|promoter
* @returns {number|undefined} - number of valid responses
*/
function sumOfAllResponses(scope, nps, score) {
if (!scope) {
return;
}
if (!score) {
score = "detractor|passive|promoter";
}

const recordKeyReg = new RegExp("\\*\\*\\d{1,2}\\*\\*" + nps + "\\*\\*(" + score + ")$");
let numberOfResponses;
Expand All @@ -161,9 +166,9 @@ function sumOfAllResponses(scope, nps, score) {

/*
(async function() {
const app = { _id: ObjectId("65c1f875a12e98a328d5eb9e"), timezone: "Europe/Istanbul" };
const nps = "65c383fcb46a4d172d7c5911";
const date = new Date("2024-02-07T12:00:00.000Z");
const app = {name: "test", _id: new ObjectId("6600901a71159e99a3434253"), timezone: "Europe/Istanbul", plugins: null };
const nps = "6600909ed476e1837317dc52";
const date = new Date("2024-09-16T12:00:00.000Z");

let data = await getResponsesByDate(app, nps, date, "monthly");
console.log("monthly:", data);
Expand Down
26 changes: 14 additions & 12 deletions plugins/alerts/api/alertModules/rating.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,9 @@ module.exports.triggerByEvent = triggerByEvent;
*/
async function triggerByEvent(payload) {
const allEvents = payload?.events;
const appKey = payload?.app_key;
if (!Array.isArray(allEvents) || !appKey) {
return;
}
const app = payload?.app;

const app = await common.db.collection("apps").findOne({ key: appKey });
if (!app) {
if (!Array.isArray(allEvents) || !app) {
return;
}

Expand All @@ -35,22 +31,28 @@ async function triggerByEvent(payload) {
);

for (let event of validRatingEvents) {
const alert = await common.db.collection("alerts").findOne({
const alerts = await common.readBatcher.getMany("alerts", {
selectedApps: app._id.toString(),
alertDataSubType2: event.segmentation.widget_id,
alertDataType: "rating",
alertDataSubType: commonLib.TRIGGERED_BY_EVENT.rating,
});
if (!alert) {

if (!alerts || !alerts.length) {
continue;
}

await commonLib.trigger({ alert, app, date: new Date }, log);
// trigger all alerts
await Promise.all(alerts.map(alert => commonLib.trigger({
alert,
app,
date: new Date,
}, log)));
}
}

module.exports.check = async function({ alertConfigs: alert, done, scheduledTo: date }) {
const app = await common.db.collection("apps").findOne({ _id: ObjectId(alert.selectedApps[0]) });
const app = await common.readBatcher.getOne("apps", { _id: new ObjectId(alert.selectedApps[0]) });
if (!app) {
log.e(`App ${alert.selectedApps[0]} couldn't be found`);
return done();
Expand All @@ -73,7 +75,7 @@ module.exports.check = async function({ alertConfigs: alert, done, scheduledTo:

if (compareType === commonLib.COMPARE_TYPE_ENUM.MORE_THAN) {
if (metricValue > compareValue) {
await commonLib.trigger({ alert, app, metricValue, date });
await commonLib.trigger({ alert, app, metricValue, date }, log);
}
}
else {
Expand All @@ -89,7 +91,7 @@ module.exports.check = async function({ alertConfigs: alert, done, scheduledTo:
: change <= -compareValue;

if (shouldTrigger) {
await commonLib.trigger({ alert, app, date, metricValue, metricValueBefore });
await commonLib.trigger({ alert, app, date, metricValue, metricValueBefore }, log);
}
}

Expand Down
9 changes: 3 additions & 6 deletions plugins/alerts/api/alertModules/revenue.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,9 @@ const PAYING_USER_PROP_KEY = "p";
* - average revenue per user
* - average revenue per paying user
* - # of paying users
* @param {Alert} alert - alert document
* @param {function} done - callback function
* @param {Date} date - scheduled date for the alert (job.next)
*/
module.exports.check = async({ alertConfigs: alert, done, scheduledTo: date }) => {
const app = await common.db.collection("apps").findOne({ _id: ObjectId(alert.selectedApps[0]) });
const app = await common.readBatcher.getOne("apps", { _id: new ObjectId(alert.selectedApps[0]) });
if (!app) {
log.e(`App ${alert.selectedApps[0]} couldn't be found`);
return done();
Expand All @@ -40,7 +37,7 @@ module.exports.check = async({ alertConfigs: alert, done, scheduledTo: date }) =

if (compareType === commonLib.COMPARE_TYPE_ENUM.MORE_THAN) {
if (metricValue > compareValue) {
await commonLib.trigger({ alert, app, metricValue, date });
await commonLib.trigger({ alert, app, metricValue, date }, log);
}
}
else {
Expand All @@ -56,7 +53,7 @@ module.exports.check = async({ alertConfigs: alert, done, scheduledTo: date }) =
: change <= -compareValue;

if (shouldTrigger) {
await commonLib.trigger({ alert, app, date, metricValue, metricValueBefore });
await commonLib.trigger({ alert, app, date, metricValue, metricValueBefore }, log);
}
}
done();
Expand Down
17 changes: 7 additions & 10 deletions plugins/alerts/api/alertModules/sessions.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,8 @@ const METRIC_ENUM = {
AVG_SESSION_DURATION: "average session duration",
};

/**
* Alert triggering logic
* @param {Alert} alert - alert document
* @param {function} done - callback function
* @param {Date} date - scheduled date for the alert (job.next)
*/
module.exports.check = async({ alertConfigs: alert, done, scheduledTo: date }) => {
const app = await common.db.collection("apps").findOne({ _id: ObjectId(alert.selectedApps[0]) });
const app = await common.readBatcher.getOne("apps", { _id: new ObjectId(alert.selectedApps[0]) });
if (!app) {
log.e(`App ${alert.selectedApps[0]} couldn't be found`);
return done();
Expand Down Expand Up @@ -51,7 +45,7 @@ module.exports.check = async({ alertConfigs: alert, done, scheduledTo: date }) =

if (compareType === commonLib.COMPARE_TYPE_ENUM.MORE_THAN) {
if (metricValue > compareValue) {
await commonLib.trigger({ alert, app, metricValue, date });
await commonLib.trigger({ alert, app, metricValue, date }, log);
}
}
else {
Expand All @@ -67,7 +61,10 @@ module.exports.check = async({ alertConfigs: alert, done, scheduledTo: date }) =
if (!numberOfSessionsBefore) {
return done();
}
const sessionDuration = await getSessionMetricByDate(app, "d", before, period);
let sessionDuration = await getSessionMetricByDate(app, "d", before, period);
if (typeof sessionDuration !== "number") {
sessionDuration = 0;
}
metricValueBefore = sessionDuration / numberOfSessionsBefore / 60;
}

Expand All @@ -81,7 +78,7 @@ module.exports.check = async({ alertConfigs: alert, done, scheduledTo: date }) =
: change <= -compareValue;

if (shouldTrigger) {
await commonLib.trigger({ alert, app, date, metricValue, metricValueBefore });
await commonLib.trigger({ alert, app, date, metricValue, metricValueBefore }, log);
}
}

Expand Down
Loading
Loading