@strapi/admin 5.52.3 → 5.53.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 (109) hide show
  1. package/dist/admin/admin/src/translations/en.json.js +18 -0
  2. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  3. package/dist/admin/admin/src/translations/en.json.mjs +18 -0
  4. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  5. package/dist/admin/admin/src/utils/getFetchClient.js +118 -43
  6. package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
  7. package/dist/admin/admin/src/utils/getFetchClient.mjs +118 -45
  8. package/dist/admin/admin/src/utils/getFetchClient.mjs.map +1 -1
  9. package/dist/admin/ee/admin/src/constants.js +6 -0
  10. package/dist/admin/ee/admin/src/constants.js.map +1 -1
  11. package/dist/admin/ee/admin/src/constants.mjs +6 -0
  12. package/dist/admin/ee/admin/src/constants.mjs.map +1 -1
  13. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.js +31 -3
  14. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.js.map +1 -1
  15. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.mjs +33 -5
  16. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.mjs.map +1 -1
  17. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/ExportCard.js +177 -0
  18. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/ExportCard.js.map +1 -0
  19. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/ExportCard.mjs +175 -0
  20. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/ExportCard.mjs.map +1 -0
  21. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.js +173 -0
  22. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.js.map +1 -0
  23. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.mjs +151 -0
  24. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.mjs.map +1 -0
  25. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js +10 -1
  26. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js.map +1 -1
  27. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs +10 -1
  28. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs.map +1 -1
  29. package/dist/admin/index.js +2 -0
  30. package/dist/admin/index.js.map +1 -1
  31. package/dist/admin/index.mjs +1 -1
  32. package/dist/admin/shared/utils/audit-log-export.js +16 -0
  33. package/dist/admin/shared/utils/audit-log-export.js.map +1 -0
  34. package/dist/admin/shared/utils/audit-log-export.mjs +9 -0
  35. package/dist/admin/shared/utils/audit-log-export.mjs.map +1 -0
  36. package/dist/admin/src/utils/getFetchClient.d.ts +9 -2
  37. package/dist/admin/tests/store.d.ts +4 -0
  38. package/dist/admin/tests/utils.d.ts +4 -0
  39. package/dist/ee/admin/src/constants.d.ts +4 -0
  40. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/ExportCard.d.ts +10 -0
  41. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useExportAuditLogs.d.ts +18 -0
  42. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.d.ts +9 -0
  43. package/dist/ee/server/src/audit-logs/controllers/audit-logs.d.ts +1 -0
  44. package/dist/ee/server/src/audit-logs/controllers/audit-logs.d.ts.map +1 -1
  45. package/dist/ee/server/src/audit-logs/routes/audit-logs.d.ts.map +1 -1
  46. package/dist/ee/server/src/audit-logs/services/audit-logs.d.ts +24 -3
  47. package/dist/ee/server/src/audit-logs/services/audit-logs.d.ts.map +1 -1
  48. package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts +8 -2
  49. package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts.map +1 -1
  50. package/dist/ee/server/src/audit-logs/utils/csv.d.ts +5 -0
  51. package/dist/ee/server/src/audit-logs/utils/csv.d.ts.map +1 -0
  52. package/dist/ee/server/src/audit-logs/utils/export-token.d.ts +5 -0
  53. package/dist/ee/server/src/audit-logs/utils/export-token.d.ts.map +1 -0
  54. package/dist/ee/server/src/audit-logs/utils.d.ts +10 -0
  55. package/dist/ee/server/src/audit-logs/utils.d.ts.map +1 -0
  56. package/dist/ee/server/src/audit-logs/validation/audit-logs.d.ts +2 -0
  57. package/dist/ee/server/src/audit-logs/validation/audit-logs.d.ts.map +1 -1
  58. package/dist/ee/server/src/config/admin-actions.d.ts.map +1 -1
  59. package/dist/ee/server/src/index.d.ts +1 -0
  60. package/dist/ee/server/src/index.d.ts.map +1 -1
  61. package/dist/server/ee/server/src/audit-logs/controllers/audit-logs.js +50 -0
  62. package/dist/server/ee/server/src/audit-logs/controllers/audit-logs.js.map +1 -1
  63. package/dist/server/ee/server/src/audit-logs/controllers/audit-logs.mjs +51 -1
  64. package/dist/server/ee/server/src/audit-logs/controllers/audit-logs.mjs.map +1 -1
  65. package/dist/server/ee/server/src/audit-logs/routes/audit-logs.js +13 -4
  66. package/dist/server/ee/server/src/audit-logs/routes/audit-logs.js.map +1 -1
  67. package/dist/server/ee/server/src/audit-logs/routes/audit-logs.mjs +13 -4
  68. package/dist/server/ee/server/src/audit-logs/routes/audit-logs.mjs.map +1 -1
  69. package/dist/server/ee/server/src/audit-logs/services/audit-logs.js +201 -7
  70. package/dist/server/ee/server/src/audit-logs/services/audit-logs.js.map +1 -1
  71. package/dist/server/ee/server/src/audit-logs/services/audit-logs.mjs +201 -8
  72. package/dist/server/ee/server/src/audit-logs/services/audit-logs.mjs.map +1 -1
  73. package/dist/server/ee/server/src/audit-logs/services/lifecycles.js +119 -34
  74. package/dist/server/ee/server/src/audit-logs/services/lifecycles.js.map +1 -1
  75. package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs +119 -34
  76. package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs.map +1 -1
  77. package/dist/server/ee/server/src/audit-logs/utils/csv.js +33 -0
  78. package/dist/server/ee/server/src/audit-logs/utils/csv.js.map +1 -0
  79. package/dist/server/ee/server/src/audit-logs/utils/csv.mjs +29 -0
  80. package/dist/server/ee/server/src/audit-logs/utils/csv.mjs.map +1 -0
  81. package/dist/server/ee/server/src/audit-logs/utils/export-token.js +33 -0
  82. package/dist/server/ee/server/src/audit-logs/utils/export-token.js.map +1 -0
  83. package/dist/server/ee/server/src/audit-logs/utils/export-token.mjs +29 -0
  84. package/dist/server/ee/server/src/audit-logs/utils/export-token.mjs.map +1 -0
  85. package/dist/server/ee/server/src/audit-logs/utils.js +14 -0
  86. package/dist/server/ee/server/src/audit-logs/utils.js.map +1 -0
  87. package/dist/server/ee/server/src/audit-logs/utils.mjs +12 -0
  88. package/dist/server/ee/server/src/audit-logs/utils.mjs.map +1 -0
  89. package/dist/server/ee/server/src/audit-logs/validation/audit-logs.js +11 -0
  90. package/dist/server/ee/server/src/audit-logs/validation/audit-logs.js.map +1 -1
  91. package/dist/server/ee/server/src/audit-logs/validation/audit-logs.mjs +11 -1
  92. package/dist/server/ee/server/src/audit-logs/validation/audit-logs.mjs.map +1 -1
  93. package/dist/server/ee/server/src/config/admin-actions.js +8 -0
  94. package/dist/server/ee/server/src/config/admin-actions.js.map +1 -1
  95. package/dist/server/ee/server/src/config/admin-actions.mjs +8 -0
  96. package/dist/server/ee/server/src/config/admin-actions.mjs.map +1 -1
  97. package/dist/server/ee/server/src/index.js +10 -0
  98. package/dist/server/ee/server/src/index.js.map +1 -1
  99. package/dist/server/ee/server/src/index.mjs +10 -0
  100. package/dist/server/ee/server/src/index.mjs.map +1 -1
  101. package/dist/server/shared/utils/audit-log-export.js +22 -0
  102. package/dist/server/shared/utils/audit-log-export.js.map +1 -0
  103. package/dist/server/shared/utils/audit-log-export.mjs +12 -0
  104. package/dist/server/shared/utils/audit-log-export.mjs.map +1 -0
  105. package/dist/shared/contracts/audit-logs.d.ts +15 -1
  106. package/dist/shared/contracts/audit-logs.d.ts.map +1 -1
  107. package/dist/shared/utils/audit-log-export.d.ts +9 -0
  108. package/dist/shared/utils/audit-log-export.d.ts.map +1 -0
  109. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"getActionTypesDefaultMessages.mjs","sources":["../../../../../../../../../../ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.ts"],"sourcesContent":["export const actionTypes = {\n 'entry.create': 'Create entry{model, select, undefined {} other { ({model})}}',\n 'entry.update': 'Update entry{model, select, undefined {} other { ({model})}}',\n 'entry.delete': 'Delete entry{model, select, undefined {} other { ({model})}}',\n 'entry.publish': 'Publish entry{model, select, undefined {} other { ({model})}}',\n 'entry.unpublish': 'Unpublish entry{model, select, undefined {} other { ({model})}}',\n 'media.create': 'Create media',\n 'media.update': 'Update media',\n 'media.delete': 'Delete media',\n 'media-folder.create': 'Create media folder',\n 'media-folder.update': 'Update media folder',\n 'media-folder.delete': 'Delete media folder',\n 'user.create': 'Create user',\n 'user.update': 'Update user',\n 'user.delete': 'Delete user',\n 'admin.auth.success': 'Admin login',\n 'admin.logout': 'Admin logout',\n 'content-type.create': 'Create content type',\n 'content-type.update': 'Update content type',\n 'content-type.delete': 'Delete content type',\n 'component.create': 'Create component',\n 'component.update': 'Update component',\n 'component.delete': 'Delete component',\n 'role.create': 'Create role',\n 'role.update': 'Update role',\n 'role.delete': 'Delete role',\n 'permission.create': 'Create permission',\n 'permission.update': 'Update permission',\n 'permission.delete': 'Delete permission',\n};\n\nexport const getDefaultMessage = (value: keyof typeof actionTypes) => {\n return actionTypes[value] || value;\n};\n"],"names":["actionTypes","getDefaultMessage","value"],"mappings":"MAAaA,WAAAA,GAAc;IACzB,cAAA,EAAgB,8DAAA;IAChB,cAAA,EAAgB,8DAAA;IAChB,cAAA,EAAgB,8DAAA;IAChB,eAAA,EAAiB,+DAAA;IACjB,iBAAA,EAAmB,iEAAA;IACnB,cAAA,EAAgB,cAAA;IAChB,cAAA,EAAgB,cAAA;IAChB,cAAA,EAAgB,cAAA;IAChB,qBAAA,EAAuB,qBAAA;IACvB,qBAAA,EAAuB,qBAAA;IACvB,qBAAA,EAAuB,qBAAA;IACvB,aAAA,EAAe,aAAA;IACf,aAAA,EAAe,aAAA;IACf,aAAA,EAAe,aAAA;IACf,oBAAA,EAAsB,aAAA;IACtB,cAAA,EAAgB,cAAA;IAChB,qBAAA,EAAuB,qBAAA;IACvB,qBAAA,EAAuB,qBAAA;IACvB,qBAAA,EAAuB,qBAAA;IACvB,kBAAA,EAAoB,kBAAA;IACpB,kBAAA,EAAoB,kBAAA;IACpB,kBAAA,EAAoB,kBAAA;IACpB,aAAA,EAAe,aAAA;IACf,aAAA,EAAe,aAAA;IACf,aAAA,EAAe,aAAA;IACf,mBAAA,EAAqB,mBAAA;IACrB,mBAAA,EAAqB,mBAAA;IACrB,mBAAA,EAAqB;AACvB;AAEO,MAAMC,oBAAoB,CAACC,KAAAA,GAAAA;IAChC,OAAOF,WAAW,CAACE,KAAAA,CAAM,IAAIA,KAAAA;AAC/B;;;;"}
1
+ {"version":3,"file":"getActionTypesDefaultMessages.mjs","sources":["../../../../../../../../../../ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.ts"],"sourcesContent":["export const actionTypes = {\n 'entry.create': 'Create entry{model, select, undefined {} other { ({model})}}',\n 'entry.update': 'Update entry{model, select, undefined {} other { ({model})}}',\n 'entry.delete': 'Delete entry{model, select, undefined {} other { ({model})}}',\n 'entry.publish': 'Publish entry{model, select, undefined {} other { ({model})}}',\n 'entry.unpublish': 'Unpublish entry{model, select, undefined {} other { ({model})}}',\n 'media.create': 'Create media',\n 'media.update': 'Update media',\n 'media.delete': 'Delete media',\n 'media-folder.create': 'Create media folder',\n 'media-folder.update': 'Update media folder',\n 'media-folder.delete': 'Delete media folder',\n 'user.create': 'Create user',\n 'user.update': 'Update user',\n 'user.delete': 'Delete user',\n 'admin.auth.success': 'Admin login',\n 'admin.logout': 'Admin logout',\n 'content-type.create': 'Create content type',\n 'content-type.update': 'Update content type',\n 'content-type.delete': 'Delete content type',\n 'component.create': 'Create component',\n 'component.update': 'Update component',\n 'component.delete': 'Delete component',\n 'role.create': 'Create role',\n 'role.update': 'Update role',\n 'role.delete': 'Delete role',\n 'permission.create': 'Create permission',\n 'permission.update': 'Update permission',\n 'permission.delete': 'Delete permission',\n 'release.create': 'Create release',\n 'release.update': 'Update release',\n 'release.delete': 'Delete release',\n 'release.trigger': 'Trigger release',\n 'release.entry.add': 'Add entry to release',\n 'release.entry.update': 'Change entry on release',\n 'release.entry.remove': 'Remove entry from release',\n 'release.settings.update': 'Update release settings',\n 'audit-log.export': 'Export audit logs',\n};\n\nexport const getDefaultMessage = (value: keyof typeof actionTypes) => {\n return actionTypes[value] || value;\n};\n"],"names":["actionTypes","getDefaultMessage","value"],"mappings":"MAAaA,WAAAA,GAAc;IACzB,cAAA,EAAgB,8DAAA;IAChB,cAAA,EAAgB,8DAAA;IAChB,cAAA,EAAgB,8DAAA;IAChB,eAAA,EAAiB,+DAAA;IACjB,iBAAA,EAAmB,iEAAA;IACnB,cAAA,EAAgB,cAAA;IAChB,cAAA,EAAgB,cAAA;IAChB,cAAA,EAAgB,cAAA;IAChB,qBAAA,EAAuB,qBAAA;IACvB,qBAAA,EAAuB,qBAAA;IACvB,qBAAA,EAAuB,qBAAA;IACvB,aAAA,EAAe,aAAA;IACf,aAAA,EAAe,aAAA;IACf,aAAA,EAAe,aAAA;IACf,oBAAA,EAAsB,aAAA;IACtB,cAAA,EAAgB,cAAA;IAChB,qBAAA,EAAuB,qBAAA;IACvB,qBAAA,EAAuB,qBAAA;IACvB,qBAAA,EAAuB,qBAAA;IACvB,kBAAA,EAAoB,kBAAA;IACpB,kBAAA,EAAoB,kBAAA;IACpB,kBAAA,EAAoB,kBAAA;IACpB,aAAA,EAAe,aAAA;IACf,aAAA,EAAe,aAAA;IACf,aAAA,EAAe,aAAA;IACf,mBAAA,EAAqB,mBAAA;IACrB,mBAAA,EAAqB,mBAAA;IACrB,mBAAA,EAAqB,mBAAA;IACrB,gBAAA,EAAkB,gBAAA;IAClB,gBAAA,EAAkB,gBAAA;IAClB,gBAAA,EAAkB,gBAAA;IAClB,iBAAA,EAAmB,iBAAA;IACnB,mBAAA,EAAqB,sBAAA;IACrB,sBAAA,EAAwB,yBAAA;IACxB,sBAAA,EAAwB,2BAAA;IACxB,yBAAA,EAA2B,yBAAA;IAC3B,kBAAA,EAAoB;AACtB;AAEO,MAAMC,oBAAoB,CAACC,KAAAA,GAAAA;IAChC,OAAOF,WAAW,CAACE,KAAAA,CAAM,IAAIA,KAAAA;AAC/B;;;;"}
@@ -108,10 +108,12 @@ exports.useScopedPersistentState = usePersistentState.useScopedPersistentState;
108
108
  exports.useAdminUsers = users$1.useAdminUsers;
109
109
  exports.useGetCountDocumentsQuery = homepage.useGetCountDocumentsQuery;
110
110
  exports.translatedErrors = translatedErrors.translatedErrors;
111
+ exports.ADMIN_REFRESH_LOCK = getFetchClient.ADMIN_REFRESH_LOCK;
111
112
  exports.FetchError = getFetchClient.FetchError;
112
113
  exports.attemptTokenRefresh = getFetchClient.attemptTokenRefresh;
113
114
  exports.getFetchClient = getFetchClient.getFetchClient;
114
115
  exports.isFetchError = getFetchClient.isFetchError;
116
+ exports.refreshAccessToken = getFetchClient.refreshAccessToken;
115
117
  exports.setOnSessionExpired = getFetchClient.setOnSessionExpired;
116
118
  exports.setOnTokenUpdate = getFetchClient.setOnTokenUpdate;
117
119
  exports.storeToken = getFetchClient.storeToken;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -39,7 +39,7 @@ export { usePersistentState, usePersistentStateScope, useScopedPersistentState }
39
39
  export { useAdminUsers } from './admin/src/services/users.mjs';
40
40
  export { useGetCountDocumentsQuery } from './admin/src/services/homepage.mjs';
41
41
  export { translatedErrors } from './admin/src/utils/translatedErrors.mjs';
42
- export { FetchError, attemptTokenRefresh, getFetchClient, isFetchError, setOnSessionExpired, setOnTokenUpdate, storeToken, triggerSessionExpired } from './admin/src/utils/getFetchClient.mjs';
42
+ export { ADMIN_REFRESH_LOCK, FetchError, attemptTokenRefresh, getFetchClient, isFetchError, refreshAccessToken, setOnSessionExpired, setOnTokenUpdate, storeToken, triggerSessionExpired } from './admin/src/utils/getFetchClient.mjs';
43
43
  export { fetchBaseQuery, isBaseQueryError } from './admin/src/utils/baseQuery.mjs';
44
44
  export { createRulesEngine } from './admin/src/utils/rulesEngine.mjs';
45
45
  export { getDisplayName, getInitials, hashAdminUserEmail } from './admin/src/utils/users.mjs';
@@ -0,0 +1,16 @@
1
+ 'use strict';
2
+
3
+ const AUDIT_LOGS_EXPORT_UNTIL_HEADER = 'X-Audit-Logs-Export-Until';
4
+ const AUDIT_LOGS_EXPORT_NEXT_CURSOR_HEADER = 'X-Audit-Logs-Export-Next-Cursor';
5
+ const AUDIT_LOGS_EXPORT_PART_SIZE_HEADER = 'X-Audit-Logs-Export-Part-Size';
6
+ const AUDIT_LOGS_EXPORT_TOKEN_HEADER = 'X-Audit-Logs-Export-Token';
7
+ const AUDIT_LOGS_EXPORT_CURSOR_DONE = 'none';
8
+ const AUDIT_LOGS_EXPORT_PART_ROWS = 50000;
9
+
10
+ exports.AUDIT_LOGS_EXPORT_CURSOR_DONE = AUDIT_LOGS_EXPORT_CURSOR_DONE;
11
+ exports.AUDIT_LOGS_EXPORT_NEXT_CURSOR_HEADER = AUDIT_LOGS_EXPORT_NEXT_CURSOR_HEADER;
12
+ exports.AUDIT_LOGS_EXPORT_PART_ROWS = AUDIT_LOGS_EXPORT_PART_ROWS;
13
+ exports.AUDIT_LOGS_EXPORT_PART_SIZE_HEADER = AUDIT_LOGS_EXPORT_PART_SIZE_HEADER;
14
+ exports.AUDIT_LOGS_EXPORT_TOKEN_HEADER = AUDIT_LOGS_EXPORT_TOKEN_HEADER;
15
+ exports.AUDIT_LOGS_EXPORT_UNTIL_HEADER = AUDIT_LOGS_EXPORT_UNTIL_HEADER;
16
+ //# sourceMappingURL=audit-log-export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-log-export.js","sources":["../../../../shared/utils/audit-log-export.ts"],"sourcesContent":["export const AUDIT_LOG_EXPORT_EVENT = 'audit-log.export';\n\nexport const AUDIT_LOGS_EXPORT_UNTIL_HEADER = 'X-Audit-Logs-Export-Until';\nexport const AUDIT_LOGS_EXPORT_NEXT_CURSOR_HEADER = 'X-Audit-Logs-Export-Next-Cursor';\nexport const AUDIT_LOGS_EXPORT_PART_SIZE_HEADER = 'X-Audit-Logs-Export-Part-Size';\nexport const AUDIT_LOGS_EXPORT_TOKEN_HEADER = 'X-Audit-Logs-Export-Token';\nexport const AUDIT_LOGS_EXPORT_CURSOR_DONE = 'none';\nexport const AUDIT_LOGS_EXPORT_PART_ROWS = 50000;\nexport const AUDIT_LOGS_EXPORT_PART_MAX_ROWS = 100000;\nexport const AUDIT_LOGS_EXPORT_DEFAULT_MAX_ROWS = 1_000_000;\n"],"names":["AUDIT_LOGS_EXPORT_UNTIL_HEADER","AUDIT_LOGS_EXPORT_NEXT_CURSOR_HEADER","AUDIT_LOGS_EXPORT_PART_SIZE_HEADER","AUDIT_LOGS_EXPORT_TOKEN_HEADER","AUDIT_LOGS_EXPORT_CURSOR_DONE","AUDIT_LOGS_EXPORT_PART_ROWS"],"mappings":";;AAEO,MAAMA,iCAAiC;AACvC,MAAMC,uCAAuC;AAC7C,MAAMC,qCAAqC;AAC3C,MAAMC,iCAAiC;AACvC,MAAMC,gCAAgC;AACtC,MAAMC,8BAA8B;;;;;;;;;"}
@@ -0,0 +1,9 @@
1
+ const AUDIT_LOGS_EXPORT_UNTIL_HEADER = 'X-Audit-Logs-Export-Until';
2
+ const AUDIT_LOGS_EXPORT_NEXT_CURSOR_HEADER = 'X-Audit-Logs-Export-Next-Cursor';
3
+ const AUDIT_LOGS_EXPORT_PART_SIZE_HEADER = 'X-Audit-Logs-Export-Part-Size';
4
+ const AUDIT_LOGS_EXPORT_TOKEN_HEADER = 'X-Audit-Logs-Export-Token';
5
+ const AUDIT_LOGS_EXPORT_CURSOR_DONE = 'none';
6
+ const AUDIT_LOGS_EXPORT_PART_ROWS = 50000;
7
+
8
+ export { AUDIT_LOGS_EXPORT_CURSOR_DONE, AUDIT_LOGS_EXPORT_NEXT_CURSOR_HEADER, AUDIT_LOGS_EXPORT_PART_ROWS, AUDIT_LOGS_EXPORT_PART_SIZE_HEADER, AUDIT_LOGS_EXPORT_TOKEN_HEADER, AUDIT_LOGS_EXPORT_UNTIL_HEADER };
9
+ //# sourceMappingURL=audit-log-export.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-log-export.mjs","sources":["../../../../shared/utils/audit-log-export.ts"],"sourcesContent":["export const AUDIT_LOG_EXPORT_EVENT = 'audit-log.export';\n\nexport const AUDIT_LOGS_EXPORT_UNTIL_HEADER = 'X-Audit-Logs-Export-Until';\nexport const AUDIT_LOGS_EXPORT_NEXT_CURSOR_HEADER = 'X-Audit-Logs-Export-Next-Cursor';\nexport const AUDIT_LOGS_EXPORT_PART_SIZE_HEADER = 'X-Audit-Logs-Export-Part-Size';\nexport const AUDIT_LOGS_EXPORT_TOKEN_HEADER = 'X-Audit-Logs-Export-Token';\nexport const AUDIT_LOGS_EXPORT_CURSOR_DONE = 'none';\nexport const AUDIT_LOGS_EXPORT_PART_ROWS = 50000;\nexport const AUDIT_LOGS_EXPORT_PART_MAX_ROWS = 100000;\nexport const AUDIT_LOGS_EXPORT_DEFAULT_MAX_ROWS = 1_000_000;\n"],"names":["AUDIT_LOGS_EXPORT_UNTIL_HEADER","AUDIT_LOGS_EXPORT_NEXT_CURSOR_HEADER","AUDIT_LOGS_EXPORT_PART_SIZE_HEADER","AUDIT_LOGS_EXPORT_TOKEN_HEADER","AUDIT_LOGS_EXPORT_CURSOR_DONE","AUDIT_LOGS_EXPORT_PART_ROWS"],"mappings":"AAEO,MAAMA,iCAAiC;AACvC,MAAMC,uCAAuC;AAC7C,MAAMC,qCAAqC;AAC3C,MAAMC,iCAAiC;AACvC,MAAMC,gCAAgC;AACtC,MAAMC,8BAA8B;;;;"}
@@ -38,6 +38,13 @@ declare const triggerSessionExpired: () => void;
38
38
  * @internal Exported for testing purposes
39
39
  */
40
40
  declare const storeToken: (token: string) => void;
41
+ declare const ADMIN_REFRESH_LOCK = "strapi-admin-access-token";
42
+ /**
43
+ * Refresh the access token by calling the /admin/access-token endpoint.
44
+ * This uses a low-level fetch to avoid recursion through the interceptor.
45
+ * Returns the new token on success, or null on failure.
46
+ */
47
+ declare const refreshAccessToken: (tokenUsedByFailedRequest?: string | null) => Promise<string | null>;
41
48
  /**
42
49
  * Attempt to refresh the token if not already refreshing.
43
50
  * Uses a module-level promise to prevent concurrent refresh requests.
@@ -46,7 +53,7 @@ declare const storeToken: (token: string) => void;
46
53
  * @throws {Error} If the token refresh fails (e.g., refresh token expired)
47
54
  * @internal Exported for testing purposes
48
55
  */
49
- declare const attemptTokenRefresh: () => Promise<string>;
56
+ declare const attemptTokenRefresh: (tokenUsedByFailedRequest?: string | null) => Promise<string>;
50
57
  type FetchResponse<TData = unknown> = {
51
58
  data: TData;
52
59
  status?: number;
@@ -117,5 +124,5 @@ type FetchClient = {
117
124
  * ```
118
125
  */
119
126
  declare const getFetchClient: (defaultOptions?: FetchConfig) => FetchClient;
120
- export { getFetchClient, isFetchError, FetchError, attemptTokenRefresh, storeToken, setOnTokenUpdate, setOnSessionExpired, triggerSessionExpired, };
127
+ export { getFetchClient, isFetchError, FetchError, attemptTokenRefresh, refreshAccessToken, storeToken, setOnTokenUpdate, setOnSessionExpired, triggerSessionExpired, ADMIN_REFRESH_LOCK, };
121
128
  export type { FetchOptions, FetchResponse, FetchConfig, FetchClient, ErrorResponse };
@@ -178,6 +178,10 @@ declare const initialState: () => {
178
178
  action: string;
179
179
  subject: null;
180
180
  }[];
181
+ export: {
182
+ action: string;
183
+ subject: null;
184
+ }[];
181
185
  };
182
186
  "review-workflows": {
183
187
  main: {
@@ -188,6 +188,10 @@ declare const defaultTestStoreConfig: () => {
188
188
  action: string;
189
189
  subject: null;
190
190
  }[];
191
+ export: {
192
+ action: string;
193
+ subject: null;
194
+ }[];
191
195
  };
192
196
  "review-workflows": {
193
197
  main: {
@@ -15,6 +15,10 @@ export declare const ADMIN_PERMISSIONS_EE: {
15
15
  action: string;
16
16
  subject: null;
17
17
  }[];
18
+ export: {
19
+ action: string;
20
+ subject: null;
21
+ }[];
18
22
  };
19
23
  'review-workflows': {
20
24
  main: {
@@ -0,0 +1,10 @@
1
+ import type { ExportProgress, ExportResult } from '../hooks/useExportAuditLogs';
2
+ interface ExportCardProps {
3
+ progress: ExportProgress | null;
4
+ exportResult: ExportResult | null;
5
+ onDownload: () => void;
6
+ onDismiss: () => void;
7
+ }
8
+ declare const ExportCard: ({ progress, exportResult, onDownload, onDismiss }: ExportCardProps) => import("react/jsx-runtime").JSX.Element | null;
9
+ export { ExportCard };
10
+ export type { ExportCardProps };
@@ -0,0 +1,18 @@
1
+ interface ExportProgress {
2
+ fetched: number;
3
+ total: number;
4
+ }
5
+ interface ExportResult {
6
+ blob: Blob;
7
+ fileName: string;
8
+ }
9
+ declare const useExportAuditLogs: () => {
10
+ exportAuditLogs: (filters: unknown, totalEntries: number) => Promise<void>;
11
+ downloadExport: () => void;
12
+ dismissExport: () => void;
13
+ isExporting: boolean;
14
+ progress: ExportProgress | null;
15
+ exportResult: ExportResult | null;
16
+ };
17
+ export { useExportAuditLogs };
18
+ export type { ExportProgress, ExportResult };
@@ -27,5 +27,14 @@ export declare const actionTypes: {
27
27
  'permission.create': string;
28
28
  'permission.update': string;
29
29
  'permission.delete': string;
30
+ 'release.create': string;
31
+ 'release.update': string;
32
+ 'release.delete': string;
33
+ 'release.trigger': string;
34
+ 'release.entry.add': string;
35
+ 'release.entry.update': string;
36
+ 'release.entry.remove': string;
37
+ 'release.settings.update': string;
38
+ 'audit-log.export': string;
30
39
  };
31
40
  export declare const getDefaultMessage: (value: keyof typeof actionTypes) => string;
@@ -3,6 +3,7 @@ declare const _default: {
3
3
  findMany(ctx: Context): Promise<void>;
4
4
  findManyUsers(ctx: Context): Promise<void>;
5
5
  findOne(ctx: Context): Promise<void>;
6
+ export(ctx: Context): Promise<void>;
6
7
  };
7
8
  export default _default;
8
9
  //# sourceMappingURL=audit-logs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"audit-logs.d.ts","sourceRoot":"","sources":["../../../../../../ee/server/src/audit-logs/controllers/audit-logs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;;kBAKb,OAAO;uBAUF,OAAO;iBAUb,OAAO;;AArB5B,wBA+BE"}
1
+ {"version":3,"file":"audit-logs.d.ts","sourceRoot":"","sources":["../../../../../../ee/server/src/audit-logs/controllers/audit-logs.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;;kBAkBb,OAAO;uBAUF,OAAO;iBAUb,OAAO;gBAWR,OAAO;;AAhC3B,wBA2FE"}
@@ -1 +1 @@
1
- {"version":3,"file":"audit-logs.d.ts","sourceRoot":"","sources":["../../../../../../ee/server/src/audit-logs/routes/audit-logs.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAeA,wBAsBE"}
1
+ {"version":3,"file":"audit-logs.d.ts","sourceRoot":"","sources":["../../../../../../ee/server/src/audit-logs/routes/audit-logs.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAeA,wBA4BE"}
@@ -1,10 +1,19 @@
1
+ import { Readable } from 'stream';
1
2
  import type { Core } from '@strapi/types';
2
3
  interface Event {
3
4
  action: string;
4
5
  date: Date;
5
- userId: string | number;
6
+ userId: string | number | null;
6
7
  payload: Record<string, unknown>;
7
8
  }
9
+ interface ExportQuery {
10
+ cursor?: number;
11
+ pageSize?: number;
12
+ until?: number;
13
+ token?: string;
14
+ [key: string]: unknown;
15
+ }
16
+ declare const toCsvLine: (row: any) => string;
8
17
  /**
9
18
  * @description
10
19
  * Manages audit logs interaction with the database. Accessible via strapi.get('audit-logs')
@@ -20,6 +29,18 @@ declare const createAuditLogsService: (strapi: Core.Strapi) => {
20
29
  total: number;
21
30
  };
22
31
  }>;
32
+ isExportTooLarge(query: {
33
+ filters?: unknown;
34
+ }): Promise<boolean>;
35
+ isTrustedContinuation(query: ExportQuery): boolean;
36
+ createExportStream(query: ExportQuery): Promise<{
37
+ stream: Readable;
38
+ nextCursor: number | null;
39
+ until: number;
40
+ isNewExport: boolean;
41
+ partSize: number;
42
+ exportToken: string;
43
+ }>;
23
44
  findManyUsers(query: {
24
45
  page?: number | string;
25
46
  pageSize?: number | string;
@@ -27,7 +48,7 @@ declare const createAuditLogsService: (strapi: Core.Strapi) => {
27
48
  results: {
28
49
  id: any;
29
50
  email: any;
30
- displayName: any;
51
+ displayName: string;
31
52
  }[];
32
53
  pagination: {
33
54
  page: number;
@@ -39,5 +60,5 @@ declare const createAuditLogsService: (strapi: Core.Strapi) => {
39
60
  findOne(id: unknown): Promise<any>;
40
61
  deleteExpiredEvents(expirationDate: Date): Promise<import("@strapi/database/dist/types").CountResult>;
41
62
  };
42
- export { createAuditLogsService };
63
+ export { createAuditLogsService, toCsvLine };
43
64
  //# sourceMappingURL=audit-logs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"audit-logs.d.ts","sourceRoot":"","sources":["../../../../../../ee/server/src/audit-logs/services/audit-logs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,UAAU,KAAK;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAsBD;;;GAGG;AACH,QAAA,MAAM,sBAAsB,GAAI,QAAQ,IAAI,CAAC,MAAM;qBAExB,KAAK;oBAWN,OAAO;;;;;;;;;yBAiCF;QAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE;;;;;;;;;;;;;gBAmC/D,OAAO;wCAkBW,IAAI;CAU3C,CAAC;AAEF,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
1
+ {"version":3,"file":"audit-logs.d.ts","sourceRoot":"","sources":["../../../../../../ee/server/src/audit-logs/services/audit-logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAyB1C,UAAU,KAAK;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;IAEX,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAkCD,UAAU,WAAW;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AA8BD,QAAA,MAAM,SAAS,GAAI,KAAK,GAAG,WAc1B,CAAC;AAEF;;;GAGG;AACH,QAAA,MAAM,sBAAsB,GAAI,QAAQ,IAAI,CAAC,MAAM;qBAExB,KAAK;oBAWN,OAAO;;;;;;;;;4BAiCC;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE;iCAoBtB,WAAW;8BAIR,WAAW;;;;;;;;yBA2GhB;QAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE;;;;;;;;;;;;;gBAmC/D,OAAO;wCAkBW,IAAI;CAU3C,CAAC;AAEF,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,CAAC"}
@@ -1,9 +1,15 @@
1
- import type { Core } from '@strapi/types';
1
+ import type { Core, Modules } from '@strapi/types';
2
2
  /**
3
3
  * @description
4
- * Manages the lifecycle of audit logs. Accessible via strapi.get('audit-logs-lifecycles')
4
+ * Manages the lifecycle of audit logs. Accessible via strapi.get('audit-logs-lifecycle')
5
5
  */
6
6
  declare const createAuditLogsLifecycleService: (strapi: Core.Strapi) => {
7
+ /**
8
+ * Adds an event to the list of audited events. Plugins register their own from
9
+ * their bootstrap; the transformer builds the audited shape
10
+ * ({resource, details, outcome}) from the arguments passed to eventHub.emit().
11
+ */
12
+ registerEvent<TDetails = unknown>(name: string, transform: Modules.AuditLogs.EventTransformer<TDetails>): void;
7
13
  register(): Promise</*elided*/ any>;
8
14
  unsubscribe(): /*elided*/ any;
9
15
  destroy(): /*elided*/ any;
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycles.d.ts","sourceRoot":"","sources":["../../../../../../ee/server/src/audit-logs/services/lifecycles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAW,MAAM,eAAe,CAAC;AAiEnD;;;GAGG;AACH,QAAA,MAAM,+BAA+B,GAAI,QAAQ,IAAI,CAAC,MAAM;;;;CA4H3D,CAAC;AAEF,OAAO,EAAE,+BAA+B,EAAE,CAAC"}
1
+ {"version":3,"file":"lifecycles.d.ts","sourceRoot":"","sources":["../../../../../../ee/server/src/audit-logs/services/lifecycles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAgFnD;;;GAGG;AACH,QAAA,MAAM,+BAA+B,GAAI,QAAQ,IAAI,CAAC,MAAM;IAiHxD;;;;OAIG;kBACW,QAAQ,kBACd,MAAM,aACD,OAAO,CAAC,SAAS,CAAC,gBAAgB,CAAC,QAAQ,CAAC;;;;CAyF5D,CAAC;AAEF,OAAO,EAAE,+BAA+B,EAAE,CAAC"}
@@ -0,0 +1,5 @@
1
+ declare const CSV_BOM = "\uFEFF";
2
+ declare const escapeCsvValue: (value: unknown) => string;
3
+ declare const serializeCsvLine: (values: unknown[]) => string;
4
+ export { escapeCsvValue, serializeCsvLine, CSV_BOM };
5
+ //# sourceMappingURL=csv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csv.d.ts","sourceRoot":"","sources":["../../../../../../ee/server/src/audit-logs/utils/csv.ts"],"names":[],"mappings":"AACA,QAAA,MAAM,OAAO,WAAW,CAAC;AAGzB,QAAA,MAAM,cAAc,GAAI,OAAO,OAAO,KAAG,MAgBxC,CAAC;AAEF,QAAA,MAAM,gBAAgB,GAAI,QAAQ,OAAO,EAAE,KAAG,MAE7C,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC"}
@@ -0,0 +1,5 @@
1
+ declare const EXPORT_TOKEN_TTL_MS: number;
2
+ declare const signExportToken: (secret: string, until: number, filters: unknown, issuedAt?: number) => string;
3
+ declare const verifyExportToken: (secret: string, token: unknown, until: number, filters: unknown, now?: number) => boolean;
4
+ export { signExportToken, verifyExportToken, EXPORT_TOKEN_TTL_MS };
5
+ //# sourceMappingURL=export-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-token.d.ts","sourceRoot":"","sources":["../../../../../../ee/server/src/audit-logs/utils/export-token.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,mBAAmB,QAAiB,CAAC;AAW3C,QAAA,MAAM,eAAe,GACnB,QAAQ,MAAM,EACd,OAAO,MAAM,EACb,SAAS,OAAO,EAChB,iBAAqB,KACpB,MAA6E,CAAC;AAEjF,QAAA,MAAM,iBAAiB,GACrB,QAAQ,MAAM,EACd,OAAO,OAAO,EACd,OAAO,MAAM,EACb,SAAS,OAAO,EAChB,YAAgB,KACf,OAyBF,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,10 @@
1
+ interface AdminUserLike {
2
+ username?: string | null;
3
+ firstname?: string | null;
4
+ lastname?: string | null;
5
+ email: string;
6
+ }
7
+ /** How an admin user is named across audit logs */
8
+ declare const getDisplayName: (user: AdminUserLike) => string;
9
+ export { getDisplayName };
10
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../ee/server/src/audit-logs/utils.ts"],"names":[],"mappings":"AAAA,UAAU,aAAa;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,mDAAmD;AACnD,QAAA,MAAM,cAAc,GAAI,MAAM,aAAa,KAAG,MAU7C,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -1,8 +1,10 @@
1
1
  export declare const validateFindMany: (body: unknown, errorMessage?: string) => Promise<any>;
2
2
  export declare const validateFindManyUsers: (body: unknown, errorMessage?: string) => Promise<any>;
3
+ export declare const validateExport: (body: unknown, errorMessage?: string) => Promise<any>;
3
4
  declare const _default: {
4
5
  validateFindMany: (body: unknown, errorMessage?: string) => Promise<any>;
5
6
  validateFindManyUsers: (body: unknown, errorMessage?: string) => Promise<any>;
7
+ validateExport: (body: unknown, errorMessage?: string) => Promise<any>;
6
8
  };
7
9
  export default _default;
8
10
  //# sourceMappingURL=audit-logs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"audit-logs.d.ts","sourceRoot":"","sources":["../../../../../../ee/server/src/audit-logs/validation/audit-logs.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,gBAAgB,wDAA+D,CAAC;AAC7F,eAAO,MAAM,qBAAqB,wDAEhC,CAAC;;;;;AAEH,wBAGE"}
1
+ {"version":3,"file":"audit-logs.d.ts","sourceRoot":"","sources":["../../../../../../ee/server/src/audit-logs/validation/audit-logs.ts"],"names":[],"mappings":"AAiCA,eAAO,MAAM,gBAAgB,wDAA+D,CAAC;AAC7F,eAAO,MAAM,qBAAqB,wDAEhC,CAAC;AACH,eAAO,MAAM,cAAc,wDAA6D,CAAC;;;;;;AAEzF,wBAIE"}
@@ -1 +1 @@
1
- {"version":3,"file":"admin-actions.d.ts","sourceRoot":"","sources":["../../../../../ee/server/src/config/admin-actions.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,wBA6BE"}
1
+ {"version":3,"file":"admin-actions.d.ts","sourceRoot":"","sources":["../../../../../ee/server/src/config/admin-actions.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,wBAqCE"}
@@ -5,6 +5,7 @@ declare const getAdminEE: () => {
5
5
  findMany(ctx: import("koa").Context): Promise<void>;
6
6
  findManyUsers(ctx: import("koa").Context): Promise<void>;
7
7
  findOne(ctx: import("koa").Context): Promise<void>;
8
+ export(ctx: import("koa").Context): Promise<void>;
8
9
  } | undefined;
9
10
  authentication: {
10
11
  getProviders(ctx: import("koa").Context): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../ee/server/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAc1C,QAAA,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBA4Be;QAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;KAAE;wBAcxB;QAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;KAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAOpD,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../ee/server/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAe1C,QAAA,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBA4Be;QAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;KAAE;wBAsBxB;QAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;KAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAOpD,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -1,7 +1,12 @@
1
1
  'use strict';
2
2
 
3
+ var zlib = require('zlib');
4
+ var utils = require('@strapi/utils');
5
+ var auditLogExport = require('../../../../../shared/utils/audit-log-export.js');
3
6
  var auditLogs = require('../validation/audit-logs.js');
4
7
 
8
+ const EXPORT_INVALID_CONTINUATION_MESSAGE = 'The export continuation is invalid or has expired. Restart the export.';
9
+ const EXPORT_TOO_LARGE_MESSAGE = 'The export matches more entries than the configured limit. Add filters to reduce it.';
5
10
  var auditLogsController = {
6
11
  async findMany (ctx) {
7
12
  const { query } = ctx.request;
@@ -26,6 +31,51 @@ var auditLogsController = {
26
31
  const body = await auditLogs.findOne(id);
27
32
  ctx.body = body;
28
33
  strapi.telemetry.send('didWatchAnAuditLog');
34
+ },
35
+ async export (ctx) {
36
+ const { query } = ctx.request;
37
+ const validatedQuery = await auditLogs.validateExport(query);
38
+ const auditLogs$1 = strapi.get('audit-logs');
39
+ const isContinuation = validatedQuery.cursor !== undefined;
40
+ if (isContinuation && !auditLogs$1.isTrustedContinuation(validatedQuery)) {
41
+ throw new utils.errors.ValidationError(EXPORT_INVALID_CONTINUATION_MESSAGE);
42
+ }
43
+ if (!isContinuation) {
44
+ if (await auditLogs$1.isExportTooLarge({
45
+ filters: validatedQuery.filters ?? null
46
+ })) {
47
+ throw new utils.errors.PayloadTooLargeError(EXPORT_TOO_LARGE_MESSAGE);
48
+ }
49
+ }
50
+ const { stream, nextCursor, until, isNewExport, partSize, exportToken } = await auditLogs$1.createExportStream(validatedQuery);
51
+ const date = new Date().toISOString().slice(0, 10);
52
+ ctx.set('Content-Type', 'text/csv; charset=utf-8');
53
+ ctx.set('Content-Disposition', `attachment; filename="audit-logs-${date}.csv"`);
54
+ ctx.set(auditLogExport.AUDIT_LOGS_EXPORT_UNTIL_HEADER, String(until));
55
+ ctx.set(auditLogExport.AUDIT_LOGS_EXPORT_PART_SIZE_HEADER, String(partSize));
56
+ ctx.set(auditLogExport.AUDIT_LOGS_EXPORT_TOKEN_HEADER, exportToken);
57
+ ctx.set(auditLogExport.AUDIT_LOGS_EXPORT_NEXT_CURSOR_HEADER, nextCursor !== null ? String(nextCursor) : auditLogExport.AUDIT_LOGS_EXPORT_CURSOR_DONE);
58
+ const exposedHeaders = [
59
+ ctx.response.get('Access-Control-Expose-Headers'),
60
+ auditLogExport.AUDIT_LOGS_EXPORT_UNTIL_HEADER,
61
+ auditLogExport.AUDIT_LOGS_EXPORT_NEXT_CURSOR_HEADER,
62
+ auditLogExport.AUDIT_LOGS_EXPORT_PART_SIZE_HEADER,
63
+ auditLogExport.AUDIT_LOGS_EXPORT_TOKEN_HEADER,
64
+ 'Content-Disposition'
65
+ ].filter(Boolean).join(', ');
66
+ ctx.set('Access-Control-Expose-Headers', exposedHeaders);
67
+ ctx.vary('Accept-Encoding');
68
+ if (ctx.acceptsEncodings('gzip', 'identity') === 'gzip') {
69
+ ctx.set('Content-Encoding', 'gzip');
70
+ const gzip = zlib.createGzip();
71
+ stream.on('error', (error)=>gzip.destroy(error));
72
+ ctx.body = stream.pipe(gzip);
73
+ } else {
74
+ ctx.body = stream;
75
+ }
76
+ if (isNewExport) {
77
+ strapi.telemetry.send('didExportAuditLogs');
78
+ }
29
79
  }
30
80
  };
31
81
 
@@ -1 +1 @@
1
- {"version":3,"file":"audit-logs.js","sources":["../../../../../../../ee/server/src/audit-logs/controllers/audit-logs.ts"],"sourcesContent":["import type { Context } from 'koa';\n\nimport { validateFindMany, validateFindManyUsers } from '../validation/audit-logs';\n\nexport default {\n async findMany(ctx: Context) {\n const { query } = ctx.request;\n await validateFindMany(query);\n\n const auditLogs = strapi.get('audit-logs');\n const body = await auditLogs.findMany(query);\n\n ctx.body = body;\n },\n\n async findManyUsers(ctx: Context) {\n const { query } = ctx.request;\n const { page, pageSize } = await validateFindManyUsers(query);\n\n const auditLogs = strapi.get('audit-logs');\n const body = await auditLogs.findManyUsers({ page, pageSize });\n\n ctx.body = body;\n },\n\n async findOne(ctx: Context) {\n const { id } = ctx.params;\n\n const auditLogs = strapi.get('audit-logs');\n const body = await auditLogs.findOne(id);\n\n ctx.body = body;\n\n strapi.telemetry.send('didWatchAnAuditLog');\n },\n};\n"],"names":["findMany","ctx","query","request","validateFindMany","auditLogs","strapi","get","body","findManyUsers","page","pageSize","validateFindManyUsers","findOne","id","params","telemetry","send"],"mappings":";;;;AAIA,0BAAe;AACb,IAAA,MAAMA,UAASC,GAAY,EAAA;AACzB,QAAA,MAAM,EAAEC,KAAK,EAAE,GAAGD,IAAIE,OAAO;AAC7B,QAAA,MAAMC,0BAAAA,CAAiBF,KAAAA,CAAAA;QAEvB,MAAMG,WAAAA,GAAYC,MAAAA,CAAOC,GAAG,CAAC,YAAA,CAAA;AAC7B,QAAA,MAAMC,IAAAA,GAAO,MAAMH,WAAAA,CAAUL,QAAQ,CAACE,KAAAA,CAAAA;AAEtCD,QAAAA,GAAAA,CAAIO,IAAI,GAAGA,IAAAA;AACb,IAAA,CAAA;AAEA,IAAA,MAAMC,eAAcR,GAAY,EAAA;AAC9B,QAAA,MAAM,EAAEC,KAAK,EAAE,GAAGD,IAAIE,OAAO;AAC7B,QAAA,MAAM,EAAEO,IAAI,EAAEC,QAAQ,EAAE,GAAG,MAAMC,+BAAAA,CAAsBV,KAAAA,CAAAA;QAEvD,MAAMG,WAAAA,GAAYC,MAAAA,CAAOC,GAAG,CAAC,YAAA,CAAA;AAC7B,QAAA,MAAMC,IAAAA,GAAO,MAAMH,WAAAA,CAAUI,aAAa,CAAC;AAAEC,YAAAA,IAAAA;AAAMC,YAAAA;AAAS,SAAA,CAAA;AAE5DV,QAAAA,GAAAA,CAAIO,IAAI,GAAGA,IAAAA;AACb,IAAA,CAAA;AAEA,IAAA,MAAMK,SAAQZ,GAAY,EAAA;AACxB,QAAA,MAAM,EAAEa,EAAE,EAAE,GAAGb,IAAIc,MAAM;QAEzB,MAAMV,SAAAA,GAAYC,MAAAA,CAAOC,GAAG,CAAC,YAAA,CAAA;AAC7B,QAAA,MAAMC,IAAAA,GAAO,MAAMH,SAAAA,CAAUQ,OAAO,CAACC,EAAAA,CAAAA;AAErCb,QAAAA,GAAAA,CAAIO,IAAI,GAAGA,IAAAA;QAEXF,MAAAA,CAAOU,SAAS,CAACC,IAAI,CAAC,oBAAA,CAAA;AACxB,IAAA;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"audit-logs.js","sources":["../../../../../../../ee/server/src/audit-logs/controllers/audit-logs.ts"],"sourcesContent":["import { createGzip } from 'zlib';\n\nimport type { Context } from 'koa';\nimport { errors } from '@strapi/utils';\n\nimport {\n AUDIT_LOGS_EXPORT_CURSOR_DONE,\n AUDIT_LOGS_EXPORT_NEXT_CURSOR_HEADER,\n AUDIT_LOGS_EXPORT_PART_SIZE_HEADER,\n AUDIT_LOGS_EXPORT_TOKEN_HEADER,\n AUDIT_LOGS_EXPORT_UNTIL_HEADER,\n} from '../../../../../shared/utils/audit-log-export';\nimport { validateExport, validateFindMany, validateFindManyUsers } from '../validation/audit-logs';\n\nconst EXPORT_INVALID_CONTINUATION_MESSAGE =\n 'The export continuation is invalid or has expired. Restart the export.';\nconst EXPORT_TOO_LARGE_MESSAGE =\n 'The export matches more entries than the configured limit. Add filters to reduce it.';\n\nexport default {\n async findMany(ctx: Context) {\n const { query } = ctx.request;\n await validateFindMany(query);\n\n const auditLogs = strapi.get('audit-logs');\n const body = await auditLogs.findMany(query);\n\n ctx.body = body;\n },\n\n async findManyUsers(ctx: Context) {\n const { query } = ctx.request;\n const { page, pageSize } = await validateFindManyUsers(query);\n\n const auditLogs = strapi.get('audit-logs');\n const body = await auditLogs.findManyUsers({ page, pageSize });\n\n ctx.body = body;\n },\n\n async findOne(ctx: Context) {\n const { id } = ctx.params;\n\n const auditLogs = strapi.get('audit-logs');\n const body = await auditLogs.findOne(id);\n\n ctx.body = body;\n\n strapi.telemetry.send('didWatchAnAuditLog');\n },\n\n async export(ctx: Context) {\n const { query } = ctx.request;\n const validatedQuery = await validateExport(query);\n\n const auditLogs = strapi.get('audit-logs');\n\n const isContinuation = validatedQuery.cursor !== undefined;\n\n if (isContinuation && !auditLogs.isTrustedContinuation(validatedQuery)) {\n throw new errors.ValidationError(EXPORT_INVALID_CONTINUATION_MESSAGE);\n }\n\n if (!isContinuation) {\n if (await auditLogs.isExportTooLarge({ filters: validatedQuery.filters ?? null })) {\n throw new errors.PayloadTooLargeError(EXPORT_TOO_LARGE_MESSAGE);\n }\n }\n\n const { stream, nextCursor, until, isNewExport, partSize, exportToken } =\n await auditLogs.createExportStream(validatedQuery);\n\n const date = new Date().toISOString().slice(0, 10);\n\n ctx.set('Content-Type', 'text/csv; charset=utf-8');\n ctx.set('Content-Disposition', `attachment; filename=\"audit-logs-${date}.csv\"`);\n ctx.set(AUDIT_LOGS_EXPORT_UNTIL_HEADER, String(until));\n ctx.set(AUDIT_LOGS_EXPORT_PART_SIZE_HEADER, String(partSize));\n ctx.set(AUDIT_LOGS_EXPORT_TOKEN_HEADER, exportToken);\n ctx.set(\n AUDIT_LOGS_EXPORT_NEXT_CURSOR_HEADER,\n nextCursor !== null ? String(nextCursor) : AUDIT_LOGS_EXPORT_CURSOR_DONE\n );\n\n const exposedHeaders = [\n ctx.response.get('Access-Control-Expose-Headers'),\n AUDIT_LOGS_EXPORT_UNTIL_HEADER,\n AUDIT_LOGS_EXPORT_NEXT_CURSOR_HEADER,\n AUDIT_LOGS_EXPORT_PART_SIZE_HEADER,\n AUDIT_LOGS_EXPORT_TOKEN_HEADER,\n 'Content-Disposition',\n ]\n .filter(Boolean)\n .join(', ');\n ctx.set('Access-Control-Expose-Headers', exposedHeaders);\n\n ctx.vary('Accept-Encoding');\n if (ctx.acceptsEncodings('gzip', 'identity') === 'gzip') {\n ctx.set('Content-Encoding', 'gzip');\n const gzip = createGzip();\n stream.on('error', (error: Error) => gzip.destroy(error));\n ctx.body = stream.pipe(gzip);\n } else {\n ctx.body = stream;\n }\n\n if (isNewExport) {\n strapi.telemetry.send('didExportAuditLogs');\n }\n },\n};\n"],"names":["EXPORT_INVALID_CONTINUATION_MESSAGE","EXPORT_TOO_LARGE_MESSAGE","findMany","ctx","query","request","validateFindMany","auditLogs","strapi","get","body","findManyUsers","page","pageSize","validateFindManyUsers","findOne","id","params","telemetry","send","export","validatedQuery","validateExport","isContinuation","cursor","undefined","isTrustedContinuation","errors","ValidationError","isExportTooLarge","filters","PayloadTooLargeError","stream","nextCursor","until","isNewExport","partSize","exportToken","createExportStream","date","Date","toISOString","slice","set","AUDIT_LOGS_EXPORT_UNTIL_HEADER","String","AUDIT_LOGS_EXPORT_PART_SIZE_HEADER","AUDIT_LOGS_EXPORT_TOKEN_HEADER","AUDIT_LOGS_EXPORT_NEXT_CURSOR_HEADER","AUDIT_LOGS_EXPORT_CURSOR_DONE","exposedHeaders","response","filter","Boolean","join","vary","acceptsEncodings","gzip","createGzip","on","error","destroy","pipe"],"mappings":"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"}
@@ -1,5 +1,10 @@
1
- import { validateFindManyUsers, validateFindMany } from '../validation/audit-logs.mjs';
1
+ import { createGzip } from 'zlib';
2
+ import { errors } from '@strapi/utils';
3
+ import { AUDIT_LOGS_EXPORT_UNTIL_HEADER, AUDIT_LOGS_EXPORT_PART_SIZE_HEADER, AUDIT_LOGS_EXPORT_TOKEN_HEADER, AUDIT_LOGS_EXPORT_NEXT_CURSOR_HEADER, AUDIT_LOGS_EXPORT_CURSOR_DONE } from '../../../../../shared/utils/audit-log-export.mjs';
4
+ import { validateExport, validateFindManyUsers, validateFindMany } from '../validation/audit-logs.mjs';
2
5
 
6
+ const EXPORT_INVALID_CONTINUATION_MESSAGE = 'The export continuation is invalid or has expired. Restart the export.';
7
+ const EXPORT_TOO_LARGE_MESSAGE = 'The export matches more entries than the configured limit. Add filters to reduce it.';
3
8
  var auditLogsController = {
4
9
  async findMany (ctx) {
5
10
  const { query } = ctx.request;
@@ -24,6 +29,51 @@ var auditLogsController = {
24
29
  const body = await auditLogs.findOne(id);
25
30
  ctx.body = body;
26
31
  strapi.telemetry.send('didWatchAnAuditLog');
32
+ },
33
+ async export (ctx) {
34
+ const { query } = ctx.request;
35
+ const validatedQuery = await validateExport(query);
36
+ const auditLogs = strapi.get('audit-logs');
37
+ const isContinuation = validatedQuery.cursor !== undefined;
38
+ if (isContinuation && !auditLogs.isTrustedContinuation(validatedQuery)) {
39
+ throw new errors.ValidationError(EXPORT_INVALID_CONTINUATION_MESSAGE);
40
+ }
41
+ if (!isContinuation) {
42
+ if (await auditLogs.isExportTooLarge({
43
+ filters: validatedQuery.filters ?? null
44
+ })) {
45
+ throw new errors.PayloadTooLargeError(EXPORT_TOO_LARGE_MESSAGE);
46
+ }
47
+ }
48
+ const { stream, nextCursor, until, isNewExport, partSize, exportToken } = await auditLogs.createExportStream(validatedQuery);
49
+ const date = new Date().toISOString().slice(0, 10);
50
+ ctx.set('Content-Type', 'text/csv; charset=utf-8');
51
+ ctx.set('Content-Disposition', `attachment; filename="audit-logs-${date}.csv"`);
52
+ ctx.set(AUDIT_LOGS_EXPORT_UNTIL_HEADER, String(until));
53
+ ctx.set(AUDIT_LOGS_EXPORT_PART_SIZE_HEADER, String(partSize));
54
+ ctx.set(AUDIT_LOGS_EXPORT_TOKEN_HEADER, exportToken);
55
+ ctx.set(AUDIT_LOGS_EXPORT_NEXT_CURSOR_HEADER, nextCursor !== null ? String(nextCursor) : AUDIT_LOGS_EXPORT_CURSOR_DONE);
56
+ const exposedHeaders = [
57
+ ctx.response.get('Access-Control-Expose-Headers'),
58
+ AUDIT_LOGS_EXPORT_UNTIL_HEADER,
59
+ AUDIT_LOGS_EXPORT_NEXT_CURSOR_HEADER,
60
+ AUDIT_LOGS_EXPORT_PART_SIZE_HEADER,
61
+ AUDIT_LOGS_EXPORT_TOKEN_HEADER,
62
+ 'Content-Disposition'
63
+ ].filter(Boolean).join(', ');
64
+ ctx.set('Access-Control-Expose-Headers', exposedHeaders);
65
+ ctx.vary('Accept-Encoding');
66
+ if (ctx.acceptsEncodings('gzip', 'identity') === 'gzip') {
67
+ ctx.set('Content-Encoding', 'gzip');
68
+ const gzip = createGzip();
69
+ stream.on('error', (error)=>gzip.destroy(error));
70
+ ctx.body = stream.pipe(gzip);
71
+ } else {
72
+ ctx.body = stream;
73
+ }
74
+ if (isNewExport) {
75
+ strapi.telemetry.send('didExportAuditLogs');
76
+ }
27
77
  }
28
78
  };
29
79
 
@@ -1 +1 @@
1
- {"version":3,"file":"audit-logs.mjs","sources":["../../../../../../../ee/server/src/audit-logs/controllers/audit-logs.ts"],"sourcesContent":["import type { Context } from 'koa';\n\nimport { validateFindMany, validateFindManyUsers } from '../validation/audit-logs';\n\nexport default {\n async findMany(ctx: Context) {\n const { query } = ctx.request;\n await validateFindMany(query);\n\n const auditLogs = strapi.get('audit-logs');\n const body = await auditLogs.findMany(query);\n\n ctx.body = body;\n },\n\n async findManyUsers(ctx: Context) {\n const { query } = ctx.request;\n const { page, pageSize } = await validateFindManyUsers(query);\n\n const auditLogs = strapi.get('audit-logs');\n const body = await auditLogs.findManyUsers({ page, pageSize });\n\n ctx.body = body;\n },\n\n async findOne(ctx: Context) {\n const { id } = ctx.params;\n\n const auditLogs = strapi.get('audit-logs');\n const body = await auditLogs.findOne(id);\n\n ctx.body = body;\n\n strapi.telemetry.send('didWatchAnAuditLog');\n },\n};\n"],"names":["findMany","ctx","query","request","validateFindMany","auditLogs","strapi","get","body","findManyUsers","page","pageSize","validateFindManyUsers","findOne","id","params","telemetry","send"],"mappings":";;AAIA,0BAAe;AACb,IAAA,MAAMA,UAASC,GAAY,EAAA;AACzB,QAAA,MAAM,EAAEC,KAAK,EAAE,GAAGD,IAAIE,OAAO;AAC7B,QAAA,MAAMC,gBAAAA,CAAiBF,KAAAA,CAAAA;QAEvB,MAAMG,SAAAA,GAAYC,MAAAA,CAAOC,GAAG,CAAC,YAAA,CAAA;AAC7B,QAAA,MAAMC,IAAAA,GAAO,MAAMH,SAAAA,CAAUL,QAAQ,CAACE,KAAAA,CAAAA;AAEtCD,QAAAA,GAAAA,CAAIO,IAAI,GAAGA,IAAAA;AACb,IAAA,CAAA;AAEA,IAAA,MAAMC,eAAcR,GAAY,EAAA;AAC9B,QAAA,MAAM,EAAEC,KAAK,EAAE,GAAGD,IAAIE,OAAO;AAC7B,QAAA,MAAM,EAAEO,IAAI,EAAEC,QAAQ,EAAE,GAAG,MAAMC,qBAAAA,CAAsBV,KAAAA,CAAAA;QAEvD,MAAMG,SAAAA,GAAYC,MAAAA,CAAOC,GAAG,CAAC,YAAA,CAAA;AAC7B,QAAA,MAAMC,IAAAA,GAAO,MAAMH,SAAAA,CAAUI,aAAa,CAAC;AAAEC,YAAAA,IAAAA;AAAMC,YAAAA;AAAS,SAAA,CAAA;AAE5DV,QAAAA,GAAAA,CAAIO,IAAI,GAAGA,IAAAA;AACb,IAAA,CAAA;AAEA,IAAA,MAAMK,SAAQZ,GAAY,EAAA;AACxB,QAAA,MAAM,EAAEa,EAAE,EAAE,GAAGb,IAAIc,MAAM;QAEzB,MAAMV,SAAAA,GAAYC,MAAAA,CAAOC,GAAG,CAAC,YAAA,CAAA;AAC7B,QAAA,MAAMC,IAAAA,GAAO,MAAMH,SAAAA,CAAUQ,OAAO,CAACC,EAAAA,CAAAA;AAErCb,QAAAA,GAAAA,CAAIO,IAAI,GAAGA,IAAAA;QAEXF,MAAAA,CAAOU,SAAS,CAACC,IAAI,CAAC,oBAAA,CAAA;AACxB,IAAA;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"audit-logs.mjs","sources":["../../../../../../../ee/server/src/audit-logs/controllers/audit-logs.ts"],"sourcesContent":["import { createGzip } from 'zlib';\n\nimport type { Context } from 'koa';\nimport { errors } from '@strapi/utils';\n\nimport {\n AUDIT_LOGS_EXPORT_CURSOR_DONE,\n AUDIT_LOGS_EXPORT_NEXT_CURSOR_HEADER,\n AUDIT_LOGS_EXPORT_PART_SIZE_HEADER,\n AUDIT_LOGS_EXPORT_TOKEN_HEADER,\n AUDIT_LOGS_EXPORT_UNTIL_HEADER,\n} from '../../../../../shared/utils/audit-log-export';\nimport { validateExport, validateFindMany, validateFindManyUsers } from '../validation/audit-logs';\n\nconst EXPORT_INVALID_CONTINUATION_MESSAGE =\n 'The export continuation is invalid or has expired. Restart the export.';\nconst EXPORT_TOO_LARGE_MESSAGE =\n 'The export matches more entries than the configured limit. Add filters to reduce it.';\n\nexport default {\n async findMany(ctx: Context) {\n const { query } = ctx.request;\n await validateFindMany(query);\n\n const auditLogs = strapi.get('audit-logs');\n const body = await auditLogs.findMany(query);\n\n ctx.body = body;\n },\n\n async findManyUsers(ctx: Context) {\n const { query } = ctx.request;\n const { page, pageSize } = await validateFindManyUsers(query);\n\n const auditLogs = strapi.get('audit-logs');\n const body = await auditLogs.findManyUsers({ page, pageSize });\n\n ctx.body = body;\n },\n\n async findOne(ctx: Context) {\n const { id } = ctx.params;\n\n const auditLogs = strapi.get('audit-logs');\n const body = await auditLogs.findOne(id);\n\n ctx.body = body;\n\n strapi.telemetry.send('didWatchAnAuditLog');\n },\n\n async export(ctx: Context) {\n const { query } = ctx.request;\n const validatedQuery = await validateExport(query);\n\n const auditLogs = strapi.get('audit-logs');\n\n const isContinuation = validatedQuery.cursor !== undefined;\n\n if (isContinuation && !auditLogs.isTrustedContinuation(validatedQuery)) {\n throw new errors.ValidationError(EXPORT_INVALID_CONTINUATION_MESSAGE);\n }\n\n if (!isContinuation) {\n if (await auditLogs.isExportTooLarge({ filters: validatedQuery.filters ?? null })) {\n throw new errors.PayloadTooLargeError(EXPORT_TOO_LARGE_MESSAGE);\n }\n }\n\n const { stream, nextCursor, until, isNewExport, partSize, exportToken } =\n await auditLogs.createExportStream(validatedQuery);\n\n const date = new Date().toISOString().slice(0, 10);\n\n ctx.set('Content-Type', 'text/csv; charset=utf-8');\n ctx.set('Content-Disposition', `attachment; filename=\"audit-logs-${date}.csv\"`);\n ctx.set(AUDIT_LOGS_EXPORT_UNTIL_HEADER, String(until));\n ctx.set(AUDIT_LOGS_EXPORT_PART_SIZE_HEADER, String(partSize));\n ctx.set(AUDIT_LOGS_EXPORT_TOKEN_HEADER, exportToken);\n ctx.set(\n AUDIT_LOGS_EXPORT_NEXT_CURSOR_HEADER,\n nextCursor !== null ? String(nextCursor) : AUDIT_LOGS_EXPORT_CURSOR_DONE\n );\n\n const exposedHeaders = [\n ctx.response.get('Access-Control-Expose-Headers'),\n AUDIT_LOGS_EXPORT_UNTIL_HEADER,\n AUDIT_LOGS_EXPORT_NEXT_CURSOR_HEADER,\n AUDIT_LOGS_EXPORT_PART_SIZE_HEADER,\n AUDIT_LOGS_EXPORT_TOKEN_HEADER,\n 'Content-Disposition',\n ]\n .filter(Boolean)\n .join(', ');\n ctx.set('Access-Control-Expose-Headers', exposedHeaders);\n\n ctx.vary('Accept-Encoding');\n if (ctx.acceptsEncodings('gzip', 'identity') === 'gzip') {\n ctx.set('Content-Encoding', 'gzip');\n const gzip = createGzip();\n stream.on('error', (error: Error) => gzip.destroy(error));\n ctx.body = stream.pipe(gzip);\n } else {\n ctx.body = stream;\n }\n\n if (isNewExport) {\n strapi.telemetry.send('didExportAuditLogs');\n }\n },\n};\n"],"names":["EXPORT_INVALID_CONTINUATION_MESSAGE","EXPORT_TOO_LARGE_MESSAGE","findMany","ctx","query","request","validateFindMany","auditLogs","strapi","get","body","findManyUsers","page","pageSize","validateFindManyUsers","findOne","id","params","telemetry","send","export","validatedQuery","validateExport","isContinuation","cursor","undefined","isTrustedContinuation","errors","ValidationError","isExportTooLarge","filters","PayloadTooLargeError","stream","nextCursor","until","isNewExport","partSize","exportToken","createExportStream","date","Date","toISOString","slice","set","AUDIT_LOGS_EXPORT_UNTIL_HEADER","String","AUDIT_LOGS_EXPORT_PART_SIZE_HEADER","AUDIT_LOGS_EXPORT_TOKEN_HEADER","AUDIT_LOGS_EXPORT_NEXT_CURSOR_HEADER","AUDIT_LOGS_EXPORT_CURSOR_DONE","exposedHeaders","response","filter","Boolean","join","vary","acceptsEncodings","gzip","createGzip","on","error","destroy","pipe"],"mappings":"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"}
@@ -2,7 +2,9 @@
2
2
 
3
3
  var utils = require('../../routes/utils.js');
4
4
 
5
- const getRouteConfig = ()=>({
5
+ const getRouteConfig = (actions = [
6
+ 'admin::audit-logs.read'
7
+ ])=>({
6
8
  middlewares: [
7
9
  utils.enableFeatureMiddleware('audit-logs')
8
10
  ],
@@ -11,9 +13,7 @@ const getRouteConfig = ()=>({
11
13
  {
12
14
  name: 'admin::hasPermissions',
13
15
  config: {
14
- actions: [
15
- 'admin::audit-logs.read'
16
- ]
16
+ actions
17
17
  }
18
18
  }
19
19
  ]
@@ -33,6 +33,15 @@ var auditLogsRoutes = {
33
33
  handler: 'audit-logs.findManyUsers',
34
34
  config: getRouteConfig()
35
35
  },
36
+ {
37
+ method: 'GET',
38
+ path: '/audit-logs/export',
39
+ handler: 'audit-logs.export',
40
+ config: getRouteConfig([
41
+ 'admin::audit-logs.read',
42
+ 'admin::audit-logs.export'
43
+ ])
44
+ },
36
45
  {
37
46
  method: 'GET',
38
47
  path: '/audit-logs/:id',