Type external request responses

This commit is contained in:
Adria Navarro 2023-09-28 11:02:16 +02:00
parent 0c4cdde25f
commit 80e979faa6
2 changed files with 33 additions and 14 deletions

View File

@ -269,13 +269,25 @@ function isEditableColumn(column: FieldSchema) {
return !(isExternalAutoColumn || isFormula)
}
export class ExternalRequest {
private operation: Operation
private tableId: string
export type ExternalRequestReturnType<T> = T extends Operation.READ
?
| Row[]
| {
row: Row
table: Table
}
: {
row: Row
table: Table
}
export class ExternalRequest<T extends Operation> {
private readonly operation: T
private readonly tableId: string
private datasource?: Datasource
private tables: { [key: string]: Table } = {}
constructor(operation: Operation, tableId: string, datasource?: Datasource) {
constructor(operation: T, tableId: string, datasource?: Datasource) {
this.operation = operation
this.tableId = tableId
this.datasource = datasource
@ -739,7 +751,7 @@ export class ExternalRequest {
return fields
}
async run(config: RunConfig) {
async run(config: RunConfig): Promise<ExternalRequestReturnType<T>> {
const { operation, tableId } = this
let { datasourceId, tableName } = breakExternalTableId(tableId)
if (!tableName) {
@ -830,8 +842,11 @@ export class ExternalRequest {
}
const output = this.outputProcessing(response, table, relationships)
// if reading it'll just be an array of rows, return whole thing
return operation === Operation.READ && Array.isArray(response)
? output
: { row: output[0], table }
const result = (
operation === Operation.READ && Array.isArray(response)
? output
: { row: output[0], table }
) as ExternalRequestReturnType<T>
return result
}
}

View File

@ -1,9 +1,13 @@
import { FieldTypes, NoEmptyFilterStrings } from "../../../constants"
import { FieldTypes } from "../../../constants"
import {
breakExternalTableId,
breakRowIdField,
} from "../../../integrations/utils"
import { ExternalRequest, RunConfig } from "./ExternalRequest"
import {
ExternalRequest,
ExternalRequestReturnType,
RunConfig,
} from "./ExternalRequest"
import {
Datasource,
IncludeRelationship,
@ -24,11 +28,11 @@ import {
} from "../../../utilities/rowProcessor"
import { cloneDeep, isEqual } from "lodash"
export async function handleRequest(
operation: Operation,
export async function handleRequest<T extends Operation>(
operation: T,
tableId: string,
opts?: RunConfig
) {
): Promise<ExternalRequestReturnType<T>> {
// make sure the filters are cleaned up, no empty strings for equals, fuzzy or string
if (opts && opts.filters) {
opts.filters = sdk.rows.removeEmptyFilters(opts.filters)
@ -37,7 +41,7 @@ export async function handleRequest(
!dataFilters.hasFilters(opts?.filters) &&
opts?.filters?.onEmptyFilter === EmptyFilterOption.RETURN_NONE
) {
return []
return [] as any
}
return new ExternalRequest(operation, tableId, opts?.datasource).run(