Skip to content

Commit 3f389da

Browse files
committed
[systemlogs] proper server side export
1 parent c2f5dfd commit 3f389da

File tree

3 files changed

+122
-83
lines changed

3 files changed

+122
-83
lines changed

plugins/systemlogs/api/api.js

+20-2
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,21 @@ var pluginOb = {},
6161
console.log(err3);
6262
}
6363
res = res || [];
64-
common.returnOutput(paramsNew, {sEcho: paramsNew.qstring.sEcho, iTotalRecords: total, iTotalDisplayRecords: count, aaData: res});
64+
if (params.qstring.export) {
65+
for (var i = 0; i < res.length; i++) {
66+
var info = res[i].i;
67+
delete res[i].i;
68+
delete res[i].cd;
69+
delete res[i]._id;
70+
if (info._id) {
71+
res[i].subject_id = info.app_id || info.user_id || info.campaign_id || info.crash_id || info.appuser_id || info._id;
72+
}
73+
if (info.name) {
74+
res[i].name = info.name;
75+
}
76+
}
77+
}
78+
common.returnOutput(paramsNew, {sEcho: paramsNew.qstring.sEcho, iTotalRecords: Math.max(total, 0), iTotalDisplayRecords: count, aaData: res});
6579
});
6680
});
6781
});
@@ -229,7 +243,7 @@ var pluginOb = {},
229243
}
230244
else {
231245
var keys00 = Object.keys(after[keys[i]]) || [];
232-
var keys02 = Object.keys(before[keys[i]]) || [];
246+
var keys02 = Object.keys(before[keys[i]] || {}) || [];
233247

234248
if (keys00.length === 0 && keys02.length !== 0) {
235249
databefore[keys[i]] = before[keys[i]];
@@ -306,6 +320,10 @@ var pluginOb = {},
306320
if (before && after) {
307321
if (typeof before._id !== "undefined") {
308322
before._id += "";
323+
data._id = before._id;
324+
if (typeof before.name !== "undefined") {
325+
data.name = before.name;
326+
}
309327
}
310328
if (typeof after._id !== "undefined") {
311329
after._id += "";

plugins/systemlogs/frontend/app.js

+76-21
Original file line numberDiff line numberDiff line change
@@ -119,41 +119,96 @@ var exported = {},
119119
recordAction(ob.req, ob.user, ob.action, ob.data);
120120
}
121121
};
122+
122123
/**
123124
* Function to compare changes
124-
* @param {Object} data - The data object
125-
* @param {Array} before - before data
126-
* @param {Array} after - after data
125+
* @param {Object} data - data object
126+
* @param {Object} before - before values
127+
* @param {Object} after - after values
127128
*/
128129
function compareChanges(data, before, after) {
129-
for (var i in after) {
130-
if (typeof after[i] === "object" && after[i] && before[i]) {
131-
if (Array.isArray(after[i]) && JSON.stringify(after[i]) !== JSON.stringify(before[i])) {
132-
data.before[i] = before[i];
133-
data.after[i] = after[i];
130+
if (before && after) {
131+
if (typeof before._id !== "undefined") {
132+
before._id += "";
133+
data._id = before._id;
134+
if (typeof before.name !== "undefined") {
135+
data.name = before.name;
134136
}
135-
else {
136-
for (var propName in after[i]) {
137-
if (after[i][propName] !== before[i][propName]) {
138-
if (!data.before[i]) {
139-
data.before[i] = {};
137+
}
138+
if (typeof after._id !== "undefined") {
139+
after._id += "";
140+
}
141+
compareChangesInside(data.after, data.before, before, after, Object.keys(after) || [], Object.keys(before) || []);
142+
}
143+
}
144+
145+
/**
146+
* recursive function to compare changes
147+
* @param {Object} dataafter - after data values
148+
* @param {Object} databefore - before data values
149+
* @param {Object} before - before
150+
* @param {Object} after - after
151+
* @param {Array} keys - keys for after object
152+
* @param {Array} keys2 - keys for before object
153+
*/
154+
function compareChangesInside(dataafter, databefore, before, after, keys, keys2) {
155+
for (let i = 0; i < keys2.length; i++) {
156+
if (keys.indexOf(keys2[i]) === -1) {
157+
keys.push(keys2[i]);
158+
}
159+
}
160+
for (let i = 0; i < keys.length; i++) {
161+
if (typeof after[keys[i]] !== "undefined" && typeof before[keys[i]] !== "undefined") {
162+
if (typeof after[keys[i]] === "object") {
163+
if (Array.isArray(after[keys[i]])) {
164+
if (JSON.stringify(after[keys[i]]) !== JSON.stringify(before[keys[i]])) {
165+
databefore[keys[i]] = before[keys[i]];
166+
dataafter[keys[i]] = after[keys[i]];
167+
}
168+
}
169+
else {
170+
var keys00 = Object.keys(after[keys[i]]) || [];
171+
var keys02 = Object.keys(before[keys[i]] || {}) || [];
172+
173+
if (keys00.length === 0 && keys02.length !== 0) {
174+
databefore[keys[i]] = before[keys[i]];
175+
dataafter[keys[i]] = after[keys[i]];
176+
}
177+
else if (keys02.length === 0 && keys00.length !== 0) {
178+
databefore[keys[i]] = before[keys[i]];
179+
dataafter[keys[i]] = after[keys[i]];
180+
}
181+
else {
182+
if (!databefore[keys[i]]) {
183+
databefore[keys[i]] = {};
140184
}
141-
if (!data.after[i]) {
142-
data.after[i] = {};
185+
if (!dataafter[keys[i]]) {
186+
dataafter[keys[i]] = {};
187+
}
188+
compareChangesInside(dataafter[keys[i]], databefore[keys[i]], before[keys[i]], after[keys[i]], keys00, keys02);
189+
if (typeof dataafter[keys[i]] === "object" && typeof databefore[keys[i]] === "object" && (Object.keys(dataafter[keys[i]])).length === 0 && (Object.keys(databefore[keys[i]])).length === 0) {
190+
delete databefore[keys[i]];
191+
delete dataafter[keys[i]];
143192
}
144-
145-
data.before[i][propName] = before[i][propName];
146-
data.after[i][propName] = after[i][propName];
147193
}
148194
}
149195
}
196+
else {
197+
if (after[keys[i]] !== before[keys[i]]) {
198+
databefore[keys[i]] = before[keys[i]];
199+
dataafter[keys[i]] = after[keys[i]];
200+
}
201+
}
150202
}
151-
else if (after[i] !== before[i]) {
152-
data.before[i] = before[i];
153-
data.after[i] = after[i];
203+
else {
204+
if (typeof after[keys[i]] !== 'undefined') {
205+
dataafter[keys[i]] = after[keys[i]];
206+
databefore[keys[i]] = {};
207+
}
154208
}
155209
}
156210
}
211+
157212
/**
158213
* Function to record action
159214
* @param {Object} req - The request object

plugins/systemlogs/frontend/public/javascripts/countly.views.js

+26-60
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,37 @@ window.SystemLogsView = countlyView.extend({
1616
}
1717
},
1818
getExportAPI: function(tableID) {
19+
var query, requestPath, apiQueryData;
1920
if (tableID === 'd-table-actionlogs') {
20-
var query = app.activeView.action_query || {a: {$in: ["export_app_user", "app_user_deleted", "export_app_user_deleted"]}};
21+
query = app.activeView.action_query || {a: {$in: ["export_app_user", "app_user_deleted", "export_app_user_deleted"]}};
2122
query["i.app_id"] = countlyCommon.ACTIVE_APP_ID;
2223

23-
var requestPath = '/o?api_key=' + countlyGlobal.member.api_key +
24+
requestPath = '/o?api_key=' + countlyGlobal.member.api_key +
2425
"&app_id=" + countlyCommon.ACTIVE_APP_ID + "&method=systemlogs&iDisplayStart=0" +
2526
"&query=" + encodeURIComponent(JSON.stringify(query)) +
2627
"&period=" + countlyCommon.getPeriodForAjax();
27-
var apiQueryData = {
28+
apiQueryData = {
2829
api_key: countlyGlobal.member.api_key,
2930
app_id: countlyCommon.ACTIVE_APP_ID,
3031
path: requestPath,
3132
method: "GET",
32-
filename: "Systemlogs_on_" + moment().format("DD-MMM-YYYY"),
33+
filename: "Export_Purge_History_on_" + moment().format("DD-MMM-YYYY"),
34+
prop: ['aaData']
35+
};
36+
return apiQueryData;
37+
}
38+
else if (tableID === 'systemlogs-table') {
39+
query = app.activeView.action_query ;
40+
requestPath = '/o?api_key=' + countlyGlobal.member.api_key +
41+
"&app_id=" + countlyCommon.ACTIVE_APP_ID + "&method=systemlogs&iDisplayStart=0&export=true" +
42+
"&query=" + encodeURIComponent(JSON.stringify(query)) +
43+
"&period=" + countlyCommon.getPeriodForAjax();
44+
apiQueryData = {
45+
api_key: countlyGlobal.member.api_key,
46+
app_id: countlyCommon.ACTIVE_APP_ID,
47+
path: requestPath,
48+
method: "GET",
49+
filename: "Auditlogs_on_" + moment().format("DD-MMM-YYYY"),
3350
prop: ['aaData']
3451
};
3552
return apiQueryData;
@@ -77,8 +94,6 @@ window.SystemLogsView = countlyView.extend({
7794
app.back();
7895
});
7996

80-
var tableData = [];
81-
8297
this.dtable = $('#systemlogs-table').dataTable($.extend({}, $.fn.dataTable.defaults, {
8398
"aaSorting": [[ 1, "desc" ]],
8499
"bServerSide": true,
@@ -91,7 +106,6 @@ window.SystemLogsView = countlyView.extend({
91106
"data": aoData,
92107
"success": function(data) {
93108
fnCallback(data);
94-
tableData = data.aaData;
95109
CountlyHelpers.reopenRows(self.dtable, self.expandTable, self);
96110
}
97111
});
@@ -117,7 +131,6 @@ window.SystemLogsView = countlyView.extend({
117131
}
118132
},
119133
"sType": "string",
120-
"sExport": "systemlogs",
121134
"sTitle": jQuery.i18n.map["systemlogs.timestamp"]
122135
},
123136
{
@@ -168,12 +181,12 @@ window.SystemLogsView = countlyView.extend({
168181
if (typeof row.i.appuser_id !== "undefined") {
169182
ret += "<p title='" + row.i.appuser_id + "'>" + jQuery.i18n.map["systemlogs.for-appuser"] + ": " + row.i.appuser_id + "</p>";
170183
}
171-
if (typeof row.i.before !== "undefined" && typeof row.i.after !== "undefined") {
172-
if (!jQuery.isEmptyObject(row.i.before)) {
173-
if (typeof row.i.before._id !== "undefined") {
174-
ret += "<p title='" + row.i.before._id + "'>" + jQuery.i18n.map["systemlogs.for-id"] + ": " + row.i.before._id + "</p>";
175-
}
184+
if (typeof row.i._id !== "undefined") {
185+
var name = jQuery.i18n.map["systemlogs.for-id"] + ": " + row.i._id;
186+
if (row.i.name) {
187+
name += " (" + row.i.name + ")";
176188
}
189+
ret += "<p title='" + name + "'>" + name + "</p>";
177190
}
178191
}
179192
return ret;
@@ -189,53 +202,6 @@ window.SystemLogsView = countlyView.extend({
189202
//this.dtable.fnSort( [ [0,'desc'] ] );
190203
CountlyHelpers.expandRows(this.dtable, this.expandTable, this);
191204

192-
app.addDataExport("systemlogs", function() {
193-
var ret = [];
194-
var elem;
195-
var users = {};
196-
for (i = 0; i < meta.users.length; i++) {
197-
users[meta.users[i]._id] = meta.users[i];
198-
}
199-
if (tableData) {
200-
for (i = 0; i < tableData.length; i++) {
201-
elem = {};
202-
elem[jQuery.i18n.map["systemlogs.timestamp"]] = moment(parseInt(tableData[i].ts) * 1000).format("ddd, D MMM YYYY HH:mm:ss");
203-
if (tableData[i].user_id && users[tableData[i].user_id]) {
204-
elem[jQuery.i18n.map["systemlogs.user"]] = users[tableData[i].user_id].email + " (" + users[tableData[i].user_id].username + ")";
205-
}
206-
else {
207-
elem[jQuery.i18n.map["systemlogs.user"]] = tableData[i].u;
208-
}
209-
elem[jQuery.i18n.map["systemlogs.ip-address"]] = tableData[i].ip;
210-
elem[jQuery.i18n.map["systemlogs.action"]] = ((jQuery.i18n.map["systemlogs.action." + tableData[i].a]) ? jQuery.i18n.map["systemlogs.action." + tableData[i].a] : tableData[i].a);
211-
elem[jQuery.i18n.map["systemlogs.data"]] = "";
212-
elem[jQuery.i18n.map["systemlogs.before"]] = "";
213-
elem[jQuery.i18n.map["systemlogs.after"]] = "";
214-
if (typeof tableData[i].i === "object") {
215-
if (typeof tableData[i].i.before !== "undefined" && typeof tableData[i].i.after !== "undefined") {
216-
var data = {};
217-
for (var d in tableData[i].i) {
218-
if (d !== "before" && d !== "after" && d !== "update") {
219-
data[d] = tableData[i].i[d];
220-
}
221-
}
222-
elem[jQuery.i18n.map["systemlogs.data"]] = JSON.stringify(data);
223-
elem[jQuery.i18n.map["systemlogs.before"]] = JSON.stringify(tableData[i].i.before);
224-
elem[jQuery.i18n.map["systemlogs.after"]] = JSON.stringify(tableData[i].i.after);
225-
}
226-
else if (!jQuery.isEmptyObject(tableData[i].i)) {
227-
elem[jQuery.i18n.map["systemlogs.data"]] = JSON.stringify(tableData[i].i);
228-
}
229-
}
230-
else {
231-
elem[jQuery.i18n.map["systemlogs.data"]] = tableData[i].i;
232-
}
233-
ret.push(elem);
234-
}
235-
}
236-
return ret;
237-
});
238-
239205
$(".action-segmentation .segmentation-option").on("click", function() {
240206
if (!self._query) {
241207
self._query = {};

0 commit comments

Comments
 (0)