From 7ffbf273c563d7a7fc28d5875d2bf896e253aef3 Mon Sep 17 00:00:00 2001 From: Artem Niehrieiev Date: Thu, 18 Sep 2025 15:48:38 +0000 Subject: [PATCH] feat: add table settings list fields actualization according available tables --- .../data-structures/find-table-settings.ds.ts | 1 + .../table-settings.controller.ts | 2 ++ .../use-cases/find-table-settings.use.case.ts | 24 +++++++++++++++++-- ...on-saas-user-admin-permissions-e2e.test.ts | 6 +++-- ...as-user-group-edit-permissions-e2e.test.ts | 2 +- .../user-admin-permissions-e2e.test.ts | 5 +++- .../user-group-edit-permissions-e2e.test.ts | 2 +- 7 files changed, 35 insertions(+), 7 deletions(-) diff --git a/backend/src/entities/table-settings/application/data-structures/find-table-settings.ds.ts b/backend/src/entities/table-settings/application/data-structures/find-table-settings.ds.ts index 1e5fe41a6..cdd33650e 100644 --- a/backend/src/entities/table-settings/application/data-structures/find-table-settings.ds.ts +++ b/backend/src/entities/table-settings/application/data-structures/find-table-settings.ds.ts @@ -1,4 +1,5 @@ export class FindTableSettingsDs { connectionId: string; tableName: string; + masterPassword: string; } diff --git a/backend/src/entities/table-settings/table-settings.controller.ts b/backend/src/entities/table-settings/table-settings.controller.ts index 782cf1295..95471b3d7 100644 --- a/backend/src/entities/table-settings/table-settings.controller.ts +++ b/backend/src/entities/table-settings/table-settings.controller.ts @@ -65,6 +65,7 @@ export class TableSettingsController { async findAll( @QueryUuid('connectionId') connectionId: string, @QueryTableName() tableName: string, + @MasterPassword() masterPwd: string, ): Promise { if (!connectionId) { throw new HttpException( @@ -78,6 +79,7 @@ export class TableSettingsController { const inputData: FindTableSettingsDs = { connectionId: connectionId, tableName: tableName, + masterPassword: masterPwd, }; return await this.findTableSettingsUseCase.execute(inputData, InTransactionEnum.OFF); } diff --git a/backend/src/entities/table-settings/use-cases/find-table-settings.use.case.ts b/backend/src/entities/table-settings/use-cases/find-table-settings.use.case.ts index 5e22a494f..0ac916dec 100644 --- a/backend/src/entities/table-settings/use-cases/find-table-settings.use.case.ts +++ b/backend/src/entities/table-settings/use-cases/find-table-settings.use.case.ts @@ -1,4 +1,4 @@ -import { Inject, Injectable } from '@nestjs/common'; +import { Inject, Injectable, NotFoundException } from '@nestjs/common'; import AbstractUseCase from '../../../common/abstract-use.case.js'; import { IGlobalDatabaseContext } from '../../../common/application/global-database-context.interface.js'; import { BaseType } from '../../../common/data-injection.tokens.js'; @@ -6,6 +6,9 @@ import { FindTableSettingsDs } from '../application/data-structures/find-table-s import { FoundTableSettingsDs } from '../application/data-structures/found-table-settings.ds.js'; import { buildFoundTableSettingsDs } from '../utils/build-found-table-settings-ds.js'; import { IFindTableSettings } from './use-cases.interface.js'; +import { Messages } from '../../../exceptions/text/messages.js'; +import { getDataAccessObject } from '@rocketadmin/shared-code/dist/src/data-access-layer/shared/create-data-access-object.js'; +import { findAvailableFields } from '../../table/utils/find-available-fields.utils.js'; @Injectable() export class FindTableSettingsUseCase @@ -19,11 +22,28 @@ export class FindTableSettingsUseCase super(); } protected async implementation(inputData: FindTableSettingsDs): Promise { - const { connectionId, tableName } = inputData; + const { connectionId, tableName, masterPassword } = inputData; const tableSettings = await this._dbContext.tableSettingsRepository.findTableSettings(connectionId, tableName); if (!tableSettings) { return {} as FoundTableSettingsDs; } + + const foundConnection = await this._dbContext.connectionRepository.findAndDecryptConnection( + connectionId, + masterPassword, + ); + if (!foundConnection) { + throw new NotFoundException(Messages.CONNECTION_NOT_FOUND); + } + const dao = getDataAccessObject(foundConnection); + const tableStructure = await dao.getTableStructure(tableName, null); + + const availableFields = findAvailableFields(tableSettings, tableStructure); + if (tableSettings.list_fields?.length && tableSettings.list_fields?.length !== availableFields.length) { + tableSettings.list_fields = availableFields; + await this._dbContext.tableSettingsRepository.saveNewOrUpdatedSettings(tableSettings); + } + return buildFoundTableSettingsDs(tableSettings); } } diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-user-admin-permissions-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-user-admin-permissions-e2e.test.ts index 4fafc1a08..ffc5f6fe2 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-user-admin-permissions-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-user-admin-permissions-e2e.test.ts @@ -29,7 +29,6 @@ let app: INestApplication; let testUtils: TestUtils; let currentTest: string; - const mockFactory = new MockFactory(); const newConnectionToPostgres = mockFactory.generateConnectionToTestPostgresDBInDocker(); @@ -3138,7 +3137,10 @@ test.serial(`${currentTest} should return table settings when it was created`, a t.is(getTableSettingsRO.display_name, createTableSettingsDTO.display_name); t.is(JSON.stringify(getTableSettingsRO.search_fields), JSON.stringify(createTableSettingsDTO.search_fields)); t.is(JSON.stringify(getTableSettingsRO.excluded_fields), JSON.stringify(createTableSettingsDTO.excluded_fields)); - t.is(JSON.stringify(getTableSettingsRO.list_fields), JSON.stringify(createTableSettingsDTO.list_fields)); + t.is( + JSON.stringify(getTableSettingsRO.list_fields), + JSON.stringify(createTableSettingsDTO.list_fields.concat(['id', 'created_at', 'updated_at'])), + ); t.is(JSON.stringify(getTableSettingsRO.identification_fields), JSON.stringify([])); t.is(getTableSettingsRO.list_per_page, createTableSettingsDTO.list_per_page); t.is(getTableSettingsRO.ordering, createTableSettingsDTO.ordering); diff --git a/backend/test/ava-tests/non-saas-tests/non-saas-user-group-edit-permissions-e2e.test.ts b/backend/test/ava-tests/non-saas-tests/non-saas-user-group-edit-permissions-e2e.test.ts index 57dff488c..c0dffbb00 100644 --- a/backend/test/ava-tests/non-saas-tests/non-saas-user-group-edit-permissions-e2e.test.ts +++ b/backend/test/ava-tests/non-saas-tests/non-saas-user-group-edit-permissions-e2e.test.ts @@ -2372,7 +2372,7 @@ test.serial(`${currentTest} 'should return table settings when it was created`, t.is(getTableSettingsRO.display_name, createTableSettingsDTO.display_name); t.is(JSON.stringify(getTableSettingsRO.search_fields), JSON.stringify(createTableSettingsDTO.search_fields)); t.is(JSON.stringify(getTableSettingsRO.excluded_fields), JSON.stringify(createTableSettingsDTO.excluded_fields)); - t.is(JSON.stringify(getTableSettingsRO.list_fields), JSON.stringify(createTableSettingsDTO.list_fields)); + t.is(JSON.stringify(getTableSettingsRO.list_fields), JSON.stringify(createTableSettingsDTO.list_fields.concat(['id', 'created_at', 'updated_at']))); t.is(JSON.stringify(getTableSettingsRO.identification_fields), JSON.stringify([])); t.is(getTableSettingsRO.list_per_page, createTableSettingsDTO.list_per_page); t.is(getTableSettingsRO.ordering, createTableSettingsDTO.ordering); diff --git a/backend/test/ava-tests/saas-tests/user-admin-permissions-e2e.test.ts b/backend/test/ava-tests/saas-tests/user-admin-permissions-e2e.test.ts index d4bff72e8..72438cc25 100644 --- a/backend/test/ava-tests/saas-tests/user-admin-permissions-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/user-admin-permissions-e2e.test.ts @@ -3134,7 +3134,10 @@ test.serial(`${currentTest} should return table settings when it was created`, a t.is(getTableSettingsRO.display_name, createTableSettingsDTO.display_name); t.is(JSON.stringify(getTableSettingsRO.search_fields), JSON.stringify(createTableSettingsDTO.search_fields)); t.is(JSON.stringify(getTableSettingsRO.excluded_fields), JSON.stringify(createTableSettingsDTO.excluded_fields)); - t.is(JSON.stringify(getTableSettingsRO.list_fields), JSON.stringify(createTableSettingsDTO.list_fields)); + t.is( + JSON.stringify(getTableSettingsRO.list_fields), + JSON.stringify(createTableSettingsDTO.list_fields.concat(['id', 'created_at', 'updated_at'])), + ); t.is(JSON.stringify(getTableSettingsRO.identification_fields), JSON.stringify([])); t.is(getTableSettingsRO.list_per_page, createTableSettingsDTO.list_per_page); t.is(getTableSettingsRO.ordering, createTableSettingsDTO.ordering); diff --git a/backend/test/ava-tests/saas-tests/user-group-edit-permissions-e2e.test.ts b/backend/test/ava-tests/saas-tests/user-group-edit-permissions-e2e.test.ts index 50e94d023..6285d8822 100644 --- a/backend/test/ava-tests/saas-tests/user-group-edit-permissions-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/user-group-edit-permissions-e2e.test.ts @@ -2389,7 +2389,7 @@ test.serial(`${currentTest} 'should return table settings when it was created`, t.is(getTableSettingsRO.display_name, createTableSettingsDTO.display_name); t.is(JSON.stringify(getTableSettingsRO.search_fields), JSON.stringify(createTableSettingsDTO.search_fields)); t.is(JSON.stringify(getTableSettingsRO.excluded_fields), JSON.stringify(createTableSettingsDTO.excluded_fields)); - t.is(JSON.stringify(getTableSettingsRO.list_fields), JSON.stringify(createTableSettingsDTO.list_fields)); + t.is(JSON.stringify(getTableSettingsRO.list_fields), JSON.stringify(createTableSettingsDTO.list_fields.concat(['id', 'created_at', 'updated_at']))); t.is(JSON.stringify(getTableSettingsRO.identification_fields), JSON.stringify([])); t.is(getTableSettingsRO.list_per_page, createTableSettingsDTO.list_per_page); t.is(getTableSettingsRO.ordering, createTableSettingsDTO.ordering);