@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.
- package/AuditLogsFeature.d.ts +8 -0
- package/AuditLogsFeature.js +42 -0
- package/AuditLogsFeature.js.map +1 -0
- package/abstractions.d.ts +8 -3
- package/abstractions.js +2 -1
- package/abstractions.js.map +1 -1
- package/context/AuditLogsContextValue.js +5 -3
- package/context/AuditLogsContextValue.js.map +1 -1
- package/graphql/AuditLogsGraphQLSchema.d.ts +9 -0
- package/graphql/AuditLogsGraphQLSchema.js +134 -0
- package/graphql/AuditLogsGraphQLSchema.js.map +1 -0
- package/index.d.ts +2 -8
- package/index.js +1 -25
- package/package.json +24 -24
- package/storage/types.d.ts +0 -35
- package/subscriptions/aco/handlers/AuditLogFolderAfterDeleteHandler.js +4 -7
- package/subscriptions/aco/handlers/AuditLogFolderAfterDeleteHandler.js.map +1 -1
- package/subscriptions/ai/handlers/AuditLogAiAfterGenerateTextHandler.d.ts +11 -0
- package/subscriptions/ai/handlers/AuditLogAiAfterGenerateTextHandler.js +41 -0
- package/subscriptions/ai/handlers/AuditLogAiAfterGenerateTextHandler.js.map +1 -0
- package/subscriptions/ai/handlers/AuditLogAiBeforeGenerateTextHandler.d.ts +11 -0
- package/subscriptions/ai/handlers/AuditLogAiBeforeGenerateTextHandler.js +38 -0
- package/subscriptions/ai/handlers/AuditLogAiBeforeGenerateTextHandler.js.map +1 -0
- package/subscriptions/ai/handlers/AuditLogAiGenerateTextErrorHandler.d.ts +11 -0
- package/subscriptions/ai/handlers/AuditLogAiGenerateTextErrorHandler.js +40 -0
- package/subscriptions/ai/handlers/AuditLogAiGenerateTextErrorHandler.js.map +1 -0
- package/subscriptions/ai/index.d.ts +2 -0
- package/subscriptions/ai/index.js +11 -0
- package/subscriptions/ai/index.js.map +1 -0
- package/subscriptions/index.js +2 -0
- package/subscriptions/index.js.map +1 -1
- package/types.d.ts +1 -2
- package/utils/getAuditConfig.js +4 -2
- package/utils/getAuditConfig.js.map +1 -1
- package/context/index.d.ts +0 -9
- package/context/index.js +0 -31
- package/context/index.js.map +0 -1
- package/graphql/schema.d.ts +0 -3
- package/graphql/schema.js +0 -115
- package/graphql/schema.js.map +0 -1
- package/index.js.map +0 -1
- package/storage/AccessPatternHandler.d.ts +0 -14
- package/storage/AccessPatternHandler.js +0 -39
- package/storage/AccessPatternHandler.js.map +0 -1
- package/storage/Converter.d.ts +0 -16
- package/storage/Converter.js +0 -49
- package/storage/Converter.js.map +0 -1
- package/storage/Storage.d.ts +0 -18
- package/storage/Storage.js +0 -81
- package/storage/Storage.js.map +0 -1
- package/storage/abstractions/AccessPattern.d.ts +0 -24
- package/storage/abstractions/AccessPattern.js +0 -0
- package/storage/abstractions/AccessPatternHandler.d.ts +0 -13
- package/storage/abstractions/AccessPatternHandler.js +0 -0
- package/storage/abstractions/Converter.d.ts +0 -6
- package/storage/abstractions/Converter.js +0 -0
- package/storage/accessPatterns/AppAccessPattern.d.ts +0 -9
- package/storage/accessPatterns/AppAccessPattern.js +0 -35
- package/storage/accessPatterns/AppAccessPattern.js.map +0 -1
- package/storage/accessPatterns/AppCreatedByAccessPattern.d.ts +0 -9
- package/storage/accessPatterns/AppCreatedByAccessPattern.js +0 -38
- package/storage/accessPatterns/AppCreatedByAccessPattern.js.map +0 -1
- package/storage/accessPatterns/AppEntityAccessPattern.d.ts +0 -9
- package/storage/accessPatterns/AppEntityAccessPattern.js +0 -35
- package/storage/accessPatterns/AppEntityAccessPattern.js.map +0 -1
- package/storage/accessPatterns/AppEntityActionAccessPattern.d.ts +0 -9
- package/storage/accessPatterns/AppEntityActionAccessPattern.js +0 -35
- package/storage/accessPatterns/AppEntityActionAccessPattern.js.map +0 -1
- package/storage/accessPatterns/AppEntityActionCreatedByAccessPattern.d.ts +0 -9
- package/storage/accessPatterns/AppEntityActionCreatedByAccessPattern.js +0 -38
- package/storage/accessPatterns/AppEntityActionCreatedByAccessPattern.js.map +0 -1
- package/storage/accessPatterns/AppEntityCreatedByAccessPattern.d.ts +0 -9
- package/storage/accessPatterns/AppEntityCreatedByAccessPattern.js +0 -38
- package/storage/accessPatterns/AppEntityCreatedByAccessPattern.js.map +0 -1
- package/storage/accessPatterns/BaseAccessPattern.d.ts +0 -32
- package/storage/accessPatterns/BaseAccessPattern.js +0 -60
- package/storage/accessPatterns/BaseAccessPattern.js.map +0 -1
- package/storage/accessPatterns/CreatedByAccessPattern.d.ts +0 -9
- package/storage/accessPatterns/CreatedByAccessPattern.js +0 -38
- package/storage/accessPatterns/CreatedByAccessPattern.js.map +0 -1
- package/storage/accessPatterns/CreatedOnAccessPattern.d.ts +0 -9
- package/storage/accessPatterns/CreatedOnAccessPattern.js +0 -38
- package/storage/accessPatterns/CreatedOnAccessPattern.js.map +0 -1
- package/storage/accessPatterns/DefaultAccessPattern.d.ts +0 -15
- package/storage/accessPatterns/DefaultAccessPattern.js +0 -35
- package/storage/accessPatterns/DefaultAccessPattern.js.map +0 -1
- package/storage/accessPatterns/EntityIdAccessPattern.d.ts +0 -9
- package/storage/accessPatterns/EntityIdAccessPattern.js +0 -38
- package/storage/accessPatterns/EntityIdAccessPattern.js.map +0 -1
- package/storage/accessPatterns/index.d.ts +0 -6
- package/storage/accessPatterns/index.js +0 -57
- package/storage/accessPatterns/index.js.map +0 -1
- package/storage/cursorSchema.d.ts +0 -4
- package/storage/cursorSchema.js +0 -22
- package/storage/cursorSchema.js.map +0 -1
- package/storage/entity.d.ts +0 -36
- package/storage/entity.js +0 -120
- package/storage/entity.js.map +0 -1
- package/storage/results/ListErrorResult.d.ts +0 -10
- package/storage/results/ListErrorResult.js +0 -12
- package/storage/results/ListErrorResult.js.map +0 -1
- package/storage/results/ListSuccessResult.d.ts +0 -14
- package/storage/results/ListSuccessResult.js +0 -17
- package/storage/results/ListSuccessResult.js.map +0 -1
- package/storage/results/index.d.ts +0 -2
- package/storage/results/index.js +0 -2
- package/storage/startKey.d.ts +0 -6
- package/storage/startKey.js +0 -8
- 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
|
|
2
|
-
|
|
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 =
|
|
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
|
-
|
|
3
|
+
const AuditLogsStorage = createAbstraction("AuditLogsStorage");
|
|
4
|
+
export { AuditLogsContext, AuditLogsStorage };
|
|
4
5
|
|
|
5
6
|
//# sourceMappingURL=abstractions.js.map
|
package/abstractions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abstractions.js","sources":["../src/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { AuditLogsContext as
|
|
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().
|
|
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().
|
|
117
|
+
return this.getContext().container.resolve(TenantContext).getTenant().id;
|
|
116
118
|
}
|
|
117
119
|
getIdentity() {
|
|
118
|
-
const identity = this.getContext().
|
|
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().
|
|
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":";;;;;;AA6BA,MAAMA;IAMF,YAAmBC,MAAoC,CAAE;QACrD,IAAI,CAAC,UAAU,GAAGA,OAAO,UAAU;QACnC,IAAI,CAAC,mBAAmB,GAAGA,OAAO,mBAAmB;QACrD,IAAI,CAAC,OAAO,GAAGA,OAAO,OAAO;QAC7B,IAAI,CAAC,cAAc,GAAGA,OAAO,cAAc;IAC/C;IAEA,MAAa,eAAeC,OAAwB,EAAsB;QACtE,MAAMC,UAAU,IAAI,CAAC,UAAU;QAC/B,MAAMC,YAAYC,2BAA2B,IAAI,CAAC,mBAAmB;QAErE,MAAMC,WAAsB;YACxB,IAAIC;YACJ,QAAQ,IAAI,CAAC,WAAW;YACxB,WAAW,IAAI,CAAC,WAAW;YAC3B,WAAW,IAAIC;YACf,GAAGN,OAAO;YACV,SAASO,KAAK,SAAS,CAACP,QAAQ,OAAO;YACvCE;QACJ;QACA,MAAM,IAAI,CAAC,gBAAgB,CAACE;QAE5B,MAAMI,oBAAoB,IAAIC,0BAA0B;YACpD,UAAUL;YACVH;YACA,aAAYS,KAAK;gBACbC,OAAO,MAAM,CAACP,UAAUM;YAC5B;QACJ;QACA,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAACF;QAElC,MAAMI,SAAS,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;YACpC,MAAMR;QACV;QACA,IAAIQ,OAAO,OAAO,EAAE;YAChB,MAAMC,mBAAmB,IAAIC,yBAAyB;gBAClD,UAAUV;gBACVH;YACJ;YACA,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAACY;YAClC,OAAOD,OAAO,IAAI;QACtB;QACA,MAAMA,OAAO,KAAK;IACtB;IAEA,MAAa,eACTG,QAAmB,EACnBf,OAAiC,EACf;QAClB,MAAMC,UAAU,IAAI,CAAC,UAAU;QAC/B,MAAMG,WAAsB;YACxB,GAAGW,QAAQ;YACX,GAAGf,OAAO;YACV,SAASA,QAAQ,OAAO,GAAGO,KAAK,SAAS,CAACP,QAAQ,OAAO,IAAIe,SAAS,OAAO;QACjF;QACA,MAAM,IAAI,CAAC,gBAAgB,CAACX;QAE5B,MAAMY,oBAAoB,IAAIC,0BAA0B;YACpDF;YACAX;YACAH;YACA,aAAYS,KAAK;gBACbC,OAAO,MAAM,CAACP,UAAUM;YAC5B;QACJ;QACA,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAACM;QAElC,MAAMJ,SAAS,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;YACpC,MAAMR;QACV;QACA,IAAIQ,OAAO,OAAO,EAAE;YAChB,MAAMM,mBAAmB,IAAIC,yBAAyB;gBAClD,UAAUJ;gBACV,UAAUX;gBACVH;YACJ;YACA,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAACiB;YAClC,OAAON,OAAO,IAAI;QACtB;QACA,MAAMA,OAAO,KAAK;IACtB;IAEA,MAAa,YAAYQ,EAAU,EAA6B;QAC5D,MAAMR,SAAS,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;YACpCQ;YACA,QAAQ,IAAI,CAAC,WAAW;QAC5B;QACA,IAAIR,OAAO,OAAO,EAAE;YAChB,MAAM,IAAI,CAAC,gBAAgB,CAACA,OAAO,IAAI;YACvC,OAAOA,OAAO,IAAI;QACtB;QACA,MAAMA,OAAO,KAAK;IACtB;IAEA,MAAa,cAAcb,MAA4B,EAAiC;QACpF,MAAMa,SAAS,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YACnC,GAAGb,MAAM;YACT,QAAQ,IAAI,CAAC,WAAW;QAC5B;QACA,IAAIa,OAAO,OAAO,EACd,OAAO;YACH,OAAOA,OAAO,IAAI;YAClB,MAAM;gBACF,QAAQA,OAAO,IAAI,CAAC,KAAK,IAAI;gBAC7B,cAAcA,OAAO,IAAI,CAAC,YAAY;YAC1C;QACJ;QAEJ,MAAMA,OAAO,KAAK;IACtB;IAEA,MAAc,iBAAiBR,QAAmC,EAAiB;QAC/E,IAAI,CAACA,SAAS,MAAM,EAChB,MAAM,IAAIiB,MAAM;QAEpB,MAAMC,cAAc,MAAM,IAAI,CAAC,UAAU,GACpC,SAAS,CAAC,OAAO,CAACC,iBAClB,cAAc,CAAC;QACpB,KAAK,MAAMC,cAAcF,YAAa;YAClC,IAAIE,AAAoB,QAApBA,WAAW,IAAI,EACf;YAEJ,IAAIA,AAAoB,WAApBA,WAAW,IAAI,EACf;YACG,IAAIA,WAAW,IAAI,KAAK,CAAC,GAAG,EAAEpB,SAAS,MAAM,EAAE,EAClD;QAER;QAEA,MAAM,IAAIqB,mBAAmB;YACzB,SAAS;QACb;IACJ;IAEQ,cAAsB;QAC1B,OAAO,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC,OAAO,CAACC,eAAe,SAAS,GAAG,EAAE;IAC5E;IAEQ,cAAkC;QACtC,MAAMC,WAAW,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC,OAAO,CAACJ,iBAAiB,WAAW;QACjF,OAAO;YACH,IAAII,SAAS,EAAE;YACf,MAAMA,SAAS,IAAI;YACnB,aAAaA,SAAS,WAAW,IAAI;QACzC;IACJ;AACJ;AAEO,MAAMC,8BAA8B,CACvC7B,SAEO,IAAID,0BAA0BC"}
|
|
@@ -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
|
-
|
|
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.
|
|
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/
|
|
26
|
-
"@webiny/
|
|
27
|
-
"@webiny/
|
|
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": "
|
|
30
|
-
"vitest": "4.1.
|
|
32
|
+
"typescript": "7.0.2",
|
|
33
|
+
"vitest": "4.1.11"
|
|
31
34
|
},
|
|
32
35
|
"dependencies": {
|
|
33
|
-
"@
|
|
34
|
-
"@webiny/api
|
|
35
|
-
"@webiny/api-
|
|
36
|
-
"@webiny/api-
|
|
37
|
-
"@webiny/api-
|
|
38
|
-
"@webiny/api-
|
|
39
|
-
"@webiny/api-
|
|
40
|
-
"@webiny/
|
|
41
|
-
"@webiny/
|
|
42
|
-
"@webiny/
|
|
43
|
-
"@webiny/
|
|
44
|
-
"@webiny/error": "6.
|
|
45
|
-
"@webiny/feature": "6.
|
|
46
|
-
"@webiny/
|
|
47
|
-
"@webiny/
|
|
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": {
|
package/storage/types.d.ts
CHANGED
|
@@ -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 ("
|
|
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 === \"
|
|
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 {};
|