@webiny/api-audit-logs 5.38.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1 -0
  3. package/app/app.d.ts +2 -0
  4. package/app/app.js +121 -0
  5. package/app/app.js.map +1 -0
  6. package/app/contants.d.ts +2 -0
  7. package/app/contants.js +12 -0
  8. package/app/contants.js.map +1 -0
  9. package/app/createAppModifier.d.ts +4 -0
  10. package/app/createAppModifier.js +14 -0
  11. package/app/createAppModifier.js.map +1 -0
  12. package/app/index.d.ts +4 -0
  13. package/app/index.js +43 -0
  14. package/app/index.js.map +1 -0
  15. package/app/types.d.ts +7 -0
  16. package/app/types.js +7 -0
  17. package/app/types.js.map +1 -0
  18. package/config.d.ts +12 -0
  19. package/config.js +285 -0
  20. package/config.js.map +1 -0
  21. package/index.d.ts +5 -0
  22. package/index.js +49 -0
  23. package/index.js.map +1 -0
  24. package/package.json +56 -0
  25. package/subscriptions/aco/folders.d.ts +4 -0
  26. package/subscriptions/aco/folders.js +94 -0
  27. package/subscriptions/aco/folders.js.map +1 -0
  28. package/subscriptions/aco/index.d.ts +2 -0
  29. package/subscriptions/aco/index.js +18 -0
  30. package/subscriptions/aco/index.js.map +1 -0
  31. package/subscriptions/apw/changeRequests.d.ts +4 -0
  32. package/subscriptions/apw/changeRequests.js +81 -0
  33. package/subscriptions/apw/changeRequests.js.map +1 -0
  34. package/subscriptions/apw/comments.d.ts +2 -0
  35. package/subscriptions/apw/comments.js +28 -0
  36. package/subscriptions/apw/comments.js.map +1 -0
  37. package/subscriptions/apw/contentReviews.d.ts +2 -0
  38. package/subscriptions/apw/contentReviews.js +28 -0
  39. package/subscriptions/apw/contentReviews.js.map +1 -0
  40. package/subscriptions/apw/index.d.ts +2 -0
  41. package/subscriptions/apw/index.js +26 -0
  42. package/subscriptions/apw/index.js.map +1 -0
  43. package/subscriptions/apw/workflows.d.ts +4 -0
  44. package/subscriptions/apw/workflows.js +64 -0
  45. package/subscriptions/apw/workflows.js.map +1 -0
  46. package/subscriptions/fileManager/files.d.ts +4 -0
  47. package/subscriptions/fileManager/files.js +64 -0
  48. package/subscriptions/fileManager/files.js.map +1 -0
  49. package/subscriptions/fileManager/index.d.ts +2 -0
  50. package/subscriptions/fileManager/index.js +17 -0
  51. package/subscriptions/fileManager/index.js.map +1 -0
  52. package/subscriptions/fileManager/settings.d.ts +2 -0
  53. package/subscriptions/fileManager/settings.js +32 -0
  54. package/subscriptions/fileManager/settings.js.map +1 -0
  55. package/subscriptions/formBuilder/formRevisions.d.ts +6 -0
  56. package/subscriptions/formBuilder/formRevisions.js +96 -0
  57. package/subscriptions/formBuilder/formRevisions.js.map +1 -0
  58. package/subscriptions/formBuilder/formSubmissions.d.ts +2 -0
  59. package/subscriptions/formBuilder/formSubmissions.js +28 -0
  60. package/subscriptions/formBuilder/formSubmissions.js.map +1 -0
  61. package/subscriptions/formBuilder/forms.d.ts +5 -0
  62. package/subscriptions/formBuilder/forms.js +76 -0
  63. package/subscriptions/formBuilder/forms.js.map +1 -0
  64. package/subscriptions/formBuilder/index.d.ts +2 -0
  65. package/subscriptions/formBuilder/index.js +26 -0
  66. package/subscriptions/formBuilder/index.js.map +1 -0
  67. package/subscriptions/formBuilder/settings.d.ts +2 -0
  68. package/subscriptions/formBuilder/settings.js +32 -0
  69. package/subscriptions/formBuilder/settings.js.map +1 -0
  70. package/subscriptions/headlessCms/entries.d.ts +8 -0
  71. package/subscriptions/headlessCms/entries.js +157 -0
  72. package/subscriptions/headlessCms/entries.js.map +1 -0
  73. package/subscriptions/headlessCms/groups.d.ts +4 -0
  74. package/subscriptions/headlessCms/groups.js +64 -0
  75. package/subscriptions/headlessCms/groups.js.map +1 -0
  76. package/subscriptions/headlessCms/index.d.ts +2 -0
  77. package/subscriptions/headlessCms/index.js +30 -0
  78. package/subscriptions/headlessCms/index.js.map +1 -0
  79. package/subscriptions/headlessCms/models.d.ts +4 -0
  80. package/subscriptions/headlessCms/models.js +64 -0
  81. package/subscriptions/headlessCms/models.js.map +1 -0
  82. package/subscriptions/headlessCms/utils/isSearchModelEntry.d.ts +1 -0
  83. package/subscriptions/headlessCms/utils/isSearchModelEntry.js +13 -0
  84. package/subscriptions/headlessCms/utils/isSearchModelEntry.js.map +1 -0
  85. package/subscriptions/i18n/index.d.ts +2 -0
  86. package/subscriptions/i18n/index.js +15 -0
  87. package/subscriptions/i18n/index.js.map +1 -0
  88. package/subscriptions/i18n/locales.d.ts +4 -0
  89. package/subscriptions/i18n/locales.js +64 -0
  90. package/subscriptions/i18n/locales.js.map +1 -0
  91. package/subscriptions/index.d.ts +2 -0
  92. package/subscriptions/index.js +29 -0
  93. package/subscriptions/index.js.map +1 -0
  94. package/subscriptions/mailer/index.d.ts +2 -0
  95. package/subscriptions/mailer/index.js +13 -0
  96. package/subscriptions/mailer/index.js.map +1 -0
  97. package/subscriptions/mailer/settings.d.ts +2 -0
  98. package/subscriptions/mailer/settings.js +32 -0
  99. package/subscriptions/mailer/settings.js.map +1 -0
  100. package/subscriptions/pageBuilder/blockCategories.d.ts +4 -0
  101. package/subscriptions/pageBuilder/blockCategories.js +64 -0
  102. package/subscriptions/pageBuilder/blockCategories.js.map +1 -0
  103. package/subscriptions/pageBuilder/blocks.d.ts +6 -0
  104. package/subscriptions/pageBuilder/blocks.js +96 -0
  105. package/subscriptions/pageBuilder/blocks.js.map +1 -0
  106. package/subscriptions/pageBuilder/categories.d.ts +4 -0
  107. package/subscriptions/pageBuilder/categories.js +64 -0
  108. package/subscriptions/pageBuilder/categories.js.map +1 -0
  109. package/subscriptions/pageBuilder/index.d.ts +2 -0
  110. package/subscriptions/pageBuilder/index.js +51 -0
  111. package/subscriptions/pageBuilder/index.js.map +1 -0
  112. package/subscriptions/pageBuilder/menus.d.ts +4 -0
  113. package/subscriptions/pageBuilder/menus.js +64 -0
  114. package/subscriptions/pageBuilder/menus.js.map +1 -0
  115. package/subscriptions/pageBuilder/pageElements.d.ts +4 -0
  116. package/subscriptions/pageBuilder/pageElements.js +64 -0
  117. package/subscriptions/pageBuilder/pageElements.js.map +1 -0
  118. package/subscriptions/pageBuilder/pageRevisions.d.ts +6 -0
  119. package/subscriptions/pageBuilder/pageRevisions.js +101 -0
  120. package/subscriptions/pageBuilder/pageRevisions.js.map +1 -0
  121. package/subscriptions/pageBuilder/pages.d.ts +4 -0
  122. package/subscriptions/pageBuilder/pages.js +60 -0
  123. package/subscriptions/pageBuilder/pages.js.map +1 -0
  124. package/subscriptions/pageBuilder/settings.d.ts +2 -0
  125. package/subscriptions/pageBuilder/settings.js +32 -0
  126. package/subscriptions/pageBuilder/settings.js.map +1 -0
  127. package/subscriptions/pageBuilder/templates.d.ts +6 -0
  128. package/subscriptions/pageBuilder/templates.js +96 -0
  129. package/subscriptions/pageBuilder/templates.js.map +1 -0
  130. package/subscriptions/security/apiKeys.d.ts +4 -0
  131. package/subscriptions/security/apiKeys.js +85 -0
  132. package/subscriptions/security/apiKeys.js.map +1 -0
  133. package/subscriptions/security/index.d.ts +2 -0
  134. package/subscriptions/security/index.js +27 -0
  135. package/subscriptions/security/index.js.map +1 -0
  136. package/subscriptions/security/roles.d.ts +4 -0
  137. package/subscriptions/security/roles.js +64 -0
  138. package/subscriptions/security/roles.js.map +1 -0
  139. package/subscriptions/security/teams.d.ts +4 -0
  140. package/subscriptions/security/teams.js +64 -0
  141. package/subscriptions/security/teams.js.map +1 -0
  142. package/subscriptions/security/users.d.ts +4 -0
  143. package/subscriptions/security/users.js +64 -0
  144. package/subscriptions/security/users.js.map +1 -0
  145. package/types.d.ts +58 -0
  146. package/types.js +18 -0
  147. package/types.js.map +1 -0
  148. package/utils/compressor.d.ts +11 -0
  149. package/utils/compressor.js +110 -0
  150. package/utils/compressor.js.map +1 -0
  151. package/utils/getAuditConfig.d.ts +33 -0
  152. package/utils/getAuditConfig.js +138 -0
  153. package/utils/getAuditConfig.js.map +1 -0
  154. package/utils/getAuditObject.d.ts +2 -0
  155. package/utils/getAuditObject.js +25 -0
  156. package/utils/getAuditObject.js.map +1 -0
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.compressor = void 0;
7
+ var _gzip = require("@webiny/utils/compression/gzip");
8
+ const GZIP = "gzip";
9
+ const TO_STORAGE_ENCODING = "base64";
10
+ const FROM_STORAGE_ENCODING = "utf8";
11
+ const convertToBuffer = value => {
12
+ if (typeof value === "string") {
13
+ return Buffer.from(value, TO_STORAGE_ENCODING);
14
+ }
15
+ return value;
16
+ };
17
+ class GzipCompression {
18
+ canCompress(data) {
19
+ let compression;
20
+ try {
21
+ const result = JSON.parse(data);
22
+ if (!(result !== null && result !== void 0 && result.compression)) {
23
+ return false;
24
+ }
25
+ compression = result.compression;
26
+ } catch {
27
+ return false;
28
+ }
29
+ /**
30
+ * If already compressed, skip this.
31
+ */
32
+ if (compression) {
33
+ if (compression !== "GZIP") {
34
+ console.log(`Data is compressed with "${compression}". Cannot compress again.`);
35
+ }
36
+ return false;
37
+ }
38
+ return true;
39
+ }
40
+ async compress(data) {
41
+ try {
42
+ const value = await (0, _gzip.compress)(JSON.stringify(data));
43
+ return JSON.stringify({
44
+ compression: GZIP,
45
+ value: value.toString(TO_STORAGE_ENCODING)
46
+ });
47
+ } catch (ex) {
48
+ console.log(`Could not compress given data.`, ex.message);
49
+ return data;
50
+ }
51
+ }
52
+ canDecompress(data) {
53
+ let compression;
54
+ try {
55
+ const result = JSON.parse(data);
56
+ if (!(result !== null && result !== void 0 && result.compression)) {
57
+ return false;
58
+ }
59
+ compression = result.compression;
60
+ } catch {
61
+ return false;
62
+ }
63
+ if (compression !== GZIP) {
64
+ console.log(`Could not decompress given data since its compression is not "${GZIP}". It is "${compression}".`);
65
+ return false;
66
+ }
67
+ return true;
68
+ }
69
+ async decompress(data) {
70
+ let compressedValue;
71
+ try {
72
+ const result = JSON.parse(data);
73
+ if (!result.value) {
74
+ return null;
75
+ }
76
+ compressedValue = result.value;
77
+ } catch {
78
+ return null;
79
+ }
80
+ try {
81
+ const buf = await (0, _gzip.decompress)(convertToBuffer(compressedValue));
82
+ const value = buf.toString(FROM_STORAGE_ENCODING);
83
+ return JSON.parse(value);
84
+ } catch (ex) {
85
+ console.log(`Could not decompress given data.`, ex.message);
86
+ return null;
87
+ }
88
+ }
89
+ }
90
+ const createCompressor = () => {
91
+ const instance = new GzipCompression();
92
+ return {
93
+ compress: async data => {
94
+ if (!instance.canCompress(data)) {
95
+ return data;
96
+ }
97
+ return instance.compress(data);
98
+ },
99
+ decompress(data) {
100
+ if (!instance.canDecompress(data)) {
101
+ return data;
102
+ }
103
+ return instance.decompress(data);
104
+ }
105
+ };
106
+ };
107
+ const compressor = createCompressor();
108
+ exports.compressor = compressor;
109
+
110
+ //# sourceMappingURL=compressor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_gzip","require","GZIP","TO_STORAGE_ENCODING","FROM_STORAGE_ENCODING","convertToBuffer","value","Buffer","from","GzipCompression","canCompress","data","compression","result","JSON","parse","console","log","compress","gzip","stringify","toString","ex","message","canDecompress","decompress","compressedValue","buf","ungzip","createCompressor","instance","compressor","exports"],"sources":["compressor.ts"],"sourcesContent":["import { compress as gzip, decompress as ungzip } from \"@webiny/utils/compression/gzip\";\n\nconst GZIP = \"gzip\";\nconst TO_STORAGE_ENCODING = \"base64\";\nconst FROM_STORAGE_ENCODING = \"utf8\";\n\nconst convertToBuffer = (value: string | Buffer) => {\n if (typeof value === \"string\") {\n return Buffer.from(value, TO_STORAGE_ENCODING);\n }\n return value;\n};\n\nexport interface OriginalData {\n [key: string]: any;\n}\n\nexport interface Compressor {\n canCompress(data: any): boolean;\n compress(data: any): Promise<string>;\n canDecompress(data: string): boolean;\n decompress(data: string): Promise<OriginalData | null>;\n}\n\nclass GzipCompression implements Compressor {\n public canCompress(data: any): boolean {\n let compression: string | undefined;\n try {\n const result = JSON.parse(data);\n if (!result?.compression) {\n return false;\n }\n compression = result.compression;\n } catch {\n return false;\n }\n /**\n * If already compressed, skip this.\n */\n if (compression) {\n if (compression !== \"GZIP\") {\n console.log(`Data is compressed with \"${compression}\". Cannot compress again.`);\n }\n return false;\n }\n return true;\n }\n public async compress(data: any) {\n try {\n const value = await gzip(JSON.stringify(data));\n\n return JSON.stringify({\n compression: GZIP,\n value: value.toString(TO_STORAGE_ENCODING)\n });\n } catch (ex) {\n console.log(`Could not compress given data.`, ex.message);\n return data;\n }\n }\n\n public canDecompress(data: string): boolean {\n let compression: string;\n try {\n const result = JSON.parse(data);\n if (!result?.compression) {\n return false;\n }\n compression = result.compression;\n } catch {\n return false;\n }\n if (compression !== GZIP) {\n console.log(\n `Could not decompress given data since its compression is not \"${GZIP}\". It is \"${compression}\".`\n );\n return false;\n }\n return true;\n }\n\n public async decompress(data: string): Promise<OriginalData | null> {\n let compressedValue: string;\n try {\n const result = JSON.parse(data);\n if (!result.value) {\n return null;\n }\n compressedValue = result.value;\n } catch {\n return null;\n }\n try {\n const buf = await ungzip(convertToBuffer(compressedValue));\n const value = buf.toString(FROM_STORAGE_ENCODING);\n return JSON.parse(value);\n } catch (ex) {\n console.log(`Could not decompress given data.`, ex.message);\n return null;\n }\n }\n}\n\nconst createCompressor = (): Pick<Compressor, \"compress\" | \"decompress\"> => {\n const instance = new GzipCompression();\n\n return {\n compress: async (data: any) => {\n if (!instance.canCompress(data)) {\n return data;\n }\n return instance.compress(data);\n },\n decompress(data: any) {\n if (!instance.canDecompress(data)) {\n return data;\n }\n return instance.decompress(data);\n }\n };\n};\n\nconst compressor = createCompressor();\n\nexport { compressor };\n"],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { AuditAction, AuditLogsContext } from "../types";
2
+ export declare const getAuditConfig: (audit: AuditAction) => (message: string, data: Record<string, any>, entityId: string, context: AuditLogsContext) => Promise<{
3
+ id: string;
4
+ title: string;
5
+ content: string;
6
+ tags: never[];
7
+ type: string;
8
+ location: {
9
+ folderId: string;
10
+ };
11
+ data: {
12
+ data: string;
13
+ message: string;
14
+ app: string;
15
+ entity: string;
16
+ entityId: string;
17
+ action: string;
18
+ timestamp: Date;
19
+ initiator: string;
20
+ };
21
+ } | {
22
+ data: string;
23
+ type: string;
24
+ title: string;
25
+ content?: string | undefined;
26
+ location: import("@webiny/api-aco/types").Location;
27
+ tags: string[];
28
+ id: string;
29
+ entryId: string;
30
+ createdOn: string;
31
+ createdBy: import("@webiny/api-aco/types").User;
32
+ savedOn: string;
33
+ } | undefined>;
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.getAuditConfig = void 0;
8
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
9
+ var _error = _interopRequireDefault(require("@webiny/error"));
10
+ var _utils = require("@webiny/utils");
11
+ var _compressor = require("./compressor");
12
+ const createAuditLog = async params => {
13
+ const {
14
+ app,
15
+ payload
16
+ } = params;
17
+ const payloadData = JSON.stringify(payload.data);
18
+ try {
19
+ const entry = {
20
+ id: (0, _utils.mdbid)(),
21
+ title: payload.message,
22
+ content: payload.message,
23
+ tags: [],
24
+ type: "AuditLogs",
25
+ location: {
26
+ folderId: "root"
27
+ },
28
+ data: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, payload), {}, {
29
+ data: payloadData
30
+ })
31
+ };
32
+ await app.search.create((0, _objectSpread2.default)((0, _objectSpread2.default)({}, entry), {}, {
33
+ data: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, entry.data), {}, {
34
+ data: await _compressor.compressor.compress(entry.data.data)
35
+ })
36
+ }));
37
+ return entry;
38
+ } catch (error) {
39
+ throw _error.default.from(error, {
40
+ message: "Error while creating new audit log",
41
+ code: "CREATE_AUDIT_LOG"
42
+ });
43
+ }
44
+ };
45
+ const createOrMergeAuditLog = async params => {
46
+ const {
47
+ app,
48
+ payload,
49
+ delay
50
+ } = params;
51
+ // Get the latest audit log of this entry.
52
+ const [records] = await app.search.list({
53
+ where: {
54
+ type: "AuditLogs",
55
+ data: {
56
+ entityId: payload.entityId,
57
+ initiator: payload.initiator
58
+ }
59
+ },
60
+ limit: 1
61
+ });
62
+ const existingLog = records === null || records === void 0 ? void 0 : records[0];
63
+ if (existingLog) {
64
+ const existingLogDate = Date.parse(existingLog.savedOn);
65
+ const newLogDate = payload.timestamp.getTime();
66
+
67
+ // Check if the latest audit log is saved within delay range.
68
+ if (newLogDate - existingLogDate < delay * 1000) {
69
+ var _JSON$parse, _payload$data;
70
+ const existingLogData = await _compressor.compressor.decompress(existingLog.data);
71
+ // Update latest audit log with new "after" payload.
72
+ const beforePayloadData = (_JSON$parse = JSON.parse(existingLogData === null || existingLogData === void 0 ? void 0 : existingLogData.data.data)) === null || _JSON$parse === void 0 ? void 0 : _JSON$parse.before;
73
+ const afterPayloadData = (_payload$data = payload.data) === null || _payload$data === void 0 ? void 0 : _payload$data.after;
74
+ const updatedPayloadData = beforePayloadData ? JSON.stringify({
75
+ before: beforePayloadData,
76
+ after: afterPayloadData
77
+ }) : JSON.stringify(payload.data);
78
+ const data = await _compressor.compressor.compress(updatedPayloadData);
79
+ try {
80
+ await app.search.update(existingLog.id, {
81
+ data: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, payload), {}, {
82
+ data
83
+ })
84
+ });
85
+ return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, existingLog), {}, {
86
+ data: updatedPayloadData
87
+ });
88
+ } catch (error) {
89
+ throw _error.default.from(error, {
90
+ message: "Error while updating audit log",
91
+ code: "UPDATE_AUDIT_LOG"
92
+ });
93
+ }
94
+ }
95
+ }
96
+ return createAuditLog(params);
97
+ };
98
+ const getAuditConfig = audit => {
99
+ return async (message, data, entityId, context) => {
100
+ const {
101
+ aco,
102
+ security
103
+ } = context;
104
+ if (!aco) {
105
+ console.log("No ACO defined.");
106
+ return;
107
+ }
108
+ const identity = security.getIdentity();
109
+ const auditLogPayload = {
110
+ message,
111
+ app: audit.app.app,
112
+ entity: audit.entity.type,
113
+ entityId,
114
+ action: audit.action.type,
115
+ data,
116
+ timestamp: new Date(),
117
+ initiator: identity === null || identity === void 0 ? void 0 : identity.id
118
+ };
119
+ const app = aco.getApp("AuditLogs");
120
+ const delay = audit.action.newEntryDelay;
121
+
122
+ // Check if there is delay on audit log creation for this action.
123
+ if (delay) {
124
+ return await createOrMergeAuditLog({
125
+ app,
126
+ payload: auditLogPayload,
127
+ delay
128
+ });
129
+ }
130
+ return await createAuditLog({
131
+ app,
132
+ payload: auditLogPayload
133
+ });
134
+ };
135
+ };
136
+ exports.getAuditConfig = getAuditConfig;
137
+
138
+ //# sourceMappingURL=getAuditConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_error","_interopRequireDefault","require","_utils","_compressor","createAuditLog","params","app","payload","payloadData","JSON","stringify","data","entry","id","mdbid","title","message","content","tags","type","location","folderId","_objectSpread2","default","search","create","compressor","compress","error","WebinyError","from","code","createOrMergeAuditLog","delay","records","list","where","entityId","initiator","limit","existingLog","existingLogDate","Date","parse","savedOn","newLogDate","timestamp","getTime","_JSON$parse","_payload$data","existingLogData","decompress","beforePayloadData","before","afterPayloadData","after","updatedPayloadData","update","getAuditConfig","audit","context","aco","security","console","log","identity","getIdentity","auditLogPayload","entity","action","getApp","newEntryDelay","exports"],"sources":["getAuditConfig.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport { mdbid } from \"@webiny/utils\";\nimport { IAcoApp } from \"@webiny/api-aco/types\";\nimport { AuditAction, AuditLog, AuditLogsContext } from \"~/types\";\nimport { compressor } from \"~/utils/compressor\";\n\ninterface AuditLogPayload extends Omit<AuditLog, \"id\" | \"data\"> {\n data: Record<string, any>;\n}\n\ninterface CreateAuditLogParams {\n app: IAcoApp;\n payload: AuditLogPayload;\n}\n\nconst createAuditLog = async (params: CreateAuditLogParams) => {\n const { app, payload } = params;\n\n const payloadData = JSON.stringify(payload.data);\n\n try {\n const entry = {\n id: mdbid(),\n title: payload.message,\n content: payload.message,\n tags: [],\n type: \"AuditLogs\",\n location: { folderId: \"root\" },\n data: {\n ...payload,\n data: payloadData\n }\n };\n await app.search.create({\n ...entry,\n data: {\n ...entry.data,\n data: await compressor.compress(entry.data.data)\n }\n });\n return entry;\n } catch (error) {\n throw WebinyError.from(error, {\n message: \"Error while creating new audit log\",\n code: \"CREATE_AUDIT_LOG\"\n });\n }\n};\n\ninterface CreateOrMergeAuditLogParams {\n app: IAcoApp;\n payload: AuditLogPayload;\n delay: number;\n}\n\nconst createOrMergeAuditLog = async (params: CreateOrMergeAuditLogParams) => {\n const { app, payload, delay } = params;\n // Get the latest audit log of this entry.\n const [records] = await app.search.list({\n where: {\n type: \"AuditLogs\",\n data: {\n entityId: payload.entityId,\n initiator: payload.initiator\n }\n },\n limit: 1\n });\n const existingLog = records?.[0];\n\n if (existingLog) {\n const existingLogDate = Date.parse(existingLog.savedOn);\n const newLogDate = payload.timestamp.getTime();\n\n // Check if the latest audit log is saved within delay range.\n if (newLogDate - existingLogDate < delay * 1000) {\n const existingLogData = await compressor.decompress(existingLog.data as any);\n // Update latest audit log with new \"after\" payload.\n const beforePayloadData = JSON.parse(existingLogData?.data.data)?.before;\n const afterPayloadData = payload.data?.after;\n const updatedPayloadData = beforePayloadData\n ? JSON.stringify({ before: beforePayloadData, after: afterPayloadData })\n : JSON.stringify(payload.data);\n\n const data = await compressor.compress(updatedPayloadData);\n try {\n await app.search.update(existingLog.id, {\n data: {\n ...payload,\n data\n }\n });\n\n return {\n ...existingLog,\n data: updatedPayloadData\n };\n } catch (error) {\n throw WebinyError.from(error, {\n message: \"Error while updating audit log\",\n code: \"UPDATE_AUDIT_LOG\"\n });\n }\n }\n }\n\n return createAuditLog(params);\n};\n\nexport const getAuditConfig = (audit: AuditAction) => {\n return async (\n message: string,\n data: Record<string, any>,\n entityId: string,\n context: AuditLogsContext\n ) => {\n const { aco, security } = context;\n\n if (!aco) {\n console.log(\"No ACO defined.\");\n return;\n }\n\n const identity = security.getIdentity();\n\n const auditLogPayload = {\n message,\n app: audit.app.app,\n entity: audit.entity.type,\n entityId,\n action: audit.action.type,\n data,\n timestamp: new Date(),\n initiator: identity?.id\n };\n\n const app = aco.getApp(\"AuditLogs\");\n const delay = audit.action.newEntryDelay;\n\n // Check if there is delay on audit log creation for this action.\n if (delay) {\n return await createOrMergeAuditLog({\n app,\n payload: auditLogPayload,\n delay\n });\n }\n return await createAuditLog({\n app,\n payload: auditLogPayload\n });\n };\n};\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { App, AuditObject } from "../types";
2
+ export declare const getAuditObject: (apps: App[]) => AuditObject;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.getAuditObject = void 0;
7
+ const getAuditObject = apps => {
8
+ return apps.reduce((result, app) => {
9
+ result[app.app] = app.entities.reduce((entities, entity) => {
10
+ entities[entity.type] = entity.actions.reduce((actions, action) => {
11
+ actions[action.type] = {
12
+ app,
13
+ entity,
14
+ action
15
+ };
16
+ return actions;
17
+ }, {});
18
+ return entities;
19
+ }, {});
20
+ return result;
21
+ }, {});
22
+ };
23
+ exports.getAuditObject = getAuditObject;
24
+
25
+ //# sourceMappingURL=getAuditObject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["getAuditObject","apps","reduce","result","app","entities","entity","type","actions","action","exports"],"sources":["getAuditObject.ts"],"sourcesContent":["import { ActionObject, App, AuditObject, EntityObject } from \"~/types\";\n\nexport const getAuditObject = (apps: App[]) => {\n return apps.reduce<AuditObject>((result, app) => {\n result[app.app] = app.entities.reduce<EntityObject>((entities, entity) => {\n entities[entity.type] = entity.actions.reduce<ActionObject>((actions, action) => {\n actions[action.type] = {\n app,\n entity,\n action\n };\n\n return actions;\n }, {});\n\n return entities;\n }, {});\n\n return result;\n }, {});\n};\n"],"mappings":";;;;;;AAEO,MAAMA,cAAc,GAAIC,IAAW,IAAK;EAC3C,OAAOA,IAAI,CAACC,MAAM,CAAc,CAACC,MAAM,EAAEC,GAAG,KAAK;IAC7CD,MAAM,CAACC,GAAG,CAACA,GAAG,CAAC,GAAGA,GAAG,CAACC,QAAQ,CAACH,MAAM,CAAe,CAACG,QAAQ,EAAEC,MAAM,KAAK;MACtED,QAAQ,CAACC,MAAM,CAACC,IAAI,CAAC,GAAGD,MAAM,CAACE,OAAO,CAACN,MAAM,CAAe,CAACM,OAAO,EAAEC,MAAM,KAAK;QAC7ED,OAAO,CAACC,MAAM,CAACF,IAAI,CAAC,GAAG;UACnBH,GAAG;UACHE,MAAM;UACNG;QACJ,CAAC;QAED,OAAOD,OAAO;MAClB,CAAC,EAAE,CAAC,CAAC,CAAC;MAEN,OAAOH,QAAQ;IACnB,CAAC,EAAE,CAAC,CAAC,CAAC;IAEN,OAAOF,MAAM;EACjB,CAAC,EAAE,CAAC,CAAC,CAAC;AACV,CAAC;AAACO,OAAA,CAAAV,cAAA,GAAAA,cAAA"}