From 632e31bdc4f2eaeba887194af547e7f56d050044 Mon Sep 17 00:00:00 2001 From: Artem Niehrieiev Date: Wed, 1 Oct 2025 14:32:03 +0000 Subject: [PATCH 1/2] refactor: simplify permission check logic in user access repository --- .../user-access-custom-repository-extension.ts | 15 ++++++++------- .../saas-tests/table-postgres-e2e.test.ts | 3 +-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/backend/src/entities/user-access/repository/user-access-custom-repository-extension.ts b/backend/src/entities/user-access/repository/user-access-custom-repository-extension.ts index 97146842c..831ea2527 100644 --- a/backend/src/entities/user-access/repository/user-access-custom-repository-extension.ts +++ b/backend/src/entities/user-access/repository/user-access-custom-repository-extension.ts @@ -452,18 +452,19 @@ export const userAccessCustomReposiotoryExtension: IUserAccessRepository = { return false; } - for (const permission of allUserPermissions) { - if ( + const hasReadPermission = allUserPermissions.some( + (permission) => (permission.type === PermissionTypeEnum.Connection && permission.accessLevel === AccessLevelEnum.edit) || (permission.type === PermissionTypeEnum.Table && permission.tableName === tableName && [AccessLevelEnum.visibility, AccessLevelEnum.add, AccessLevelEnum.delete, AccessLevelEnum.edit].includes( permission.accessLevel as AccessLevelEnum, - )) - ) { - Cacher.setUserTableReadPermissionCache(userId, connectionId, tableName, true); - return true; - } + )), + ); + + if (hasReadPermission) { + Cacher.setUserTableReadPermissionCache(userId, connectionId, tableName, true); + return true; } Cacher.setUserTableReadPermissionCache(userId, connectionId, tableName, false); diff --git a/backend/test/ava-tests/saas-tests/table-postgres-e2e.test.ts b/backend/test/ava-tests/saas-tests/table-postgres-e2e.test.ts index 3b9abfb2b..0e9bbeb4c 100644 --- a/backend/test/ava-tests/saas-tests/table-postgres-e2e.test.ts +++ b/backend/test/ava-tests/saas-tests/table-postgres-e2e.test.ts @@ -1901,10 +1901,9 @@ test.serial(`${currentTest} should throw an exception when table name passed in .set('Cookie', firstUserToken) .set('Content-Type', 'application/json') .set('Accept', 'application/json'); - t.is(getTableRowsResponse.status, 400); const { message } = JSON.parse(getTableRowsResponse.text); - + t.is(getTableRowsResponse.status, 400); t.is(message, Messages.TABLE_NOT_FOUND); } catch (e) { console.error(e); From dd536ba1847efe644ffaf63c04a7e93e6cad9454 Mon Sep 17 00:00:00 2001 From: Artem Niehrieiev Date: Thu, 2 Oct 2025 08:23:43 +0000 Subject: [PATCH 2/2] feat: add findTableCustoms method to retrieve table settings with custom fields and widgets --- ...le-settings-custom-repository-extension.ts | 19 ++++++++++++++++++- .../table-settings.repository.interface.ts | 9 +++++++++ .../use-cases/get-table-rows.use.case.ts | 10 ++++------ 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/backend/src/entities/table-settings/repository/table-settings-custom-repository-extension.ts b/backend/src/entities/table-settings/repository/table-settings-custom-repository-extension.ts index a03c1923d..c0aefcb7b 100644 --- a/backend/src/entities/table-settings/repository/table-settings-custom-repository-extension.ts +++ b/backend/src/entities/table-settings/repository/table-settings-custom-repository-extension.ts @@ -4,13 +4,30 @@ import { ConnectionEntity } from '../../connection/connection.entity.js'; import { CreateTableSettingsDs } from '../application/data-structures/create-table-settings.ds.js'; import { TableSettingsEntity } from '../table-settings.entity.js'; import { buildNewTableSettingsEntity } from '../utils/build-new-table-settings-entity.js'; -import { ITableSettingsRepository } from './table-settings.repository.interface.js'; +import { FoundTableSettingsData, ITableSettingsRepository } from './table-settings.repository.interface.js'; export const tableSettingsCustomRepositoryExtension: ITableSettingsRepository = { async saveNewOrUpdatedSettings(settings: TableSettingsEntity): Promise { return await this.save(settings); }, + async findTableCustoms(connectionId: string, tableName: string): Promise { + const qb = this.createQueryBuilder('tableSettings') + .leftJoinAndSelect('tableSettings.custom_fields', 'custom_fields') + .leftJoinAndSelect('tableSettings.table_widgets', 'table_widgets') + .where('tableSettings.connection_id = :connection_id', { + connection_id: connectionId, + }) + .andWhere('tableSettings.table_name = :table_name', { table_name: tableName }); + + const foundTableSettings = await qb.getOne(); + return { + tableSettings: foundTableSettings || null, + tableCustomFields: foundTableSettings ? foundTableSettings.custom_fields : [], + tableWidgets: foundTableSettings ? foundTableSettings.table_widgets : [], + }; + }, + async createNewTableSettings(settings: CreateTableSettingsDs): Promise { const connectionQB = this.manager .getRepository(ConnectionEntity) diff --git a/backend/src/entities/table-settings/repository/table-settings.repository.interface.ts b/backend/src/entities/table-settings/repository/table-settings.repository.interface.ts index 19ebc6035..983964f48 100644 --- a/backend/src/entities/table-settings/repository/table-settings.repository.interface.ts +++ b/backend/src/entities/table-settings/repository/table-settings.repository.interface.ts @@ -1,7 +1,16 @@ +import { CustomFieldsEntity } from '../../custom-field/custom-fields.entity.js'; +import { TableWidgetEntity } from '../../widget/table-widget.entity.js'; import { CreateTableSettingsDs } from '../application/data-structures/create-table-settings.ds.js'; import { TableSettingsEntity } from '../table-settings.entity.js'; +export type FoundTableSettingsData = { + tableSettings: TableSettingsEntity; + tableCustomFields: Array; + tableWidgets: Array; +}; export interface ITableSettingsRepository { + findTableCustoms(connectionId: string, tableName: string): Promise; + saveNewOrUpdatedSettings(settings: TableSettingsEntity): Promise; findTableSettingsWithCustomFields(connectionId: string, tableName: string): Promise; diff --git a/backend/src/entities/table/use-cases/get-table-rows.use.case.ts b/backend/src/entities/table/use-cases/get-table-rows.use.case.ts index ae1235665..8e646883f 100644 --- a/backend/src/entities/table/use-cases/get-table-rows.use.case.ts +++ b/backend/src/entities/table/use-cases/get-table-rows.use.case.ts @@ -86,25 +86,23 @@ export class GetTableRowsUseCase extends AbstractUseCase