From a35be3a86e9487ecc828d9b7c3416736b45af483 Mon Sep 17 00:00:00 2001 From: steveb Date: Fri, 26 Jan 2024 15:21:28 +0100 Subject: [PATCH] feat(caller): add the current visited url of the user --- .../src/routes/modification/action/action.ts | 5 +---- packages/agent/src/utils/query-string.ts | 7 ++++++- packages/agent/test/utils/query-string.test.ts | 15 +++++++++++++++ .../src/decorators/actions/collection.ts | 2 +- .../src/cache-interface/datasource.ts | 1 + packages/datasource-toolkit/src/index.ts | 1 + .../datasource-toolkit/src/interfaces/caller.ts | 1 + .../src/interfaces/collection.ts | 3 --- .../test/__factories__/caller.ts | 1 + 9 files changed, 27 insertions(+), 9 deletions(-) diff --git a/packages/agent/src/routes/modification/action/action.ts b/packages/agent/src/routes/modification/action/action.ts index 47a741fc34..f9440b1e25 100644 --- a/packages/agent/src/routes/modification/action/action.ts +++ b/packages/agent/src/routes/modification/action/action.ts @@ -68,7 +68,6 @@ export default class ActionRoute extends CollectionRoute { this.getRecordSelection(context, false), ]); const requestBody = context.request.body as SmartActionApprovalRequestBody; - const webAppURL: URL = new URL(context.request.url || context.request.originalUrl); const canPerformCustomActionParams = { caller, @@ -104,9 +103,7 @@ export default class ActionRoute extends CollectionRoute { // Now that we have the field list, we can parse the data again. const data = ForestValueConverter.makeFormData(dataSource, rawData, fields); - const result = await this.collection.execute(caller, this.actionName, data, filterForCaller, { - webAppURL, - }); + const result = await this.collection.execute(caller, this.actionName, data, filterForCaller); if (result?.type === 'Error') { context.response.status = HttpCode.BadRequest; diff --git a/packages/agent/src/utils/query-string.ts b/packages/agent/src/utils/query-string.ts index 2d148f3549..c94d15d9db 100644 --- a/packages/agent/src/utils/query-string.ts +++ b/packages/agent/src/utils/query-string.ts @@ -140,7 +140,12 @@ export default class QueryStringParser { QueryStringParser.VALID_TIMEZONES.add(timezone); } - return { ...context.state.user, timezone, requestId: uuidv4() }; + return { + ...context.state.user, + timezone, + requestId: uuidv4(), + webAppURL: new URL(context.originalUrl), + }; } static parsePagination(context: Context): Page { diff --git a/packages/agent/test/utils/query-string.test.ts b/packages/agent/test/utils/query-string.test.ts index bd4159e6ad..404c902fdd 100644 --- a/packages/agent/test/utils/query-string.test.ts +++ b/packages/agent/test/utils/query-string.test.ts @@ -399,6 +399,21 @@ describe('QueryStringParser', () => { }); }); + test('should return the current visited url from user eg forestContextUrl', () => { + const context = createMockContext({ + state: { user: { email: 'john.doe@domain.com' } }, + customProperties: { query: { timezone: 'America/Los_Angeles' } }, + url: 'https://app.forestadmin.com/aProject/anEnvironment/aRendering', + }); + + expect(QueryStringParser.parseCaller(context)).toEqual({ + email: 'john.doe@domain.com', + requestId: expect.any(String), + timezone: 'America/Los_Angeles', + webAppURL: new URL('https://app.forestadmin.com/aProject/anEnvironment/aRendering'), + }); + }); + test('should throw a ValidationError when the timezone is missing', () => { const context = createMockContext({ customProperties: { query: {} }, diff --git a/packages/datasource-customizer/src/decorators/actions/collection.ts b/packages/datasource-customizer/src/decorators/actions/collection.ts index 10166621c3..ef05fb5d79 100644 --- a/packages/datasource-customizer/src/decorators/actions/collection.ts +++ b/packages/datasource-customizer/src/decorators/actions/collection.ts @@ -37,7 +37,7 @@ export default class ActionCollectionDecorator extends CollectionDecorator { if (!action) return this.childCollection.execute(caller, name, data, filter); // eslint-disable-next-line @typescript-eslint/no-explicit-any - const context = this.getContext(caller, action, data, filter) as any; + const context = this.getContext(caller, action, data, filter, null, null) as any; const resultBuilder = new ResultBuilder(); const result = await action.execute(context, resultBuilder); diff --git a/packages/datasource-replica/src/cache-interface/datasource.ts b/packages/datasource-replica/src/cache-interface/datasource.ts index b9d301deef..33968dcc88 100644 --- a/packages/datasource-replica/src/cache-interface/datasource.ts +++ b/packages/datasource-replica/src/cache-interface/datasource.ts @@ -16,6 +16,7 @@ export default class CacheDataSourceInterface { team: 'system', timezone: 'UTC', requestId: '', + webAppURL: new URL('https://app.forestadmin.com/aProject/anEnvironment/aRendering'), }; constructor(dataSource: DataSource) { diff --git a/packages/datasource-toolkit/src/index.ts b/packages/datasource-toolkit/src/index.ts index 412c3d8f58..6fb4970a7d 100644 --- a/packages/datasource-toolkit/src/index.ts +++ b/packages/datasource-toolkit/src/index.ts @@ -43,6 +43,7 @@ export * from './interfaces/query/sort'; export * from './interfaces/query/page'; export * from './interfaces/record'; export * from './interfaces/schema'; + export { GenericTree, GenericTreeBranch, diff --git a/packages/datasource-toolkit/src/interfaces/caller.ts b/packages/datasource-toolkit/src/interfaces/caller.ts index 8621a90265..8a40189300 100644 --- a/packages/datasource-toolkit/src/interfaces/caller.ts +++ b/packages/datasource-toolkit/src/interfaces/caller.ts @@ -9,4 +9,5 @@ export type Caller = { role: string; tags: { [key: string]: string }; timezone: string; + webAppURL: URL; }; diff --git a/packages/datasource-toolkit/src/interfaces/collection.ts b/packages/datasource-toolkit/src/interfaces/collection.ts index ac271dfe06..b4b00ee5fe 100644 --- a/packages/datasource-toolkit/src/interfaces/collection.ts +++ b/packages/datasource-toolkit/src/interfaces/collection.ts @@ -35,9 +35,6 @@ export interface Collection { name: string, formValues: RecordData, filter?: Filter, - additionalInformation?: { - webAppURL: URL; - }, ): Promise; getForm( diff --git a/packages/datasource-toolkit/test/__factories__/caller.ts b/packages/datasource-toolkit/test/__factories__/caller.ts index 35141bcbf2..710906db7d 100644 --- a/packages/datasource-toolkit/test/__factories__/caller.ts +++ b/packages/datasource-toolkit/test/__factories__/caller.ts @@ -13,4 +13,5 @@ export default Factory.define(() => ({ tags: {}, team: 'team', timezone: 'Europe/Paris', + webAppURL: new URL('https://app.forestadmin.com/aProject/anEnvironment/aRendering'), }));