From 2186b0407af82c34f81dbce7748e232b1fd18502 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 21 Jul 2023 18:30:17 +0200 Subject: [PATCH 1/6] Honor schema on view search --- .../server/src/api/controllers/row/index.ts | 10 +++++++- .../server/src/api/routes/tests/row.spec.ts | 24 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/packages/server/src/api/controllers/row/index.ts b/packages/server/src/api/controllers/row/index.ts index 8ba2f4b0ba..0b17a35772 100644 --- a/packages/server/src/api/controllers/row/index.ts +++ b/packages/server/src/api/controllers/row/index.ts @@ -8,6 +8,7 @@ import { gridSocket } from "../../../websockets" import sdk from "../../../sdk" import * as exporters from "../view/exporters" import { apiFileReturn } from "../../../utilities/fileSystem" +import _ from "lodash" function pickApi(tableId: any) { if (isExternalTable(tableId)) { @@ -155,7 +156,7 @@ export async function searchView(ctx: Ctx) { } ctx.status = 200 - ctx.body = await quotas.addQuery( + let { rows } = await quotas.addQuery( () => sdk.rows.search({ tableId: view.tableId, @@ -168,6 +169,13 @@ export async function searchView(ctx: Ctx) { datasourceId: view.tableId, } ) + + const { columns } = view + if (columns) { + rows = rows.map(r => _.pick(r, columns)) + } + + ctx.body = { rows } } export async function validate(ctx: Ctx) { diff --git a/packages/server/src/api/routes/tests/row.spec.ts b/packages/server/src/api/routes/tests/row.spec.ts index 2890085c88..ba0afd1fcf 100644 --- a/packages/server/src/api/routes/tests/row.spec.ts +++ b/packages/server/src/api/routes/tests/row.spec.ts @@ -841,5 +841,29 @@ describe("/rows", () => { rows: expected.map(name => expect.objectContaining({ name })), }) }) + + it("when schema is defined, no other columns are returnd", async () => { + const table = await config.createTable(userTable()) + const rows = [] + for (let i = 0; i < 10; i++) { + rows.push( + await config.createRow({ + tableId: table._id, + name: generator.name(), + age: generator.age(), + }) + ) + } + + const createViewResponse = await config.api.viewV2.create({ + columns: ["name"], + }) + const response = await config.api.viewV2.search(createViewResponse.id) + + expect(response.body.rows).toHaveLength(10) + expect(response.body.rows).toEqual( + expect.arrayContaining(rows.map(r => ({ name: r.name }))) + ) + }) }) }) From d1d86b6803fccbb4d1e865b1474c637ccfd105b5 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Sun, 23 Jul 2023 22:36:34 +0200 Subject: [PATCH 2/6] Filter on the sdk --- packages/server/src/api/controllers/row/index.ts | 9 ++------- packages/server/src/sdk/app/rows/search.ts | 9 ++++++++- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/packages/server/src/api/controllers/row/index.ts b/packages/server/src/api/controllers/row/index.ts index 0b17a35772..62d81fb29e 100644 --- a/packages/server/src/api/controllers/row/index.ts +++ b/packages/server/src/api/controllers/row/index.ts @@ -8,7 +8,6 @@ import { gridSocket } from "../../../websockets" import sdk from "../../../sdk" import * as exporters from "../view/exporters" import { apiFileReturn } from "../../../utilities/fileSystem" -import _ from "lodash" function pickApi(tableId: any) { if (isExternalTable(tableId)) { @@ -156,7 +155,7 @@ export async function searchView(ctx: Ctx) { } ctx.status = 200 - let { rows } = await quotas.addQuery( + const { rows } = await quotas.addQuery( () => sdk.rows.search({ tableId: view.tableId, @@ -164,17 +163,13 @@ export async function searchView(ctx: Ctx) { sort: view.sort?.field, sortOrder: view.sort?.order, sortType: view.sort?.type, + fields: view.columns, }), { datasourceId: view.tableId, } ) - const { columns } = view - if (columns) { - rows = rows.map(r => _.pick(r, columns)) - } - ctx.body = { rows } } diff --git a/packages/server/src/sdk/app/rows/search.ts b/packages/server/src/sdk/app/rows/search.ts index 53f3bbbc43..ab0723ab10 100644 --- a/packages/server/src/sdk/app/rows/search.ts +++ b/packages/server/src/sdk/app/rows/search.ts @@ -3,6 +3,7 @@ import { isExternalTable } from "../../../integrations/utils" import * as internal from "./search/internal" import * as external from "./search/external" import { Format } from "../../../api/controllers/view/exporters" +import _ from "lodash" export interface SearchParams { tableId: string @@ -15,6 +16,7 @@ export interface SearchParams { sortType?: SortType version?: string disableEscaping?: boolean + fields?: string[] } export interface ViewParams { @@ -33,7 +35,12 @@ function pickApi(tableId: any) { export async function search(options: SearchParams): Promise<{ rows: any[] }> { - return pickApi(options.tableId).search(options) + let { rows } = await pickApi(options.tableId).search(options) + + if (options.fields) { + rows = rows.map((r: any) => _.pick(r, options.fields!)) + } + return { rows } } export interface ExportRowsParams { From 9cf401162be1ef04895671b62161b4284b95b105 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Sun, 23 Jul 2023 22:40:53 +0200 Subject: [PATCH 3/6] Add views --- packages/server/src/api/routes/tests/row.spec.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/server/src/api/routes/tests/row.spec.ts b/packages/server/src/api/routes/tests/row.spec.ts index ba0afd1fcf..e6be3a5cfc 100644 --- a/packages/server/src/api/routes/tests/row.spec.ts +++ b/packages/server/src/api/routes/tests/row.spec.ts @@ -842,7 +842,7 @@ describe("/rows", () => { }) }) - it("when schema is defined, no other columns are returnd", async () => { + it("when schema is defined, no other columns are returned", async () => { const table = await config.createTable(userTable()) const rows = [] for (let i = 0; i < 10; i++) { @@ -865,5 +865,14 @@ describe("/rows", () => { expect.arrayContaining(rows.map(r => ({ name: r.name }))) ) }) + + it("views without data can be returned", async () => { + const table = await config.createTable(userTable()) + + const createViewResponse = await config.api.viewV2.create() + const response = await config.api.viewV2.search(createViewResponse.id) + + expect(response.body.rows).toHaveLength(0) + }) }) }) From 1cf4e6e85a7a3f55ef1ee35633bbae9244b3a732 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Mon, 24 Jul 2023 10:05:27 +0200 Subject: [PATCH 4/6] Return full object from search --- packages/server/src/api/controllers/row/index.ts | 4 +--- packages/server/src/sdk/app/rows/search.ts | 8 +++++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/server/src/api/controllers/row/index.ts b/packages/server/src/api/controllers/row/index.ts index 62d81fb29e..5ffc91c102 100644 --- a/packages/server/src/api/controllers/row/index.ts +++ b/packages/server/src/api/controllers/row/index.ts @@ -155,7 +155,7 @@ export async function searchView(ctx: Ctx) { } ctx.status = 200 - const { rows } = await quotas.addQuery( + ctx.body = await quotas.addQuery( () => sdk.rows.search({ tableId: view.tableId, @@ -169,8 +169,6 @@ export async function searchView(ctx: Ctx) { datasourceId: view.tableId, } ) - - ctx.body = { rows } } export async function validate(ctx: Ctx) { diff --git a/packages/server/src/sdk/app/rows/search.ts b/packages/server/src/sdk/app/rows/search.ts index ab0723ab10..4937460686 100644 --- a/packages/server/src/sdk/app/rows/search.ts +++ b/packages/server/src/sdk/app/rows/search.ts @@ -34,13 +34,15 @@ function pickApi(tableId: any) { export async function search(options: SearchParams): Promise<{ rows: any[] + hasNextPage?: boolean + bookmark?: number | null }> { - let { rows } = await pickApi(options.tableId).search(options) + const result = await pickApi(options.tableId).search(options) if (options.fields) { - rows = rows.map((r: any) => _.pick(r, options.fields!)) + result.rows = result.rows.map((r: any) => _.pick(r, options.fields!)) } - return { rows } + return result } export interface ExportRowsParams { From 5bd149f66ffc291083b97ccc42fd88391fd7327e Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Mon, 24 Jul 2023 15:37:28 +0200 Subject: [PATCH 5/6] Use sdk to populate views --- packages/server/src/api/controllers/row/index.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/server/src/api/controllers/row/index.ts b/packages/server/src/api/controllers/row/index.ts index 5ffc91c102..79a1d54c63 100644 --- a/packages/server/src/api/controllers/row/index.ts +++ b/packages/server/src/api/controllers/row/index.ts @@ -154,6 +154,16 @@ export async function searchView(ctx: Ctx) { ctx.throw(404, `View ${viewId} not found`) } + if (view.version !== 2) { + ctx.throw(400, `This method only supports viewsV2`) + } + + const table = await sdk.tables.getTable(view?.tableId) + + const viewFields = + view.columns?.length && + Object.keys(sdk.views.enrichSchema(view, table.schema).schema) + ctx.status = 200 ctx.body = await quotas.addQuery( () => @@ -163,7 +173,7 @@ export async function searchView(ctx: Ctx) { sort: view.sort?.field, sortOrder: view.sort?.order, sortType: view.sort?.type, - fields: view.columns, + fields: viewFields, }), { datasourceId: view.tableId, From 7465c0479913b8c23f6f9c666983ab76455c13a2 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Mon, 24 Jul 2023 16:35:22 +0200 Subject: [PATCH 6/6] Fix controller --- packages/server/src/api/controllers/row/index.ts | 6 ++++-- packages/server/src/api/routes/tests/row.spec.ts | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/server/src/api/controllers/row/index.ts b/packages/server/src/api/controllers/row/index.ts index 79a1d54c63..6456d0def9 100644 --- a/packages/server/src/api/controllers/row/index.ts +++ b/packages/server/src/api/controllers/row/index.ts @@ -161,8 +161,10 @@ export async function searchView(ctx: Ctx) { const table = await sdk.tables.getTable(view?.tableId) const viewFields = - view.columns?.length && - Object.keys(sdk.views.enrichSchema(view, table.schema).schema) + (view.columns && + Object.entries(view.columns).length && + Object.keys(sdk.views.enrichSchema(view, table.schema).schema)) || + undefined ctx.status = 200 ctx.body = await quotas.addQuery( diff --git a/packages/server/src/api/routes/tests/row.spec.ts b/packages/server/src/api/routes/tests/row.spec.ts index e6be3a5cfc..e1dd11e6dd 100644 --- a/packages/server/src/api/routes/tests/row.spec.ts +++ b/packages/server/src/api/routes/tests/row.spec.ts @@ -856,7 +856,7 @@ describe("/rows", () => { } const createViewResponse = await config.api.viewV2.create({ - columns: ["name"], + columns: { name: { visible: true } }, }) const response = await config.api.viewV2.search(createViewResponse.id)