@webiny/api-audit-logs 6.4.11 → 6.6.0-alpha.1

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/AuditLogsFeature.d.ts +8 -0
  2. package/AuditLogsFeature.js +42 -0
  3. package/AuditLogsFeature.js.map +1 -0
  4. package/abstractions.d.ts +8 -3
  5. package/abstractions.js +2 -1
  6. package/abstractions.js.map +1 -1
  7. package/context/AuditLogsContextValue.js +5 -3
  8. package/context/AuditLogsContextValue.js.map +1 -1
  9. package/graphql/AuditLogsGraphQLSchema.d.ts +9 -0
  10. package/graphql/AuditLogsGraphQLSchema.js +134 -0
  11. package/graphql/AuditLogsGraphQLSchema.js.map +1 -0
  12. package/index.d.ts +2 -8
  13. package/index.js +1 -25
  14. package/package.json +24 -24
  15. package/storage/types.d.ts +0 -35
  16. package/subscriptions/aco/handlers/AuditLogFolderAfterDeleteHandler.js +4 -7
  17. package/subscriptions/aco/handlers/AuditLogFolderAfterDeleteHandler.js.map +1 -1
  18. package/subscriptions/ai/handlers/AuditLogAiAfterGenerateTextHandler.d.ts +11 -0
  19. package/subscriptions/ai/handlers/AuditLogAiAfterGenerateTextHandler.js +41 -0
  20. package/subscriptions/ai/handlers/AuditLogAiAfterGenerateTextHandler.js.map +1 -0
  21. package/subscriptions/ai/handlers/AuditLogAiBeforeGenerateTextHandler.d.ts +11 -0
  22. package/subscriptions/ai/handlers/AuditLogAiBeforeGenerateTextHandler.js +38 -0
  23. package/subscriptions/ai/handlers/AuditLogAiBeforeGenerateTextHandler.js.map +1 -0
  24. package/subscriptions/ai/handlers/AuditLogAiGenerateTextErrorHandler.d.ts +11 -0
  25. package/subscriptions/ai/handlers/AuditLogAiGenerateTextErrorHandler.js +40 -0
  26. package/subscriptions/ai/handlers/AuditLogAiGenerateTextErrorHandler.js.map +1 -0
  27. package/subscriptions/ai/index.d.ts +2 -0
  28. package/subscriptions/ai/index.js +11 -0
  29. package/subscriptions/ai/index.js.map +1 -0
  30. package/subscriptions/index.js +2 -0
  31. package/subscriptions/index.js.map +1 -1
  32. package/types.d.ts +1 -2
  33. package/utils/getAuditConfig.js +4 -2
  34. package/utils/getAuditConfig.js.map +1 -1
  35. package/context/index.d.ts +0 -9
  36. package/context/index.js +0 -31
  37. package/context/index.js.map +0 -1
  38. package/graphql/schema.d.ts +0 -3
  39. package/graphql/schema.js +0 -115
  40. package/graphql/schema.js.map +0 -1
  41. package/index.js.map +0 -1
  42. package/storage/AccessPatternHandler.d.ts +0 -14
  43. package/storage/AccessPatternHandler.js +0 -39
  44. package/storage/AccessPatternHandler.js.map +0 -1
  45. package/storage/Converter.d.ts +0 -16
  46. package/storage/Converter.js +0 -49
  47. package/storage/Converter.js.map +0 -1
  48. package/storage/Storage.d.ts +0 -18
  49. package/storage/Storage.js +0 -81
  50. package/storage/Storage.js.map +0 -1
  51. package/storage/abstractions/AccessPattern.d.ts +0 -24
  52. package/storage/abstractions/AccessPattern.js +0 -0
  53. package/storage/abstractions/AccessPatternHandler.d.ts +0 -13
  54. package/storage/abstractions/AccessPatternHandler.js +0 -0
  55. package/storage/abstractions/Converter.d.ts +0 -6
  56. package/storage/abstractions/Converter.js +0 -0
  57. package/storage/accessPatterns/AppAccessPattern.d.ts +0 -9
  58. package/storage/accessPatterns/AppAccessPattern.js +0 -35
  59. package/storage/accessPatterns/AppAccessPattern.js.map +0 -1
  60. package/storage/accessPatterns/AppCreatedByAccessPattern.d.ts +0 -9
  61. package/storage/accessPatterns/AppCreatedByAccessPattern.js +0 -38
  62. package/storage/accessPatterns/AppCreatedByAccessPattern.js.map +0 -1
  63. package/storage/accessPatterns/AppEntityAccessPattern.d.ts +0 -9
  64. package/storage/accessPatterns/AppEntityAccessPattern.js +0 -35
  65. package/storage/accessPatterns/AppEntityAccessPattern.js.map +0 -1
  66. package/storage/accessPatterns/AppEntityActionAccessPattern.d.ts +0 -9
  67. package/storage/accessPatterns/AppEntityActionAccessPattern.js +0 -35
  68. package/storage/accessPatterns/AppEntityActionAccessPattern.js.map +0 -1
  69. package/storage/accessPatterns/AppEntityActionCreatedByAccessPattern.d.ts +0 -9
  70. package/storage/accessPatterns/AppEntityActionCreatedByAccessPattern.js +0 -38
  71. package/storage/accessPatterns/AppEntityActionCreatedByAccessPattern.js.map +0 -1
  72. package/storage/accessPatterns/AppEntityCreatedByAccessPattern.d.ts +0 -9
  73. package/storage/accessPatterns/AppEntityCreatedByAccessPattern.js +0 -38
  74. package/storage/accessPatterns/AppEntityCreatedByAccessPattern.js.map +0 -1
  75. package/storage/accessPatterns/BaseAccessPattern.d.ts +0 -32
  76. package/storage/accessPatterns/BaseAccessPattern.js +0 -60
  77. package/storage/accessPatterns/BaseAccessPattern.js.map +0 -1
  78. package/storage/accessPatterns/CreatedByAccessPattern.d.ts +0 -9
  79. package/storage/accessPatterns/CreatedByAccessPattern.js +0 -38
  80. package/storage/accessPatterns/CreatedByAccessPattern.js.map +0 -1
  81. package/storage/accessPatterns/CreatedOnAccessPattern.d.ts +0 -9
  82. package/storage/accessPatterns/CreatedOnAccessPattern.js +0 -38
  83. package/storage/accessPatterns/CreatedOnAccessPattern.js.map +0 -1
  84. package/storage/accessPatterns/DefaultAccessPattern.d.ts +0 -15
  85. package/storage/accessPatterns/DefaultAccessPattern.js +0 -35
  86. package/storage/accessPatterns/DefaultAccessPattern.js.map +0 -1
  87. package/storage/accessPatterns/EntityIdAccessPattern.d.ts +0 -9
  88. package/storage/accessPatterns/EntityIdAccessPattern.js +0 -38
  89. package/storage/accessPatterns/EntityIdAccessPattern.js.map +0 -1
  90. package/storage/accessPatterns/index.d.ts +0 -6
  91. package/storage/accessPatterns/index.js +0 -57
  92. package/storage/accessPatterns/index.js.map +0 -1
  93. package/storage/cursorSchema.d.ts +0 -4
  94. package/storage/cursorSchema.js +0 -22
  95. package/storage/cursorSchema.js.map +0 -1
  96. package/storage/entity.d.ts +0 -36
  97. package/storage/entity.js +0 -120
  98. package/storage/entity.js.map +0 -1
  99. package/storage/results/ListErrorResult.d.ts +0 -10
  100. package/storage/results/ListErrorResult.js +0 -12
  101. package/storage/results/ListErrorResult.js.map +0 -1
  102. package/storage/results/ListSuccessResult.d.ts +0 -14
  103. package/storage/results/ListSuccessResult.js +0 -17
  104. package/storage/results/ListSuccessResult.js.map +0 -1
  105. package/storage/results/index.d.ts +0 -2
  106. package/storage/results/index.js +0 -2
  107. package/storage/startKey.d.ts +0 -6
  108. package/storage/startKey.js +0 -8
  109. package/storage/startKey.js.map +0 -1
@@ -0,0 +1,8 @@
1
+ import { type Container } from "@webiny/feature/api";
2
+ export interface AuditLogsFeatureConfig {
3
+ deleteLogsAfterDays?: number;
4
+ }
5
+ export declare const AuditLogsFeature: {
6
+ name: string;
7
+ register(container: Container, context?: AuditLogsFeatureConfig | undefined): void;
8
+ };
@@ -0,0 +1,42 @@
1
+ import { createFeature } from "@webiny/feature/api";
2
+ import { GraphQLContextualSchema } from "@webiny/api-graphql";
3
+ import { makeExecutableSchema } from "@graphql-tools/schema";
4
+ import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
5
+ import { FeatureFlags } from "@webiny/api-core/features/featureFlags/abstractions.js";
6
+ import { AuditLogsContext, AuditLogsStorage } from "./abstractions.js";
7
+ import { createAuditLogsContextValue } from "./context/AuditLogsContextValue.js";
8
+ import { createSubscriptionHooks } from "./subscriptions/index.js";
9
+ import { AuditLogsGraphQLSchema } from "./graphql/AuditLogsGraphQLSchema.js";
10
+ const getDeleteLogsAfterDays = (days)=>days && days > 0 ? days : 60;
11
+ const AuditLogsFeature = createFeature({
12
+ name: "AuditLogs",
13
+ register (container, config = {}) {
14
+ if (!container.resolve(FeatureFlags).get().isEnabled("auditLogs")) return;
15
+ container.register(AuditLogsGraphQLSchema);
16
+ let initialized = false;
17
+ const STUB_SCHEMA = makeExecutableSchema({
18
+ typeDefs: "type Query\ntype Mutation",
19
+ assumeValidSDL: true
20
+ });
21
+ container.registerInstance(GraphQLContextualSchema, {
22
+ async build (ctx) {
23
+ if (initialized) return STUB_SCHEMA;
24
+ initialized = true;
25
+ const storage = container.resolve(AuditLogsStorage);
26
+ const eventPublisher = container.resolve(EventPublisher);
27
+ ctx.auditLogs = createAuditLogsContextValue({
28
+ getContext: ()=>ctx,
29
+ deleteLogsAfterDays: getDeleteLogsAfterDays(config.deleteLogsAfterDays),
30
+ storage,
31
+ eventPublisher
32
+ });
33
+ container.registerInstance(AuditLogsContext, ctx.auditLogs);
34
+ createSubscriptionHooks(ctx);
35
+ return STUB_SCHEMA;
36
+ }
37
+ });
38
+ }
39
+ });
40
+ export { AuditLogsFeature };
41
+
42
+ //# sourceMappingURL=AuditLogsFeature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuditLogsFeature.js","sources":["../src/AuditLogsFeature.ts"],"sourcesContent":["import { createFeature, type Container } from \"@webiny/feature/api\";\nimport { GraphQLContextualSchema } from \"@webiny/api-graphql\";\nimport { makeExecutableSchema } from \"@graphql-tools/schema\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { FeatureFlags } from \"@webiny/api-core/features/featureFlags/abstractions.js\";\nimport { AuditLogsContext, AuditLogsStorage } from \"./abstractions.js\";\nimport type { GraphQLSchema } from \"graphql\";\nimport { createAuditLogsContextValue } from \"./context/AuditLogsContextValue.js\";\nimport { createSubscriptionHooks } from \"./subscriptions/index.js\";\nimport { AuditLogsGraphQLSchema } from \"./graphql/AuditLogsGraphQLSchema.js\";\n\nexport interface AuditLogsFeatureConfig {\n deleteLogsAfterDays?: number;\n}\n\nconst getDeleteLogsAfterDays = (days?: number): number => {\n return days && days > 0 ? days : 60;\n};\n\nexport const AuditLogsFeature = createFeature({\n name: \"AuditLogs\",\n register(container: Container, config: AuditLogsFeatureConfig = {}) {\n // Audit logs are license-gated — check at register time (license is fresh pre-register) so\n // nothing wires up without the entitlement.\n if (!container.resolve(FeatureFlags).get().isEnabled(\"auditLogs\")) {\n return;\n }\n\n container.register(AuditLogsGraphQLSchema);\n\n let initialized = false;\n\n const STUB_SCHEMA: GraphQLSchema = makeExecutableSchema({\n typeDefs: \"type Query\\ntype Mutation\",\n assumeValidSDL: true\n });\n\n container.registerInstance(GraphQLContextualSchema, {\n async build(ctx: Record<string, any>): Promise<GraphQLSchema> {\n if (initialized) {\n return STUB_SCHEMA;\n }\n initialized = true;\n\n const storage = container.resolve(AuditLogsStorage);\n const eventPublisher = container.resolve(EventPublisher);\n\n ctx.auditLogs = createAuditLogsContextValue({\n getContext: () => ctx as any,\n deleteLogsAfterDays: getDeleteLogsAfterDays(config.deleteLogsAfterDays),\n storage,\n eventPublisher\n });\n\n container.registerInstance(AuditLogsContext, ctx.auditLogs);\n createSubscriptionHooks(ctx as any);\n\n return STUB_SCHEMA;\n }\n });\n }\n});\n"],"names":["getDeleteLogsAfterDays","days","AuditLogsFeature","createFeature","container","config","FeatureFlags","AuditLogsGraphQLSchema","initialized","STUB_SCHEMA","makeExecutableSchema","GraphQLContextualSchema","ctx","storage","AuditLogsStorage","eventPublisher","EventPublisher","createAuditLogsContextValue","AuditLogsContext","createSubscriptionHooks"],"mappings":";;;;;;;;;AAeA,MAAMA,yBAAyB,CAACC,OACrBA,QAAQA,OAAO,IAAIA,OAAO;AAG9B,MAAMC,mBAAmBC,cAAc;IAC1C,MAAM;IACN,UAASC,SAAoB,EAAEC,SAAiC,CAAC,CAAC;QAG9D,IAAI,CAACD,UAAU,OAAO,CAACE,cAAc,GAAG,GAAG,SAAS,CAAC,cACjD;QAGJF,UAAU,QAAQ,CAACG;QAEnB,IAAIC,cAAc;QAElB,MAAMC,cAA6BC,qBAAqB;YACpD,UAAU;YACV,gBAAgB;QACpB;QAEAN,UAAU,gBAAgB,CAACO,yBAAyB;YAChD,MAAM,OAAMC,GAAwB;gBAChC,IAAIJ,aACA,OAAOC;gBAEXD,cAAc;gBAEd,MAAMK,UAAUT,UAAU,OAAO,CAACU;gBAClC,MAAMC,iBAAiBX,UAAU,OAAO,CAACY;gBAEzCJ,IAAI,SAAS,GAAGK,4BAA4B;oBACxC,YAAY,IAAML;oBAClB,qBAAqBZ,uBAAuBK,OAAO,mBAAmB;oBACtEQ;oBACAE;gBACJ;gBAEAX,UAAU,gBAAgB,CAACc,kBAAkBN,IAAI,SAAS;gBAC1DO,wBAAwBP;gBAExB,OAAOH;YACX;QACJ;IACJ;AACJ"}
package/abstractions.d.ts CHANGED
@@ -1,5 +1,10 @@
1
- import type { AuditLogsContext as Context } from "./types.js";
2
- export declare const AuditLogsContext: import("@webiny/di").Abstraction<Context>;
1
+ import type { AuditLogsContext as IAuditLogsContext } from "./types.js";
2
+ import type { IStorage } from "./storage/abstractions/Storage.js";
3
+ export declare const AuditLogsContext: import("@webiny/di").Abstraction<IAuditLogsContext>;
3
4
  export declare namespace AuditLogsContext {
4
- type Interface = Context;
5
+ type Interface = IAuditLogsContext;
6
+ }
7
+ export declare const AuditLogsStorage: import("@webiny/di").Abstraction<IStorage>;
8
+ export declare namespace AuditLogsStorage {
9
+ type Interface = IStorage;
5
10
  }
package/abstractions.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { createAbstraction } from "@webiny/feature/api";
2
2
  const AuditLogsContext = createAbstraction("AuditLogsContext");
3
- export { AuditLogsContext };
3
+ const AuditLogsStorage = createAbstraction("AuditLogsStorage");
4
+ export { AuditLogsContext, AuditLogsStorage };
4
5
 
5
6
  //# sourceMappingURL=abstractions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"abstractions.js","sources":["../src/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { AuditLogsContext as Context } from \"~/types.js\";\n\n// TODO: this is a bridge for legacy context; needs review and refactor of code that uses it.\n\nexport const AuditLogsContext = createAbstraction<Context>(\"AuditLogsContext\");\n\nexport namespace AuditLogsContext {\n export type Interface = Context;\n}\n"],"names":["AuditLogsContext","createAbstraction"],"mappings":";AAKO,MAAMA,mBAAmBC,kBAA2B"}
1
+ {"version":3,"file":"abstractions.js","sources":["../src/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { AuditLogsContext as IAuditLogsContext } from \"~/types.js\";\nimport type { IStorage } from \"~/storage/abstractions/Storage.js\";\n\n// NOTE: this token is registered with (and used as) the full audit-logs request context —\n// handlers resolve it for `.container` and pass it to getAuditConfig. The interface must\n// therefore be the context, not the AuditLogsContextValue facade. The proper fix (drop the\n// whole-context injection in favour of an `AuditLogs` facade token + removing context.auditLogs)\n// is the context-removal migration, tracked separately.\nexport const AuditLogsContext = createAbstraction<IAuditLogsContext>(\"AuditLogsContext\");\n\nexport namespace AuditLogsContext {\n export type Interface = IAuditLogsContext;\n}\n\nexport const AuditLogsStorage = createAbstraction<IStorage>(\"AuditLogsStorage\");\n\nexport namespace AuditLogsStorage {\n export type Interface = IStorage;\n}\n"],"names":["AuditLogsContext","createAbstraction","AuditLogsStorage"],"mappings":";AASO,MAAMA,mBAAmBC,kBAAqC;AAM9D,MAAMC,mBAAmBD,kBAA4B"}
@@ -1,6 +1,8 @@
1
1
  import { convertExpiresAtDaysToDate } from "../utils/expiresAt.js";
2
2
  import { mdbid } from "@webiny/utils/mdbid.js";
3
3
  import { NotAuthorizedError } from "@webiny/api-core/features/security/shared/index.js";
4
+ import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/abstractions.js";
5
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
4
6
  import { AuditLogAfterCreateEvent, AuditLogAfterUpdateEvent, AuditLogBeforeCreateEvent, AuditLogBeforeUpdateEvent } from "../events/index.js";
5
7
  class AuditLogsContextValueImpl {
6
8
  constructor(params){
@@ -101,7 +103,7 @@ class AuditLogsContextValueImpl {
101
103
  }
102
104
  async checkPermissions(auditLog) {
103
105
  if (!auditLog.action) throw new Error("Audit log action is not defined. Cannot check permissions.");
104
- const permissions = await this.getContext().security.getPermissions("al.*");
106
+ const permissions = await this.getContext().container.resolve(IdentityContext).getPermissions("al.*");
105
107
  for (const permission of permissions){
106
108
  if ("*" === permission.name) return;
107
109
  if ("al.*" === permission.name) return;
@@ -112,10 +114,10 @@ class AuditLogsContextValueImpl {
112
114
  });
113
115
  }
114
116
  getTenantId() {
115
- return this.getContext().tenancy.getCurrentTenant().id;
117
+ return this.getContext().container.resolve(TenantContext).getTenant().id;
116
118
  }
117
119
  getIdentity() {
118
- const identity = this.getContext().security.getIdentity();
120
+ const identity = this.getContext().container.resolve(IdentityContext).getIdentity();
119
121
  return {
120
122
  id: identity.id,
121
123
  type: identity.type,
@@ -1 +1 @@
1
- {"version":3,"file":"context/AuditLogsContextValue.js","sources":["../../src/context/AuditLogsContextValue.ts"],"sourcesContent":["import type {\n AuditLogPayload,\n AuditLogsContext,\n AuditLogsContextValue,\n IListAuditLogsParams,\n IListAuditLogsResult\n} from \"~/types.js\";\nimport { convertExpiresAtDaysToDate } from \"~/utils/expiresAt.js\";\nimport type { IAuditLog, IAuditLogCreatedBy } from \"~/storage/types.js\";\nimport { mdbid } from \"@webiny/utils/mdbid.js\";\nimport type { IStorage, IStorageListParams } from \"~/storage/abstractions/Storage.js\";\nimport { NotAuthorizedError } from \"@webiny/api-core/features/security/shared/index.js\";\nimport type { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport {\n AuditLogBeforeCreateEvent,\n AuditLogAfterCreateEvent,\n AuditLogBeforeUpdateEvent,\n AuditLogAfterUpdateEvent\n} from \"~/events/index.js\";\n\nexport interface IAuditLogsContextValueParams {\n getContext: () => AuditLogsContext;\n deleteLogsAfterDays: number;\n storage: IStorage;\n eventPublisher: EventPublisher.Interface;\n}\n\nclass AuditLogsContextValueImpl implements AuditLogsContextValue {\n private readonly getContext;\n public readonly deleteLogsAfterDays;\n private readonly storage: IStorage;\n private readonly eventPublisher: EventPublisher.Interface;\n\n public constructor(params: IAuditLogsContextValueParams) {\n this.getContext = params.getContext;\n this.deleteLogsAfterDays = params.deleteLogsAfterDays;\n this.storage = params.storage;\n this.eventPublisher = params.eventPublisher;\n }\n\n public async createAuditLog(payload: AuditLogPayload): Promise<IAuditLog> {\n const context = this.getContext();\n const expiresAt = convertExpiresAtDaysToDate(this.deleteLogsAfterDays);\n\n const auditLog: IAuditLog = {\n id: mdbid(),\n tenant: this.getTenantId(),\n createdBy: this.getIdentity(),\n createdOn: new Date(),\n ...payload,\n content: JSON.stringify(payload.content),\n expiresAt\n };\n await this.checkPermissions(auditLog);\n\n const beforeCreateEvent = new AuditLogBeforeCreateEvent({\n auditLog: auditLog,\n context,\n setAuditLog(input) {\n Object.assign(auditLog, input);\n }\n });\n await this.eventPublisher.publish(beforeCreateEvent);\n\n const result = await this.storage.store({\n data: auditLog\n });\n if (result.success) {\n const afterCreateEvent = new AuditLogAfterCreateEvent({\n auditLog: auditLog,\n context\n });\n await this.eventPublisher.publish(afterCreateEvent);\n return result.data;\n }\n throw result.error;\n }\n\n public async updateAuditLog(\n original: IAuditLog,\n payload: Partial<AuditLogPayload>\n ): Promise<IAuditLog> {\n const context = this.getContext();\n const auditLog: IAuditLog = {\n ...original,\n ...payload,\n content: payload.content ? JSON.stringify(payload.content) : original.content\n };\n await this.checkPermissions(auditLog);\n\n const beforeUpdateEvent = new AuditLogBeforeUpdateEvent({\n original,\n auditLog,\n context,\n setAuditLog(input) {\n Object.assign(auditLog, input);\n }\n });\n await this.eventPublisher.publish(beforeUpdateEvent);\n\n const result = await this.storage.store({\n data: auditLog\n });\n if (result.success) {\n const afterUpdateEvent = new AuditLogAfterUpdateEvent({\n original: original,\n auditLog: auditLog,\n context\n });\n await this.eventPublisher.publish(afterUpdateEvent);\n return result.data;\n }\n throw result.error;\n }\n\n public async getAuditLog(id: string): Promise<IAuditLog | null> {\n const result = await this.storage.fetch({\n id,\n tenant: this.getTenantId()\n });\n if (result.success) {\n await this.checkPermissions(result.data);\n return result.data;\n }\n throw result.error;\n }\n\n public async listAuditLogs(params: IListAuditLogsParams): Promise<IListAuditLogsResult> {\n const result = await this.storage.list({\n ...params,\n tenant: this.getTenantId()\n } as unknown as IStorageListParams);\n if (result.success) {\n return {\n items: result.data,\n meta: {\n cursor: result.meta.after || null,\n hasMoreItems: result.meta.hasMoreItems\n }\n };\n }\n throw result.error;\n }\n\n private async checkPermissions(auditLog: Pick<IAuditLog, \"action\">): Promise<void> {\n if (!auditLog.action) {\n throw new Error(\"Audit log action is not defined. Cannot check permissions.\");\n }\n const permissions = await this.getContext().security.getPermissions(\"al.*\");\n for (const permission of permissions) {\n if (permission.name === \"*\") {\n return;\n }\n if (permission.name === \"al.*\") {\n return;\n } else if (permission.name === `al.${auditLog.action}`) {\n return;\n }\n }\n\n throw new NotAuthorizedError({\n message: \"You cannot access audit logs.\"\n });\n }\n\n private getTenantId(): string {\n return this.getContext().tenancy.getCurrentTenant().id;\n }\n\n private getIdentity(): IAuditLogCreatedBy {\n const identity = this.getContext().security.getIdentity();\n return {\n id: identity.id,\n type: identity.type,\n displayName: identity.displayName || \"unknown\"\n };\n }\n}\n\nexport const createAuditLogsContextValue = (\n params: IAuditLogsContextValueParams\n): AuditLogsContextValue => {\n return new AuditLogsContextValueImpl(params);\n};\n"],"names":["AuditLogsContextValueImpl","params","payload","context","expiresAt","convertExpiresAtDaysToDate","auditLog","mdbid","Date","JSON","beforeCreateEvent","AuditLogBeforeCreateEvent","input","Object","result","afterCreateEvent","AuditLogAfterCreateEvent","original","beforeUpdateEvent","AuditLogBeforeUpdateEvent","afterUpdateEvent","AuditLogAfterUpdateEvent","id","Error","permissions","permission","NotAuthorizedError","identity","createAuditLogsContextValue"],"mappings":"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"}
1
+ {"version":3,"file":"context/AuditLogsContextValue.js","sources":["../../src/context/AuditLogsContextValue.ts"],"sourcesContent":["import type {\n AuditLogPayload,\n AuditLogsContext,\n AuditLogsContextValue,\n IListAuditLogsParams,\n IListAuditLogsResult\n} from \"~/types.js\";\nimport { convertExpiresAtDaysToDate } from \"~/utils/expiresAt.js\";\nimport type { IAuditLog, IAuditLogCreatedBy } from \"~/storage/types.js\";\nimport { mdbid } from \"@webiny/utils/mdbid.js\";\nimport type { IStorage, IStorageListParams } from \"~/storage/abstractions/Storage.js\";\nimport { NotAuthorizedError } from \"@webiny/api-core/features/security/shared/index.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport type { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport {\n AuditLogBeforeCreateEvent,\n AuditLogAfterCreateEvent,\n AuditLogBeforeUpdateEvent,\n AuditLogAfterUpdateEvent\n} from \"~/events/index.js\";\n\nexport interface IAuditLogsContextValueParams {\n getContext: () => AuditLogsContext;\n deleteLogsAfterDays: number;\n storage: IStorage;\n eventPublisher: EventPublisher.Interface;\n}\n\nclass AuditLogsContextValueImpl implements AuditLogsContextValue {\n private readonly getContext;\n public readonly deleteLogsAfterDays;\n private readonly storage: IStorage;\n private readonly eventPublisher: EventPublisher.Interface;\n\n public constructor(params: IAuditLogsContextValueParams) {\n this.getContext = params.getContext;\n this.deleteLogsAfterDays = params.deleteLogsAfterDays;\n this.storage = params.storage;\n this.eventPublisher = params.eventPublisher;\n }\n\n public async createAuditLog(payload: AuditLogPayload): Promise<IAuditLog> {\n const context = this.getContext();\n const expiresAt = convertExpiresAtDaysToDate(this.deleteLogsAfterDays);\n\n const auditLog: IAuditLog = {\n id: mdbid(),\n tenant: this.getTenantId(),\n createdBy: this.getIdentity(),\n createdOn: new Date(),\n ...payload,\n content: JSON.stringify(payload.content),\n expiresAt\n };\n await this.checkPermissions(auditLog);\n\n const beforeCreateEvent = new AuditLogBeforeCreateEvent({\n auditLog: auditLog,\n context,\n setAuditLog(input) {\n Object.assign(auditLog, input);\n }\n });\n await this.eventPublisher.publish(beforeCreateEvent);\n\n const result = await this.storage.store({\n data: auditLog\n });\n if (result.success) {\n const afterCreateEvent = new AuditLogAfterCreateEvent({\n auditLog: auditLog,\n context\n });\n await this.eventPublisher.publish(afterCreateEvent);\n return result.data;\n }\n throw result.error;\n }\n\n public async updateAuditLog(\n original: IAuditLog,\n payload: Partial<AuditLogPayload>\n ): Promise<IAuditLog> {\n const context = this.getContext();\n const auditLog: IAuditLog = {\n ...original,\n ...payload,\n content: payload.content ? JSON.stringify(payload.content) : original.content\n };\n await this.checkPermissions(auditLog);\n\n const beforeUpdateEvent = new AuditLogBeforeUpdateEvent({\n original,\n auditLog,\n context,\n setAuditLog(input) {\n Object.assign(auditLog, input);\n }\n });\n await this.eventPublisher.publish(beforeUpdateEvent);\n\n const result = await this.storage.store({\n data: auditLog\n });\n if (result.success) {\n const afterUpdateEvent = new AuditLogAfterUpdateEvent({\n original: original,\n auditLog: auditLog,\n context\n });\n await this.eventPublisher.publish(afterUpdateEvent);\n return result.data;\n }\n throw result.error;\n }\n\n public async getAuditLog(id: string): Promise<IAuditLog | null> {\n const result = await this.storage.fetch({\n id,\n tenant: this.getTenantId()\n });\n if (result.success) {\n await this.checkPermissions(result.data);\n return result.data;\n }\n throw result.error;\n }\n\n public async listAuditLogs(params: IListAuditLogsParams): Promise<IListAuditLogsResult> {\n const result = await this.storage.list({\n ...params,\n tenant: this.getTenantId()\n } as unknown as IStorageListParams);\n if (result.success) {\n return {\n items: result.data,\n meta: {\n cursor: result.meta.after || null,\n hasMoreItems: result.meta.hasMoreItems\n }\n };\n }\n throw result.error;\n }\n\n private async checkPermissions(auditLog: Pick<IAuditLog, \"action\">): Promise<void> {\n if (!auditLog.action) {\n throw new Error(\"Audit log action is not defined. Cannot check permissions.\");\n }\n const permissions = await this.getContext()\n .container.resolve(IdentityContext)\n .getPermissions(\"al.*\");\n for (const permission of permissions) {\n if (permission.name === \"*\") {\n return;\n }\n if (permission.name === \"al.*\") {\n return;\n } else if (permission.name === `al.${auditLog.action}`) {\n return;\n }\n }\n\n throw new NotAuthorizedError({\n message: \"You cannot access audit logs.\"\n });\n }\n\n private getTenantId(): string {\n return this.getContext().container.resolve(TenantContext).getTenant().id;\n }\n\n private getIdentity(): IAuditLogCreatedBy {\n const identity = this.getContext().container.resolve(IdentityContext).getIdentity();\n return {\n id: identity.id,\n type: identity.type,\n displayName: identity.displayName || \"unknown\"\n };\n }\n}\n\nexport const createAuditLogsContextValue = (\n params: IAuditLogsContextValueParams\n): AuditLogsContextValue => {\n return new AuditLogsContextValueImpl(params);\n};\n"],"names":["AuditLogsContextValueImpl","params","payload","context","expiresAt","convertExpiresAtDaysToDate","auditLog","mdbid","Date","JSON","beforeCreateEvent","AuditLogBeforeCreateEvent","input","Object","result","afterCreateEvent","AuditLogAfterCreateEvent","original","beforeUpdateEvent","AuditLogBeforeUpdateEvent","afterUpdateEvent","AuditLogAfterUpdateEvent","id","Error","permissions","IdentityContext","permission","NotAuthorizedError","TenantContext","identity","createAuditLogsContextValue"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { CoreGraphQLSchemaFactory } from "@webiny/api-graphql/graphql/abstractions.js";
2
+ import { GraphQLSchemaBuilder } from "@webiny/api-graphql/features/GraphQLSchemaBuilder/abstractions.js";
3
+ declare class AuditLogsGraphQLSchemaImpl implements CoreGraphQLSchemaFactory.Interface {
4
+ execute(builder: GraphQLSchemaBuilder.Interface): CoreGraphQLSchemaFactory.Return;
5
+ }
6
+ export declare const AuditLogsGraphQLSchema: typeof AuditLogsGraphQLSchemaImpl & {
7
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-graphql/graphql/abstractions.core.js").ICoreGraphQLSchemaFactory>;
8
+ };
9
+ export {};
@@ -0,0 +1,134 @@
1
+ import { NotFoundError, resolve, resolveList } from "@webiny/api-graphql";
2
+ import { CoreGraphQLSchemaFactory } from "@webiny/api-graphql/graphql/abstractions.js";
3
+ import { createZodError } from "@webiny/utils";
4
+ import { AuditLogsContext } from "../abstractions.js";
5
+ import { getValidationSchema, listValidationSchema } from "./validation.js";
6
+ const TYPE_DEFS = `
7
+ type AuditLogCreatedBy {
8
+ id: ID!
9
+ displayName: String
10
+ type: String
11
+ }
12
+ type AuditLog {
13
+ id: ID!
14
+ createdBy: AuditLogCreatedBy!
15
+ createdOn: DateTime!
16
+ app: String!
17
+ action: String!
18
+ message: String!
19
+ entity: String!
20
+ entityId: String!
21
+ tags: [String!]!
22
+ expiresAt: DateTime!
23
+ content: String
24
+ }
25
+
26
+ type AuditLogListMeta {
27
+ cursor: String
28
+ hasMoreItems: Boolean!
29
+ }
30
+
31
+ type AuditLogError {
32
+ code: String
33
+ message: String!
34
+ data: JSON
35
+ stack: String
36
+ }
37
+
38
+ type AuditLogListResponse {
39
+ data: [AuditLog!]
40
+ meta: AuditLogListMeta
41
+ error: AuditLogError
42
+ }
43
+
44
+ type AuditLogGetResponse {
45
+ data: AuditLog
46
+ error: AuditLogError
47
+ }
48
+
49
+ enum AuditLogsSort {
50
+ ASC
51
+ DESC
52
+ }
53
+
54
+ input ListAuditLogsWhere {
55
+ app: String
56
+ action: String
57
+ createdBy: String
58
+ entity: String
59
+ entityId: String
60
+ createdOn_gte: DateTime
61
+ createdOn_lte: DateTime
62
+ }
63
+
64
+ type AuditLogsQuery {
65
+ getAuditLog(id: ID!): AuditLogGetResponse
66
+ listAuditLogs(
67
+ where: ListAuditLogsWhere
68
+ sort: AuditLogsSort
69
+ limit: Number
70
+ after: String
71
+ ): AuditLogListResponse!
72
+ }
73
+
74
+ extend type Query {
75
+ auditLogs: AuditLogsQuery
76
+ }
77
+ `;
78
+ class AuditLogsGraphQLSchemaImpl {
79
+ async execute(builder) {
80
+ builder.addTypeDefs(TYPE_DEFS);
81
+ builder.addResolver({
82
+ path: "Query.auditLogs",
83
+ dependencies: [],
84
+ resolver: ()=>()=>({})
85
+ });
86
+ builder.addResolver({
87
+ path: "AuditLogsQuery.getAuditLog",
88
+ dependencies: [
89
+ AuditLogsContext
90
+ ],
91
+ resolver (auditLogs) {
92
+ return async ({ args })=>resolve(async ()=>{
93
+ const validation = await getValidationSchema.safeParseAsync(args);
94
+ if (!validation.success) throw createZodError(validation.error);
95
+ const result = await auditLogs.getAuditLog(validation.data.id);
96
+ if (!result) throw new NotFoundError(`Audit log with id "${validation.data.id}" not found.`);
97
+ return result;
98
+ });
99
+ }
100
+ });
101
+ builder.addResolver({
102
+ path: "AuditLogsQuery.listAuditLogs",
103
+ dependencies: [
104
+ AuditLogsContext
105
+ ],
106
+ resolver (auditLogs) {
107
+ return async ({ args })=>resolveList(async ()=>{
108
+ const validation = await listValidationSchema.safeParseAsync(args);
109
+ if (!validation.success) throw createZodError(validation.error);
110
+ const result = await auditLogs.listAuditLogs({
111
+ ...validation.data,
112
+ ...validation.data.where
113
+ });
114
+ if (result.error) throw result.error;
115
+ return {
116
+ items: result.items,
117
+ meta: {
118
+ ...result.meta,
119
+ totalCount: 0
120
+ }
121
+ };
122
+ });
123
+ }
124
+ });
125
+ return builder;
126
+ }
127
+ }
128
+ const AuditLogsGraphQLSchema = CoreGraphQLSchemaFactory.createImplementation({
129
+ implementation: AuditLogsGraphQLSchemaImpl,
130
+ dependencies: []
131
+ });
132
+ export { AuditLogsGraphQLSchema };
133
+
134
+ //# sourceMappingURL=AuditLogsGraphQLSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql/AuditLogsGraphQLSchema.js","sources":["../../src/graphql/AuditLogsGraphQLSchema.ts"],"sourcesContent":["import { NotFoundError, resolve, resolveList } from \"@webiny/api-graphql\";\nimport { CoreGraphQLSchemaFactory } from \"@webiny/api-graphql/graphql/abstractions.js\";\nimport { GraphQLSchemaBuilder } from \"@webiny/api-graphql/features/GraphQLSchemaBuilder/abstractions.js\";\nimport { createZodError } from \"@webiny/utils\";\nimport { AuditLogsContext } from \"~/abstractions.js\";\nimport type { AuditLogsContextValue } from \"~/types.js\";\nimport { getValidationSchema, listValidationSchema } from \"./validation.js\";\n\ninterface IListAuditLogsWhere {\n app?: string;\n action?: string;\n createdBy?: string;\n entity?: string;\n entityId?: string;\n createdOn_gte?: Date;\n createdOn_lte?: Date;\n}\n\ninterface IListAuditLogsArgs {\n where?: IListAuditLogsWhere;\n sort?: \"ASC\" | \"DESC\";\n limit?: number;\n after?: string;\n}\n\nconst TYPE_DEFS = /* GraphQL */ `\n type AuditLogCreatedBy {\n id: ID!\n displayName: String\n type: String\n }\n type AuditLog {\n id: ID!\n createdBy: AuditLogCreatedBy!\n createdOn: DateTime!\n app: String!\n action: String!\n message: String!\n entity: String!\n entityId: String!\n tags: [String!]!\n expiresAt: DateTime!\n content: String\n }\n\n type AuditLogListMeta {\n cursor: String\n hasMoreItems: Boolean!\n }\n\n type AuditLogError {\n code: String\n message: String!\n data: JSON\n stack: String\n }\n\n type AuditLogListResponse {\n data: [AuditLog!]\n meta: AuditLogListMeta\n error: AuditLogError\n }\n\n type AuditLogGetResponse {\n data: AuditLog\n error: AuditLogError\n }\n\n enum AuditLogsSort {\n ASC\n DESC\n }\n\n input ListAuditLogsWhere {\n app: String\n action: String\n createdBy: String\n entity: String\n entityId: String\n createdOn_gte: DateTime\n createdOn_lte: DateTime\n }\n\n type AuditLogsQuery {\n getAuditLog(id: ID!): AuditLogGetResponse\n listAuditLogs(\n where: ListAuditLogsWhere\n sort: AuditLogsSort\n limit: Number\n after: String\n ): AuditLogListResponse!\n }\n\n extend type Query {\n auditLogs: AuditLogsQuery\n }\n`;\n\nclass AuditLogsGraphQLSchemaImpl implements CoreGraphQLSchemaFactory.Interface {\n public async execute(builder: GraphQLSchemaBuilder.Interface): CoreGraphQLSchemaFactory.Return {\n builder.addTypeDefs(TYPE_DEFS);\n\n builder.addResolver({\n path: \"Query.auditLogs\",\n dependencies: [],\n resolver: () => () => ({})\n });\n\n builder.addResolver<{ id: string }>({\n path: \"AuditLogsQuery.getAuditLog\",\n dependencies: [AuditLogsContext],\n resolver(auditLogs: AuditLogsContextValue) {\n return async ({ args }) => {\n return resolve(async () => {\n const validation = await getValidationSchema.safeParseAsync(args);\n\n if (!validation.success) {\n throw createZodError(validation.error);\n }\n\n const result = await auditLogs.getAuditLog(validation.data.id);\n if (!result) {\n throw new NotFoundError(\n `Audit log with id \"${validation.data.id}\" not found.`\n );\n }\n return result;\n });\n };\n }\n });\n\n builder.addResolver<IListAuditLogsArgs>({\n path: \"AuditLogsQuery.listAuditLogs\",\n dependencies: [AuditLogsContext],\n resolver(auditLogs: AuditLogsContextValue) {\n return async ({ args }) => {\n return resolveList(async () => {\n const validation = await listValidationSchema.safeParseAsync(args);\n if (!validation.success) {\n throw createZodError(validation.error);\n }\n const result = await auditLogs.listAuditLogs({\n ...validation.data,\n ...validation.data.where\n });\n if (result.error) {\n throw result.error;\n }\n return {\n items: result.items,\n meta: {\n ...result.meta,\n totalCount: 0\n }\n };\n });\n };\n }\n });\n\n return builder;\n }\n}\n\nexport const AuditLogsGraphQLSchema = CoreGraphQLSchemaFactory.createImplementation({\n implementation: AuditLogsGraphQLSchemaImpl,\n dependencies: []\n});\n"],"names":["TYPE_DEFS","AuditLogsGraphQLSchemaImpl","builder","AuditLogsContext","auditLogs","args","resolve","validation","getValidationSchema","createZodError","result","NotFoundError","resolveList","listValidationSchema","AuditLogsGraphQLSchema","CoreGraphQLSchemaFactory"],"mappings":";;;;;AAyBA,MAAMA,YAA0B,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuEjC,CAAC;AAED,MAAMC;IACF,MAAa,QAAQC,OAAuC,EAAmC;QAC3FA,QAAQ,WAAW,CAACF;QAEpBE,QAAQ,WAAW,CAAC;YAChB,MAAM;YACN,cAAc,EAAE;YAChB,UAAU,IAAM,IAAO,EAAC;QAC5B;QAEAA,QAAQ,WAAW,CAAiB;YAChC,MAAM;YACN,cAAc;gBAACC;aAAiB;YAChC,UAASC,SAAgC;gBACrC,OAAO,OAAO,EAAEC,IAAI,EAAE,GACXC,QAAQ;wBACX,MAAMC,aAAa,MAAMC,oBAAoB,cAAc,CAACH;wBAE5D,IAAI,CAACE,WAAW,OAAO,EACnB,MAAME,eAAeF,WAAW,KAAK;wBAGzC,MAAMG,SAAS,MAAMN,UAAU,WAAW,CAACG,WAAW,IAAI,CAAC,EAAE;wBAC7D,IAAI,CAACG,QACD,MAAM,IAAIC,cACN,CAAC,mBAAmB,EAAEJ,WAAW,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC;wBAG9D,OAAOG;oBACX;YAER;QACJ;QAEAR,QAAQ,WAAW,CAAqB;YACpC,MAAM;YACN,cAAc;gBAACC;aAAiB;YAChC,UAASC,SAAgC;gBACrC,OAAO,OAAO,EAAEC,IAAI,EAAE,GACXO,YAAY;wBACf,MAAML,aAAa,MAAMM,qBAAqB,cAAc,CAACR;wBAC7D,IAAI,CAACE,WAAW,OAAO,EACnB,MAAME,eAAeF,WAAW,KAAK;wBAEzC,MAAMG,SAAS,MAAMN,UAAU,aAAa,CAAC;4BACzC,GAAGG,WAAW,IAAI;4BAClB,GAAGA,WAAW,IAAI,CAAC,KAAK;wBAC5B;wBACA,IAAIG,OAAO,KAAK,EACZ,MAAMA,OAAO,KAAK;wBAEtB,OAAO;4BACH,OAAOA,OAAO,KAAK;4BACnB,MAAM;gCACF,GAAGA,OAAO,IAAI;gCACd,YAAY;4BAChB;wBACJ;oBACJ;YAER;QACJ;QAEA,OAAOR;IACX;AACJ;AAEO,MAAMY,yBAAyBC,yBAAyB,oBAAoB,CAAC;IAChF,gBAAgBd;IAChB,cAAc,EAAE;AACpB"}
package/index.d.ts CHANGED
@@ -1,9 +1,3 @@
1
- import { ContextPlugin } from "@webiny/api";
2
- import type { DynamoDBDocument } from "@webiny/aws-sdk/client-dynamodb/index.js";
3
- export interface ICreateAuditLogsParams {
4
- deleteLogsAfterDays: number | undefined;
5
- tableName?: string;
6
- documentClient?: DynamoDBDocument;
7
- }
8
- export declare const createAuditLogs: (params?: ICreateAuditLogsParams) => (ContextPlugin<import("./types.js").AuditLogsContext> | import("@webiny/handler-graphql/index.js").GraphQLSchemaPlugin<import("./types.js").AuditLogsContext>)[];
9
1
  export * from "./config.js";
2
+ export { AuditLogsFeature } from "./AuditLogsFeature.js";
3
+ export type { AuditLogsFeatureConfig } from "./AuditLogsFeature.js";
package/index.js CHANGED
@@ -1,26 +1,2 @@
1
- import { ContextPlugin } from "@webiny/api";
2
- import { createSubscriptionHooks } from "./subscriptions/index.js";
3
- import { createAuditLogsContext } from "./context/index.js";
4
- import { createGraphQLSchema } from "./graphql/schema.js";
5
- import { AuditLogsContext } from "./abstractions.js";
6
1
  export * from "./config.js";
7
- const createAuditLogs = (params)=>{
8
- const subscriptionsPlugin = new ContextPlugin((context)=>{
9
- if (!context.wcp.canUseFeature("auditLogs")) return;
10
- context.container.registerInstance(AuditLogsContext, context);
11
- createSubscriptionHooks(context);
12
- });
13
- subscriptionsPlugin.name = "auditLogs.context.subscriptions";
14
- return [
15
- subscriptionsPlugin,
16
- createGraphQLSchema(),
17
- createAuditLogsContext({
18
- tableName: params?.tableName,
19
- deleteLogsAfterDays: params?.deleteLogsAfterDays,
20
- documentClient: params?.documentClient
21
- })
22
- ];
23
- };
24
- export { createAuditLogs };
25
-
26
- //# sourceMappingURL=index.js.map
2
+ export { AuditLogsFeature } from "./AuditLogsFeature.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/api-audit-logs",
3
- "version": "6.4.11",
3
+ "version": "6.6.0-alpha.1",
4
4
  "exports": {
5
5
  ".": "./index.js",
6
6
  "./*": "./*"
@@ -22,32 +22,32 @@
22
22
  "access": "public"
23
23
  },
24
24
  "devDependencies": {
25
- "@webiny/handler-aws": "6.4.11",
26
- "@webiny/plugins": "6.4.11",
27
- "@webiny/project-utils": "6.4.11",
25
+ "@webiny/api-headless-cms-testing": "6.6.0-alpha.1",
26
+ "@webiny/db-dynamodb": "6.6.0-alpha.1",
27
+ "@webiny/di": "1.1.0",
28
+ "@webiny/event-handler-core": "6.6.0-alpha.1",
29
+ "@webiny/handler": "6.6.0-alpha.1",
30
+ "@webiny/plugins": "6.6.0-alpha.1",
28
31
  "graphql": "16.14.2",
29
- "typescript": "6.0.3",
30
- "vitest": "4.1.10"
32
+ "typescript": "7.0.2",
33
+ "vitest": "4.1.11"
31
34
  },
32
35
  "dependencies": {
33
- "@webiny/api": "6.4.11",
34
- "@webiny/api-aco": "6.4.11",
35
- "@webiny/api-core": "6.4.11",
36
- "@webiny/api-file-manager": "6.4.11",
37
- "@webiny/api-headless-cms": "6.4.11",
38
- "@webiny/api-mailer": "6.4.11",
39
- "@webiny/api-website-builder": "6.4.11",
40
- "@webiny/aws-sdk": "6.4.11",
41
- "@webiny/build-tools": "6.4.11",
42
- "@webiny/common-audit-logs": "6.4.11",
43
- "@webiny/db-dynamodb": "6.4.11",
44
- "@webiny/error": "6.4.11",
45
- "@webiny/feature": "6.4.11",
46
- "@webiny/handler": "6.4.11",
47
- "@webiny/handler-db": "6.4.11",
48
- "@webiny/handler-graphql": "6.4.11",
49
- "@webiny/utils": "6.4.11",
50
- "@webiny/wcp": "6.4.11",
36
+ "@graphql-tools/schema": "10.1.0",
37
+ "@webiny/api": "6.6.0-alpha.1",
38
+ "@webiny/api-aco": "6.6.0-alpha.1",
39
+ "@webiny/api-core": "6.6.0-alpha.1",
40
+ "@webiny/api-file-manager": "6.6.0-alpha.1",
41
+ "@webiny/api-graphql": "6.6.0-alpha.1",
42
+ "@webiny/api-headless-cms": "6.6.0-alpha.1",
43
+ "@webiny/api-mailer": "6.6.0-alpha.1",
44
+ "@webiny/api-website-builder": "6.6.0-alpha.1",
45
+ "@webiny/build-tools": "6.6.0-alpha.1",
46
+ "@webiny/common-audit-logs": "6.6.0-alpha.1",
47
+ "@webiny/error": "6.6.0-alpha.1",
48
+ "@webiny/feature": "6.6.0-alpha.1",
49
+ "@webiny/utils": "6.6.0-alpha.1",
50
+ "@webiny/wcp": "6.6.0-alpha.1",
51
51
  "zod": "4.4.3"
52
52
  },
53
53
  "webiny": {
@@ -17,38 +17,3 @@ export interface IAuditLog {
17
17
  expiresAt: Date;
18
18
  content: string;
19
19
  }
20
- export interface IStorageAuditLog extends Omit<IAuditLog, "createdOn" | "content" | "expiresAt"> {
21
- expiresAt: string;
22
- createdOn: string;
23
- content: string;
24
- }
25
- export interface IStorageItem {
26
- PK: string;
27
- SK: string;
28
- TYPE: string;
29
- GSI_TENANT: string;
30
- GSI1_PK: string;
31
- GSI1_SK: number;
32
- GSI2_PK: string;
33
- GSI2_SK: number;
34
- GSI3_PK: string;
35
- GSI3_SK: number;
36
- GSI4_PK: string;
37
- GSI4_SK: number;
38
- GSI5_PK: string;
39
- GSI5_SK: number;
40
- GSI6_PK: string;
41
- GSI6_SK: number;
42
- GSI7_PK: string;
43
- GSI7_SK: number;
44
- GSI8_PK: string;
45
- GSI8_SK: number;
46
- GSI9_PK: string;
47
- GSI9_SK: number;
48
- data: IStorageAuditLog;
49
- expiresAt: number;
50
- }
51
- export interface IIndexStorageItem {
52
- PK: string;
53
- SK: string;
54
- }
@@ -10,18 +10,15 @@ class AuditLogFolderAfterDeleteHandlerImpl {
10
10
  async handle(event) {
11
11
  try {
12
12
  const { folder } = event.payload;
13
- if ("FmFile" === folder.type) {
13
+ if ("PbPage" === folder.type) {
14
+ const createAuditLog = getAuditConfig(AUDIT.PAGE_BUILDER.PAGE_FOLDER.DELETE);
15
+ await createAuditLog("Folder deleted", folder, folder.id, this.context);
16
+ } else if ("FmFile" === folder.type) {
14
17
  const createAuditLog = getAuditConfig(AUDIT.FILE_MANAGER.FILE_FOLDER.DELETE);
15
18
  await createAuditLog("Folder deleted", folder, folder.id, this.context);
16
19
  } else if (folder.type.startsWith("cms:")) {
17
20
  const createAuditLog = getAuditConfig(AUDIT.HEADLESS_CMS.MODEL_FOLDER.DELETE);
18
21
  await createAuditLog("Folder deleted", folder, folder.id, this.context);
19
- } else if ("wb:page" === folder.type) {
20
- const createAuditLog = getAuditConfig(AUDIT.WEBSITE_BUILDER.PAGE_FOLDER.DELETE);
21
- await createAuditLog("Folder deleted", folder, folder.id, this.context);
22
- } else if ("wb:redirect" === folder.type) {
23
- const createAuditLog = getAuditConfig(AUDIT.WEBSITE_BUILDER.REDIRECT_FOLDER.DELETE);
24
- await createAuditLog("Folder deleted", folder, folder.id, this.context);
25
22
  }
26
23
  } catch (error) {
27
24
  throw _webiny_error.from(error, {
@@ -1 +1 @@
1
- {"version":3,"file":"subscriptions/aco/handlers/AuditLogFolderAfterDeleteHandler.js","sources":["../../../../src/subscriptions/aco/handlers/AuditLogFolderAfterDeleteHandler.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport { FolderAfterDeleteEventHandler } from \"@webiny/api-aco/features/folder/DeleteFolder/index.js\";\nimport { AuditLogsContext } from \"~/abstractions.js\";\nimport { AUDIT } from \"~/config.js\";\nimport { getAuditConfig } from \"~/utils/getAuditConfig.js\";\n\nclass AuditLogFolderAfterDeleteHandlerImpl implements FolderAfterDeleteEventHandler.Interface {\n constructor(private context: AuditLogsContext.Interface) {}\n\n async handle(event: FolderAfterDeleteEventHandler.Event): Promise<void> {\n try {\n const { folder } = event.payload;\n if (folder.type === \"FmFile\") {\n const createAuditLog = getAuditConfig(AUDIT.FILE_MANAGER.FILE_FOLDER.DELETE);\n await createAuditLog(\"Folder deleted\", folder, folder.id, this.context);\n } else if (folder.type.startsWith(\"cms:\")) {\n const createAuditLog = getAuditConfig(AUDIT.HEADLESS_CMS.MODEL_FOLDER.DELETE);\n await createAuditLog(\"Folder deleted\", folder, folder.id, this.context);\n } else if (folder.type === \"wb:page\") {\n const createAuditLog = getAuditConfig(AUDIT.WEBSITE_BUILDER.PAGE_FOLDER.DELETE);\n await createAuditLog(\"Folder deleted\", folder, folder.id, this.context);\n } else if (folder.type === \"wb:redirect\") {\n const createAuditLog = getAuditConfig(AUDIT.WEBSITE_BUILDER.REDIRECT_FOLDER.DELETE);\n await createAuditLog(\"Folder deleted\", folder, folder.id, this.context);\n }\n } catch (error) {\n throw WebinyError.from(error, {\n message: \"Error while executing AuditLogFolderAfterDeleteHandler\",\n code: \"AUDIT_LOGS_AFTER_FOLDER_DELETE_HANDLER\"\n });\n }\n }\n}\n\nexport const AuditLogFolderAfterDeleteHandler = FolderAfterDeleteEventHandler.createImplementation({\n implementation: AuditLogFolderAfterDeleteHandlerImpl,\n dependencies: [AuditLogsContext]\n});\n"],"names":["AuditLogFolderAfterDeleteHandlerImpl","context","event","folder","createAuditLog","getAuditConfig","AUDIT","error","WebinyError","AuditLogFolderAfterDeleteHandler","FolderAfterDeleteEventHandler","AuditLogsContext"],"mappings":";;;;;AAMA,MAAMA;IACF,YAAoBC,OAAmC,CAAE;aAArCA,OAAO,GAAPA;IAAsC;IAE1D,MAAM,OAAOC,KAA0C,EAAiB;QACpE,IAAI;YACA,MAAM,EAAEC,MAAM,EAAE,GAAGD,MAAM,OAAO;YAChC,IAAIC,AAAgB,aAAhBA,OAAO,IAAI,EAAe;gBAC1B,MAAMC,iBAAiBC,eAAeC,MAAM,YAAY,CAAC,WAAW,CAAC,MAAM;gBAC3E,MAAMF,eAAe,kBAAkBD,QAAQA,OAAO,EAAE,EAAE,IAAI,CAAC,OAAO;YAC1E,OAAO,IAAIA,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS;gBACvC,MAAMC,iBAAiBC,eAAeC,MAAM,YAAY,CAAC,YAAY,CAAC,MAAM;gBAC5E,MAAMF,eAAe,kBAAkBD,QAAQA,OAAO,EAAE,EAAE,IAAI,CAAC,OAAO;YAC1E,OAAO,IAAIA,AAAgB,cAAhBA,OAAO,IAAI,EAAgB;gBAClC,MAAMC,iBAAiBC,eAAeC,MAAM,eAAe,CAAC,WAAW,CAAC,MAAM;gBAC9E,MAAMF,eAAe,kBAAkBD,QAAQA,OAAO,EAAE,EAAE,IAAI,CAAC,OAAO;YAC1E,OAAO,IAAIA,AAAgB,kBAAhBA,OAAO,IAAI,EAAoB;gBACtC,MAAMC,iBAAiBC,eAAeC,MAAM,eAAe,CAAC,eAAe,CAAC,MAAM;gBAClF,MAAMF,eAAe,kBAAkBD,QAAQA,OAAO,EAAE,EAAE,IAAI,CAAC,OAAO;YAC1E;QACJ,EAAE,OAAOI,OAAO;YACZ,MAAMC,cAAAA,IAAgB,CAACD,OAAO;gBAC1B,SAAS;gBACT,MAAM;YACV;QACJ;IACJ;AACJ;AAEO,MAAME,mCAAmCC,8BAA8B,oBAAoB,CAAC;IAC/F,gBAAgBV;IAChB,cAAc;QAACW;KAAiB;AACpC"}
1
+ {"version":3,"file":"subscriptions/aco/handlers/AuditLogFolderAfterDeleteHandler.js","sources":["../../../../src/subscriptions/aco/handlers/AuditLogFolderAfterDeleteHandler.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport { FolderAfterDeleteEventHandler } from \"@webiny/api-aco/features/folder/DeleteFolder/index.js\";\nimport { AuditLogsContext } from \"~/abstractions.js\";\nimport { AUDIT } from \"~/config.js\";\nimport { getAuditConfig } from \"~/utils/getAuditConfig.js\";\n\nclass AuditLogFolderAfterDeleteHandlerImpl implements FolderAfterDeleteEventHandler.Interface {\n constructor(private context: AuditLogsContext.Interface) {}\n\n async handle(event: FolderAfterDeleteEventHandler.Event): Promise<void> {\n try {\n const { folder } = event.payload;\n if (folder.type === \"PbPage\") {\n const createAuditLog = getAuditConfig(AUDIT.PAGE_BUILDER.PAGE_FOLDER.DELETE);\n await createAuditLog(\"Folder deleted\", folder, folder.id, this.context);\n } else if (folder.type === \"FmFile\") {\n const createAuditLog = getAuditConfig(AUDIT.FILE_MANAGER.FILE_FOLDER.DELETE);\n await createAuditLog(\"Folder deleted\", folder, folder.id, this.context);\n } else if (folder.type.startsWith(\"cms:\")) {\n const createAuditLog = getAuditConfig(AUDIT.HEADLESS_CMS.MODEL_FOLDER.DELETE);\n await createAuditLog(\"Folder deleted\", folder, folder.id, this.context);\n }\n } catch (error) {\n throw WebinyError.from(error, {\n message: \"Error while executing AuditLogFolderAfterDeleteHandler\",\n code: \"AUDIT_LOGS_AFTER_FOLDER_DELETE_HANDLER\"\n });\n }\n }\n}\n\nexport const AuditLogFolderAfterDeleteHandler = FolderAfterDeleteEventHandler.createImplementation({\n implementation: AuditLogFolderAfterDeleteHandlerImpl,\n dependencies: [AuditLogsContext]\n});\n"],"names":["AuditLogFolderAfterDeleteHandlerImpl","context","event","folder","createAuditLog","getAuditConfig","AUDIT","error","WebinyError","AuditLogFolderAfterDeleteHandler","FolderAfterDeleteEventHandler","AuditLogsContext"],"mappings":";;;;;AAMA,MAAMA;IACF,YAAoBC,OAAmC,CAAE;aAArCA,OAAO,GAAPA;IAAsC;IAE1D,MAAM,OAAOC,KAA0C,EAAiB;QACpE,IAAI;YACA,MAAM,EAAEC,MAAM,EAAE,GAAGD,MAAM,OAAO;YAChC,IAAIC,AAAgB,aAAhBA,OAAO,IAAI,EAAe;gBAC1B,MAAMC,iBAAiBC,eAAeC,MAAM,YAAY,CAAC,WAAW,CAAC,MAAM;gBAC3E,MAAMF,eAAe,kBAAkBD,QAAQA,OAAO,EAAE,EAAE,IAAI,CAAC,OAAO;YAC1E,OAAO,IAAIA,AAAgB,aAAhBA,OAAO,IAAI,EAAe;gBACjC,MAAMC,iBAAiBC,eAAeC,MAAM,YAAY,CAAC,WAAW,CAAC,MAAM;gBAC3E,MAAMF,eAAe,kBAAkBD,QAAQA,OAAO,EAAE,EAAE,IAAI,CAAC,OAAO;YAC1E,OAAO,IAAIA,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS;gBACvC,MAAMC,iBAAiBC,eAAeC,MAAM,YAAY,CAAC,YAAY,CAAC,MAAM;gBAC5E,MAAMF,eAAe,kBAAkBD,QAAQA,OAAO,EAAE,EAAE,IAAI,CAAC,OAAO;YAC1E;QACJ,EAAE,OAAOI,OAAO;YACZ,MAAMC,cAAAA,IAAgB,CAACD,OAAO;gBAC1B,SAAS;gBACT,MAAM;YACV;QACJ;IACJ;AACJ;AAEO,MAAME,mCAAmCC,8BAA8B,oBAAoB,CAAC;IAC/F,gBAAgBV;IAChB,cAAc;QAACW;KAAiB;AACpC"}
@@ -0,0 +1,11 @@
1
+ import { AiAfterGenerateTextEventHandler } from "@webiny/api-core/features/ai/index.js";
2
+ import { AuditLogsContext } from "../../../abstractions.js";
3
+ declare class AuditLogAiAfterGenerateTextHandlerImpl implements AiAfterGenerateTextEventHandler.Interface {
4
+ private context;
5
+ constructor(context: AuditLogsContext.Interface);
6
+ handle(event: AiAfterGenerateTextEventHandler.Event): Promise<void>;
7
+ }
8
+ export declare const AuditLogAiAfterGenerateTextHandler: typeof AuditLogAiAfterGenerateTextHandlerImpl & {
9
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/eventPublisher").IEventHandler<import("@webiny/api-core/features/ai/events").AiAfterGenerateTextEvent>>;
10
+ };
11
+ export {};
@@ -0,0 +1,41 @@
1
+ import _webiny_error from "@webiny/error";
2
+ import { AiAfterGenerateTextEventHandler } from "@webiny/api-core/features/ai/index.js";
3
+ import { AuditLogsContext } from "../../../abstractions.js";
4
+ import { AUDIT } from "../../../config.js";
5
+ import { getAuditConfig } from "../../../utils/getAuditConfig.js";
6
+ class AuditLogAiAfterGenerateTextHandlerImpl {
7
+ constructor(context){
8
+ this.context = context;
9
+ }
10
+ async handle(event) {
11
+ try {
12
+ const { requestId, result, duration } = event.payload;
13
+ const createAuditLog = getAuditConfig(AUDIT.AI.TEXT.GENERATE);
14
+ await createAuditLog("AI Generate Text", {
15
+ after: {
16
+ status: "success",
17
+ duration: Math.round(duration),
18
+ text: result.text,
19
+ usage: result.usage,
20
+ finishReason: result.finishReason,
21
+ steps: result.steps.length,
22
+ toolCalls: result.steps.reduce((sum, step)=>sum + step.toolCalls.length, 0)
23
+ }
24
+ }, requestId, this.context);
25
+ } catch (error) {
26
+ throw _webiny_error.from(error, {
27
+ message: "Error while executing AuditLogAiAfterGenerateTextHandler",
28
+ code: "AUDIT_LOGS_AI_AFTER_GENERATE_TEXT"
29
+ });
30
+ }
31
+ }
32
+ }
33
+ const AuditLogAiAfterGenerateTextHandler = AiAfterGenerateTextEventHandler.createImplementation({
34
+ implementation: AuditLogAiAfterGenerateTextHandlerImpl,
35
+ dependencies: [
36
+ AuditLogsContext
37
+ ]
38
+ });
39
+ export { AuditLogAiAfterGenerateTextHandler };
40
+
41
+ //# sourceMappingURL=AuditLogAiAfterGenerateTextHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscriptions/ai/handlers/AuditLogAiAfterGenerateTextHandler.js","sources":["../../../../src/subscriptions/ai/handlers/AuditLogAiAfterGenerateTextHandler.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport { AiAfterGenerateTextEventHandler } from \"@webiny/api-core/features/ai/index.js\";\nimport { AuditLogsContext } from \"~/abstractions.js\";\nimport { AUDIT } from \"~/config.js\";\nimport { getAuditConfig } from \"~/utils/getAuditConfig.js\";\n\nclass AuditLogAiAfterGenerateTextHandlerImpl implements AiAfterGenerateTextEventHandler.Interface {\n constructor(private context: AuditLogsContext.Interface) {}\n\n async handle(event: AiAfterGenerateTextEventHandler.Event): Promise<void> {\n try {\n const { requestId, result, duration } = event.payload;\n const createAuditLog = getAuditConfig(AUDIT.AI.TEXT.GENERATE);\n\n await createAuditLog(\n \"AI Generate Text\",\n {\n after: {\n status: \"success\",\n duration: Math.round(duration),\n text: result.text,\n usage: result.usage,\n finishReason: result.finishReason,\n steps: result.steps.length,\n toolCalls: result.steps.reduce(\n (sum, step) => sum + step.toolCalls.length,\n 0\n )\n }\n },\n requestId,\n this.context\n );\n } catch (error) {\n throw WebinyError.from(error, {\n message: \"Error while executing AuditLogAiAfterGenerateTextHandler\",\n code: \"AUDIT_LOGS_AI_AFTER_GENERATE_TEXT\"\n });\n }\n }\n}\n\nexport const AuditLogAiAfterGenerateTextHandler =\n AiAfterGenerateTextEventHandler.createImplementation({\n implementation: AuditLogAiAfterGenerateTextHandlerImpl,\n dependencies: [AuditLogsContext]\n });\n"],"names":["AuditLogAiAfterGenerateTextHandlerImpl","context","event","requestId","result","duration","createAuditLog","getAuditConfig","AUDIT","Math","sum","step","error","WebinyError","AuditLogAiAfterGenerateTextHandler","AiAfterGenerateTextEventHandler","AuditLogsContext"],"mappings":";;;;;AAMA,MAAMA;IACF,YAAoBC,OAAmC,CAAE;aAArCA,OAAO,GAAPA;IAAsC;IAE1D,MAAM,OAAOC,KAA4C,EAAiB;QACtE,IAAI;YACA,MAAM,EAAEC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,EAAE,GAAGH,MAAM,OAAO;YACrD,MAAMI,iBAAiBC,eAAeC,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ;YAE5D,MAAMF,eACF,oBACA;gBACI,OAAO;oBACH,QAAQ;oBACR,UAAUG,KAAK,KAAK,CAACJ;oBACrB,MAAMD,OAAO,IAAI;oBACjB,OAAOA,OAAO,KAAK;oBACnB,cAAcA,OAAO,YAAY;oBACjC,OAAOA,OAAO,KAAK,CAAC,MAAM;oBAC1B,WAAWA,OAAO,KAAK,CAAC,MAAM,CAC1B,CAACM,KAAKC,OAASD,MAAMC,KAAK,SAAS,CAAC,MAAM,EAC1C;gBAER;YACJ,GACAR,WACA,IAAI,CAAC,OAAO;QAEpB,EAAE,OAAOS,OAAO;YACZ,MAAMC,cAAAA,IAAgB,CAACD,OAAO;gBAC1B,SAAS;gBACT,MAAM;YACV;QACJ;IACJ;AACJ;AAEO,MAAME,qCACTC,gCAAgC,oBAAoB,CAAC;IACjD,gBAAgBf;IAChB,cAAc;QAACgB;KAAiB;AACpC"}
@@ -0,0 +1,11 @@
1
+ import { AiBeforeGenerateTextEventHandler } from "@webiny/api-core/features/ai/index.js";
2
+ import { AuditLogsContext } from "../../../abstractions.js";
3
+ declare class AuditLogAiBeforeGenerateTextHandlerImpl implements AiBeforeGenerateTextEventHandler.Interface {
4
+ private context;
5
+ constructor(context: AuditLogsContext.Interface);
6
+ handle(event: AiBeforeGenerateTextEventHandler.Event): Promise<void>;
7
+ }
8
+ export declare const AuditLogAiBeforeGenerateTextHandler: typeof AuditLogAiBeforeGenerateTextHandlerImpl & {
9
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/eventPublisher").IEventHandler<import("@webiny/api-core/features/ai/events").AiBeforeGenerateTextEvent>>;
10
+ };
11
+ export {};