From 42214919be59be366c2f2b536c842c0f0213ab9f Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Tue, 26 Mar 2024 16:34:19 +0000 Subject: [PATCH] Improving types around row search. --- .../src/api/controllers/row/internal.ts | 2 +- packages/server/src/sdk/app/rows/search.ts | 43 ++++++++----------- .../src/sdk/app/rows/search/external.ts | 7 +-- .../src/sdk/app/rows/search/internal.ts | 18 +++----- .../server/src/sdk/app/rows/search/sqs.ts | 15 +++++-- .../server/src/sdk/app/rows/search/types.ts | 19 ++++++++ packages/types/src/sdk/row.ts | 7 +++ 7 files changed, 67 insertions(+), 44 deletions(-) create mode 100644 packages/server/src/sdk/app/rows/search/types.ts diff --git a/packages/server/src/api/controllers/row/internal.ts b/packages/server/src/api/controllers/row/internal.ts index b1cec01129..cc903bd74a 100644 --- a/packages/server/src/api/controllers/row/internal.ts +++ b/packages/server/src/api/controllers/row/internal.ts @@ -236,4 +236,4 @@ export async function fetchEnrichedRow(ctx: UserCtx) { } } return row -} \ No newline at end of file +} diff --git a/packages/server/src/sdk/app/rows/search.ts b/packages/server/src/sdk/app/rows/search.ts index fc01324b14..14247c0668 100644 --- a/packages/server/src/sdk/app/rows/search.ts +++ b/packages/server/src/sdk/app/rows/search.ts @@ -1,9 +1,16 @@ -import { Row, SearchFilters, SearchParams, SortOrder } from "@budibase/types" +import { + Row, + SearchFilters, + SearchParams, + SearchResponse, +} from "@budibase/types" import { isExternalTableID } from "../../../integrations/utils" import * as internal from "./search/internal" import * as external from "./search/external" -import { Format } from "../../../api/controllers/view/exporters" import { NoEmptyFilterStrings } from "../../../constants" +import * as sqs from "./search/sqs" +import env from "../../../environment" +import { ExportRowsParams, ExportRowsResult } from "./search/types" export { isValidFilter } from "../../../integrations/utils" @@ -49,29 +56,15 @@ export function removeEmptyFilters(filters: SearchFilters) { return filters } -export async function search(options: SearchParams): Promise<{ - rows: any[] - hasNextPage?: boolean - bookmark?: number | null -}> { - return pickApi(options.tableId).search(options) -} - -export interface ExportRowsParams { - tableId: string - format: Format - delimiter?: string - rowIds?: string[] - columns?: string[] - query?: SearchFilters - sort?: string - sortOrder?: SortOrder - customHeaders?: { [key: string]: string } -} - -export interface ExportRowsResult { - fileName: string - content: string +export async function search(options: SearchParams): Promise { + const isExternalTable = isExternalTableID(options.tableId) + if (isExternalTable) { + return external.search(options) + } else if (env.SQS_SEARCH_ENABLE) { + return sqs.search(options) + } else { + return internal.search(options) + } } export async function exportRows( diff --git a/packages/server/src/sdk/app/rows/search/external.ts b/packages/server/src/sdk/app/rows/search/external.ts index d9cccac855..54b1ddb868 100644 --- a/packages/server/src/sdk/app/rows/search/external.ts +++ b/packages/server/src/sdk/app/rows/search/external.ts @@ -7,6 +7,7 @@ import { Row, SearchFilters, SearchParams, + SearchResponse, } from "@budibase/types" import * as exporters from "../../../../api/controllers/view/exporters" import { handleRequest } from "../../../../api/controllers/row/external" @@ -15,18 +16,18 @@ import { breakRowIdField, } from "../../../../integrations/utils" import { utils } from "@budibase/shared-core" -import { ExportRowsParams, ExportRowsResult } from "../search" +import { ExportRowsParams, ExportRowsResult } from "./types" import { HTTPError, db } from "@budibase/backend-core" import { searchInputMapping } from "./utils" import pick from "lodash/pick" import { outputProcessing } from "../../../../utilities/rowProcessor" import sdk from "../../../" -export async function search(options: SearchParams) { +export async function search(options: SearchParams): Promise { const { tableId } = options const { paginate, query, ...params } = options const { limit } = params - let bookmark = (params.bookmark && parseInt(params.bookmark)) || null + let bookmark = (params.bookmark && parseInt(params.bookmark)) || undefined if (paginate && !bookmark) { bookmark = 1 } diff --git a/packages/server/src/sdk/app/rows/search/internal.ts b/packages/server/src/sdk/app/rows/search/internal.ts index 9bd97dd2c8..51f22e406a 100644 --- a/packages/server/src/sdk/app/rows/search/internal.ts +++ b/packages/server/src/sdk/app/rows/search/internal.ts @@ -12,6 +12,7 @@ import { Row, Table, SearchParams, + SearchResponse, DocumentType, } from "@budibase/types" import { getGlobalUsersFromMetadata } from "../../../../utilities/global" @@ -30,17 +31,12 @@ import { migrateToInMemoryView, } from "../../../../api/controllers/view/utils" import sdk from "../../../../sdk" -import { ExportRowsParams, ExportRowsResult } from "../search" +import { ExportRowsParams, ExportRowsResult } from "./types" import { searchInputMapping } from "./utils" import pick from "lodash/pick" import { breakRowIdField } from "../../../../integrations/utils" -import * as sqs from "./sqs" - -export async function search(options: SearchParams) { - if (env.SQS_SEARCH_ENABLE) { - return sqs.search(options) - } +export async function search(options: SearchParams): Promise { const { tableId } = options const { paginate, query } = options @@ -106,10 +102,10 @@ export async function exportRows( const db = context.getAppDB() const table = await sdk.tables.getTable(tableId) - let result + let result: Row[] = [] if (rowIds) { let response = ( - await db.allDocs({ + await db.allDocs({ include_docs: true, keys: rowIds.map((row: string) => { const ids = breakRowIdField(row) @@ -122,9 +118,9 @@ export async function exportRows( return ids[0] }), }) - ).rows.map(row => row.doc) + ).rows.map(row => row.doc!) - result = await outputProcessing(table, response) + result = await outputProcessing(table, response) } else if (query) { let searchResponse = await search({ tableId, diff --git a/packages/server/src/sdk/app/rows/search/sqs.ts b/packages/server/src/sdk/app/rows/search/sqs.ts index 04ce2a51db..2bfebea305 100644 --- a/packages/server/src/sdk/app/rows/search/sqs.ts +++ b/packages/server/src/sdk/app/rows/search/sqs.ts @@ -6,6 +6,7 @@ import { Row, SearchFilters, SearchParams, + SearchResponse, SortDirection, SortOrder, SortType, @@ -92,7 +93,7 @@ function buildTableMap(tables: Table[]) { return tableMap } -export async function search(options: SearchParams) { +export async function search(options: SearchParams): Promise { const { tableId, paginate, query, ...params } = options const builder = new SqlQueryBuilder(SqlClient.SQL_LITE) @@ -164,9 +165,15 @@ export async function search(options: SearchParams) { const rows = await db.sql(sql) return { - rows: sqlOutputProcessing(rows, table!, allTablesMap, relationships, { - internal: true, - }), + rows: await sqlOutputProcessing( + rows, + table!, + allTablesMap, + relationships, + { + internal: true, + } + ), } } catch (err: any) { const msg = typeof err === "string" ? err : err.message diff --git a/packages/server/src/sdk/app/rows/search/types.ts b/packages/server/src/sdk/app/rows/search/types.ts new file mode 100644 index 0000000000..82620a3f73 --- /dev/null +++ b/packages/server/src/sdk/app/rows/search/types.ts @@ -0,0 +1,19 @@ +import { Format } from "../../../../api/controllers/view/exporters" +import { SearchFilters, SortOrder } from "@budibase/types" + +export interface ExportRowsParams { + tableId: string + format: Format + delimiter?: string + rowIds?: string[] + columns?: string[] + query?: SearchFilters + sort?: string + sortOrder?: SortOrder + customHeaders?: { [key: string]: string } +} + +export interface ExportRowsResult { + fileName: string + content: string +} diff --git a/packages/types/src/sdk/row.ts b/packages/types/src/sdk/row.ts index 7e4b89e0f7..1590b8d546 100644 --- a/packages/types/src/sdk/row.ts +++ b/packages/types/src/sdk/row.ts @@ -1,5 +1,6 @@ import { SortOrder, SortType } from "../api" import { SearchFilters } from "./search" +import { Row } from "../documents" export interface SearchParams { tableId: string @@ -14,3 +15,9 @@ export interface SearchParams { disableEscaping?: boolean fields?: string[] } + +export interface SearchResponse { + rows: Row[] + hasNextPage?: boolean + bookmark?: string | number +}