Skip to content

Commit 36b38f2

Browse files
authored
Merge branch 'master' into dependabot/npm_and_yarn/sass-1.79.4
2 parents 001295b + 1c2b7bc commit 36b38f2

File tree

16 files changed

+270
-224
lines changed

16 files changed

+270
-224
lines changed

CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## Version 24.05.15
2+
Enterprise fixes:
3+
- [nps] Fixed UI issues in the widget editor related to the "user consent" section
4+
- [ratings] Fixed rendering issue for escaped values
5+
16
## Version 24.05.14
27
Fixes:
38
- [code] Added better handling for countly servers while deployed using subdirectory

api/parts/mgmt/app_users.js

+62-46
Original file line numberDiff line numberDiff line change
@@ -764,6 +764,7 @@ usersApi.merge = function(app_id, newAppUser, new_id, old_id, new_device_id, old
764764
var deleteMyExport = function(exportID) { //tries to delete packed file, exported folder and saved export in gridfs
765765
//normally there should be only export in gridfs. Cleaning all to be sure.
766766
//rejects only if there stays any saved data for export
767+
log.d("deleteMyExport:" + exportID);
767768
return new Promise(function(resolve, reject) {
768769
//remove archive
769770
var errors = [];
@@ -775,7 +776,6 @@ var deleteMyExport = function(exportID) { //tries to delete packed file, exporte
775776
errors.push(err);
776777
}
777778
}
778-
779779
countlyFs.gridfs.deleteFile("appUsers", path.resolve(__dirname, './../../../export/AppUser/' + exportID + '.tar.gz'), {id: exportID + '.tar.gz'}, function(error) {
780780
if (error && error.message && error.message.substring(0, 12) !== "FileNotFound" && error.message.substring(0, 14) !== 'File not found') {
781781
log.e(error.message.substring(0, 14));
@@ -806,6 +806,18 @@ var deleteMyExport = function(exportID) { //tries to delete packed file, exporte
806806
}
807807
});
808808

809+
810+
}).then(function() {
811+
return new Promise(function(resolve, reject) {
812+
common.db.collection("exports").remove({"_eid": exportID}, function(err0) {
813+
if (err0) {
814+
reject(err0);
815+
}
816+
else {
817+
resolve();
818+
}
819+
});
820+
});
809821
});
810822
};
811823

@@ -822,46 +834,42 @@ usersApi.deleteExport = function(filename, params, callback) {
822834
//remove archive
823835
deleteMyExport(base_name[0]).then(
824836
function() {
825-
common.db.collection("exports").remove({"_eid": base_name[0]}, function(err0) {
826-
if (err0) {
827-
log.e(err0);
828-
}
829-
if (name_parts.length === 3 && name_parts[2] !== 'HASH') {
830-
//update user info
831-
common.db.collection('app_users' + name_parts[1]).update({"uid": name_parts[2]}, {$unset: {"appUserExport": ""}}, {upsert: false, multi: true}, function(err) {
832-
if (err) {
833-
callback(err, "");
834-
}
835-
else {
836-
plugins.dispatch("/systemlogs", {
837-
params: params,
838-
action: "export_app_user_deleted",
839-
data: {
840-
result: "ok",
841-
uids: name_parts[2],
842-
id: base_name[0],
843-
app_id: name_parts[1],
844-
info: "Exported data deleted"
845-
}
846-
});
847-
callback(null, "Export deleted");
848-
}
849-
});
850-
}
851-
else {
852-
plugins.dispatch("/systemlogs", {
853-
params: params,
854-
action: "export_app_user_deleted",
855-
data: {
856-
result: "ok",
857-
id: base_name[0],
858-
app_id: name_parts[1],
859-
info: "Exported data deleted"
860-
}
861-
});
862-
callback(null, "Export deleted");
863-
}
864-
});
837+
if (name_parts.length === 3 && name_parts[2] !== 'HASH') {
838+
//update user info
839+
common.db.collection('app_users' + name_parts[1]).update({"uid": name_parts[2]}, {$unset: {"appUserExport": ""}}, {upsert: false, multi: true}, function(err) {
840+
if (err) {
841+
callback(err, "");
842+
}
843+
else {
844+
plugins.dispatch("/systemlogs", {
845+
params: params,
846+
action: "export_app_user_deleted",
847+
data: {
848+
result: "ok",
849+
uids: name_parts[2],
850+
id: base_name[0],
851+
app_id: name_parts[1],
852+
info: "Exported data deleted"
853+
}
854+
});
855+
callback(null, "Export deleted");
856+
}
857+
});
858+
}
859+
else {
860+
plugins.dispatch("/systemlogs", {
861+
params: params,
862+
action: "export_app_user_deleted",
863+
data: {
864+
result: "ok",
865+
id: base_name[0],
866+
app_id: name_parts[1],
867+
info: "Exported data deleted"
868+
}
869+
});
870+
callback(null, "Export deleted");
871+
}
872+
865873
},
866874
function(err) {
867875
console.log(err);
@@ -1073,12 +1081,20 @@ usersApi.export = function(app_id, query, params, callback) {
10731081
// else {
10741082
// resolve();
10751083
// }
1076-
new Promise(function(resolve) {
1077-
log.d("collection marked");
1078-
//export data from metric_changes
10791084

1080-
export_safely({projection: {"appUserExport": 0}, export_id: export_id, app_id: app_id, args: [...dbargs, "--collection", "metric_changes" + app_id, "-q", '{"uid":{"$in": ["' + res[0].uid.join('","') + '"]}}', "--out", export_folder + "/metric_changes" + app_id + ".json"]}).finally(function() {
1081-
resolve();
1085+
//try deleting old export
1086+
deleteMyExport(export_id).then(function(err) {
1087+
if (err) {
1088+
log.e(err);
1089+
}
1090+
log.d("old export deleted");
1091+
return new Promise(function(resolve) {
1092+
log.d("collection marked");
1093+
//export data from metric_changes
1094+
1095+
export_safely({projection: {"appUserExport": 0}, export_id: export_id, app_id: app_id, args: [...dbargs, "--collection", "metric_changes" + app_id, "-q", '{"uid":{"$in": ["' + res[0].uid.join('","') + '"]}}', "--out", export_folder + "/metric_changes" + app_id + ".json"]}).finally(function() {
1096+
resolve();
1097+
});
10821098
});
10831099
}).then(function() {
10841100
log.d("metric_changes exported");

api/utils/countlyFs.js

+10-4
Original file line numberDiff line numberDiff line change
@@ -601,13 +601,19 @@ countlyFs.gridfs = {};
601601
* console.log("Finished", err);
602602
* });
603603
*/
604-
ob.deleteFileById = function(category, id, callback) {
604+
ob.deleteFileById = async function(category, id, callback) {
605605
var bucket = new GridFSBucket(db, { bucketName: category });
606-
bucket.delete(id, function(error) {
606+
try {
607+
await bucket.delete(id);
607608
if (callback) {
608-
callback(error);
609+
callback(null);
609610
}
610-
});
611+
}
612+
catch (ee) {
613+
if (callback) {
614+
callback(ee);
615+
}
616+
}
611617
};
612618

613619
/**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
//Script to look for meaningful differences in drill vs aggregated data.
2+
var data = {"601ba83d99111111d9": {"name": "My Good test APP", "total": 25, "bad": 0}, "6026972d182f7e014cd82114": {"name": "My BAD APP", "total": 100, "bad": 2, "events": {"BAD EVENT": {"e": "BAD EVENT", "report": {"totals": {"c": 1000}, "data": {"2024.10.2": {"c": 1000, "s": 0, "dur": -9.094947017729282e-13}}}}}}}; //output of compare_drill_aggregated.js script
3+
4+
//Should be adjusted based on data amount.
5+
var total_treshold = 100; //If modulus daily value is bigger than this, it will be autputted
6+
var daily_treshold = 50; //If for any day any value is biiger that this - it will be outputted.
7+
8+
for (var appid in data) {
9+
if (data[appid].bad > 0) {
10+
for (var event in data[appid].events) {
11+
var is_any_total_bad = false;
12+
for (var m in data[appid].events[event].report.totals) {
13+
if (data[appid].events[event].report.totals[m] > total_treshold || data[appid].events[event].report.totals[m] < -1 * total_treshold) {
14+
is_any_total_bad = true;
15+
}
16+
}
17+
if (is_any_total_bad) {
18+
console.log("total difference in APP:" + appid + " for event " + event + " " + JSON.stringify(data[appid].events[event].report.totals));
19+
20+
for (var date in data[appid].events[event].report.data) {
21+
var is_any_bad = false;
22+
for (var m2 in data[appid].events[event].report.data[date]) {
23+
if (data[appid].events[event].report.data[date][m2] > daily_treshold || data[appid].events[event].report.data[date][m2] < daily_treshold * -1) {
24+
is_any_bad = true;
25+
}
26+
}
27+
if (is_any_bad) {
28+
console.log(" " + date + " : " + JSON.stringify(data[appid].events[event].report.data[date]));
29+
}
30+
}
31+
32+
}
33+
}
34+
}
35+
}

frontend/express/public/javascripts/countly/vue/components/input.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@
302302
<slot name="option-prefix" v-bind="option"></slot>\
303303
</div>\
304304
<slot name="option-label" v-bind="option">\
305-
<div :data-test-id="testId + \'-item-\' + (option.label ? option.label.replaceAll(\' \', \'-\').toLowerCase() : \' \')" class="cly-vue-listbox__item-label" v-tooltip="option.label">{{decodeHtml(option.label)}}</div>\
305+
<div :data-test-id="testId + \'-item-\' + (option.label ? option.label.replaceAll(\' \', \'-\').toLowerCase() : \' \')" class="cly-vue-listbox__item-label" v-tooltip="decodeHtml(option.label)">{{decodeHtml(option.label)}}</div>\
306306
</slot>\
307307
</div>\
308308
<div class="bu-level-right" v-if="hasRemovableOptions || !!$scopedSlots[\'option-suffix\']">\

package-lock.json

+8-10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
"bunyan": "1.8.15",
4141
"colors": "1.4.0",
4242
"connect-flash": "0.1.1",
43-
"cookie-parser": "1.4.6",
43+
"cookie-parser": "1.4.7",
4444
"countly-request": "file:api/utils/countly-request",
4545
"countly-root": "file:api/utils/countly-root",
4646
"countly-sdk-nodejs": "*",

0 commit comments

Comments
 (0)