From 40c94e233605408aed429c0f25f7ac43014ec502 Mon Sep 17 00:00:00 2001 From: Daria Date: Wed, 27 Aug 2025 14:31:08 +0300 Subject: [PATCH] feat(core): Auto-wrap get data table row LIKE filter values with wildcards (no-changelog) (#18853) --- .../__tests__/data-store.controller.test.ts | 38 +++++++++++++++++++ .../modules/data-table/data-store.service.ts | 8 +++- 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/modules/data-table/__tests__/data-store.controller.test.ts b/packages/cli/src/modules/data-table/__tests__/data-store.controller.test.ts index 8417d05917..4dce823cb7 100644 --- a/packages/cli/src/modules/data-table/__tests__/data-store.controller.test.ts +++ b/packages/cli/src/modules/data-table/__tests__/data-store.controller.test.ts @@ -1796,6 +1796,44 @@ describe('GET /projects/:projectId/data-stores/:dataStoreId/rows', () => { ], }); }); + + test.each(['like', 'ilike'])( + 'should auto-wrap %s filters if no wildcard is present', + async (condition) => { + const dataStore = await createDataStore(memberProject, { + columns: [ + { + name: 'name', + type: 'string', + }, + ], + data: [ + { + name: 'Alice Smith', + }, + { + name: 'Bob Jones', + }, + { + name: 'Carol Brown', + }, + ], + }); + + const filterParam = encodeURIComponent( + JSON.stringify({ + type: 'and', + filters: [{ columnName: 'name', value: 'Alice', condition }], + }), + ); + const response = await authMemberAgent + .get(`/projects/${memberProject.id}/data-stores/${dataStore.id}/rows?filter=${filterParam}`) + .expect(200); + + expect(response.body.data.count).toBe(1); + expect(response.body.data.data[0].name).toBe('Alice Smith'); + }, + ); }); describe('POST /projects/:projectId/data-stores/:dataStoreId/insert', () => { diff --git a/packages/cli/src/modules/data-table/data-store.service.ts b/packages/cli/src/modules/data-table/data-store.service.ts index 7f7458002c..04ec717410 100644 --- a/packages/cli/src/modules/data-table/data-store.service.ts +++ b/packages/cli/src/modules/data-table/data-store.service.ts @@ -107,7 +107,7 @@ export class DataStoreService { dto: ListDataStoreContentQueryDto, ) { await this.validateDataStoreExists(dataStoreId, projectId); - this.validateFilters(dto); + this.validateAndTransformFilters(dto); // unclear if we should validate here, only use case would be to reduce the chance of // a renamed/removed column appearing here (or added column missing) if the store was @@ -335,7 +335,7 @@ export class DataStoreService { } } - private validateFilters(dto: ListDataStoreContentQueryDto): void { + private validateAndTransformFilters(dto: ListDataStoreContentQueryDto): void { if (!dto.filter?.filters) { return; } @@ -352,6 +352,10 @@ export class DataStoreService { `${filter.condition.toUpperCase()} filter value must be a string`, ); } + + if (!filter.value.includes('%')) { + filter.value = `%${filter.value}%`; + } } } }