Attempt to fix View / ViewV2 types.

This commit is contained in:
Sam Rose 2024-04-08 14:58:48 +01:00
parent 5caca2b401
commit 81cd2a1559
No known key found for this signature in database
9 changed files with 74 additions and 51 deletions

View File

@ -41,7 +41,7 @@ async function parseSchema(view: CreateViewRequest) {
export async function get(ctx: Ctx<void, ViewResponse>) {
ctx.body = {
data: await sdk.views.get(ctx.params.viewId, { enriched: true }),
data: await sdk.views.get(ctx.params.viewId),
}
}

View File

@ -142,7 +142,9 @@ export function enrichViewSchemas(table: Table): TableResponse {
return {
...table,
views: Object.values(table.views ?? [])
.map(v => sdk.views.enrichSchema(v, table.schema))
.map(v =>
sdk.views.isV2(v) ? sdk.views.enrichSchema(v, table.schema) : v
)
.reduce((p, v) => {
p[v.name!] = v
return p

View File

@ -1,4 +1,4 @@
import { ViewV2 } from "@budibase/types"
import { ViewV2, ViewV2Enriched } from "@budibase/types"
import { context, HTTPError } from "@budibase/backend-core"
import sdk from "../../../sdk"
@ -6,26 +6,34 @@ import * as utils from "../../../db/utils"
import { enrichSchema, isV2 } from "."
import { breakExternalTableId } from "../../../integrations/utils"
export async function get(
viewId: string,
opts?: { enriched: boolean }
): Promise<ViewV2> {
export async function get(viewId: string): Promise<ViewV2> {
const { tableId } = utils.extractViewInfoFromID(viewId)
const { datasourceId, tableName } = breakExternalTableId(tableId)
const ds = await sdk.datasources.get(datasourceId!)
const table = ds.entities![tableName!]
const views = Object.values(table.views!)
const found = views.find(v => isV2(v) && v.id === viewId)
const views = Object.values(table.views!).filter(isV2)
const found = views.find(v => v.id === viewId)
if (!found) {
throw new Error("No view found")
}
if (opts?.enriched) {
return enrichSchema(found, table.schema) as ViewV2
} else {
return found as ViewV2
return found
}
export async function getEnriched(viewId: string): Promise<ViewV2Enriched> {
const { tableId } = utils.extractViewInfoFromID(viewId)
const { datasourceId, tableName } = breakExternalTableId(tableId)
const ds = await sdk.datasources.get(datasourceId!)
const table = ds.entities![tableName!]
const views = Object.values(table.views!).filter(isV2)
const found = views.find(v => v.id === viewId)
if (!found) {
throw new Error("No view found")
}
return enrichSchema(found, table.schema)
}
export async function create(

View File

@ -1,4 +1,10 @@
import { RenameColumn, TableSchema, View, ViewV2 } from "@budibase/types"
import {
RenameColumn,
TableSchema,
View,
ViewV2,
ViewV2Enriched,
} from "@budibase/types"
import { db as dbCore } from "@budibase/backend-core"
import { cloneDeep } from "lodash"
@ -16,12 +22,14 @@ function pickApi(tableId: any) {
return internal
}
export async function get(
viewId: string,
opts?: { enriched: boolean }
): Promise<ViewV2> {
export async function get(viewId: string): Promise<ViewV2> {
const { tableId } = utils.extractViewInfoFromID(viewId)
return pickApi(tableId).get(viewId, opts)
return pickApi(tableId).get(viewId)
}
export async function getEnriched(viewId: string): Promise<ViewV2Enriched> {
const { tableId } = utils.extractViewInfoFromID(viewId)
return pickApi(tableId).getEnriched(viewId)
}
export async function create(
@ -52,7 +60,10 @@ export function allowedFields(view: View | ViewV2) {
]
}
export function enrichSchema(view: View | ViewV2, tableSchema: TableSchema) {
export function enrichSchema(
view: ViewV2,
tableSchema: TableSchema
): ViewV2Enriched {
if (!sdk.views.isV2(view)) {
return view
}

View File

@ -1,26 +1,30 @@
import { ViewV2 } from "@budibase/types"
import { ViewV2, ViewV2Enriched } from "@budibase/types"
import { context, HTTPError } from "@budibase/backend-core"
import sdk from "../../../sdk"
import * as utils from "../../../db/utils"
import { enrichSchema, isV2 } from "."
export async function get(
viewId: string,
opts?: { enriched: boolean }
): Promise<ViewV2> {
export async function get(viewId: string): Promise<ViewV2> {
const { tableId } = utils.extractViewInfoFromID(viewId)
const table = await sdk.tables.getTable(tableId)
const views = Object.values(table.views!)
const found = views.find(v => isV2(v) && v.id === viewId)
const views = Object.values(table.views!).filter(isV2)
const found = views.find(v => v.id === viewId)
if (!found) {
throw new Error("No view found")
}
if (opts?.enriched) {
return enrichSchema(found, table.schema) as ViewV2
} else {
return found as ViewV2
return found
}
export async function getEnriched(viewId: string): Promise<ViewV2Enriched> {
const { tableId } = utils.extractViewInfoFromID(viewId)
const table = await sdk.tables.getTable(tableId)
const views = Object.values(table.views!).filter(isV2)
const found = views.find(v => v.id === viewId)
if (!found) {
throw new Error("No view found")
}
return enrichSchema(found, table.schema)
}
export async function create(

View File

@ -4,9 +4,9 @@ import {
ViewV2,
SearchViewRowRequest,
PaginatedSearchRowResponse,
ViewV2Enriched,
} from "@budibase/types"
import { Expectations, TestAPI } from "./base"
import sdk from "../../../sdk"
export class ViewV2API extends TestAPI {
create = async (
@ -44,10 +44,10 @@ export class ViewV2API extends TestAPI {
return await this._delete(`/api/v2/views/${viewId}`, { expectations: exp })
}
get = async (viewId: string) => {
return await this.config.doInContext(this.config.appId, () =>
sdk.views.get(viewId)
)
get = async (viewId: string, expectations?: Expectations) => {
return await this._get<ViewV2Enriched>(`/api/v2/views/${viewId}`, {
expectations,
})
}
search = async (

View File

@ -3,16 +3,11 @@ import {
Row,
Table,
TableRequest,
TableSchema,
View,
ViewV2,
ViewV2Enriched,
} from "../../../documents"
interface ViewV2Response extends ViewV2 {
schema: TableSchema
}
export type TableViewsResponse = { [key: string]: View | ViewV2Response }
export type TableViewsResponse = { [key: string]: View | ViewV2Enriched }
export interface TableResponse extends Table {
views?: TableViewsResponse

View File

@ -1,14 +1,13 @@
import { ViewV2, UIFieldMetadata } from "../../../documents"
import { ViewV2, ViewV2Enriched } from "../../../documents"
export interface ViewResponse {
data: ViewV2
}
export interface CreateViewRequest
extends Omit<ViewV2, "version" | "id" | "schema"> {
schema?: Record<string, UIFieldMetadata>
export interface ViewResponseEnriched {
data: ViewV2Enriched
}
export interface UpdateViewRequest extends Omit<ViewV2, "schema"> {
schema?: Record<string, UIFieldMetadata>
}
export interface CreateViewRequest extends Omit<ViewV2, "version" | "id"> {}
export interface UpdateViewRequest extends ViewV2 {}

View File

@ -1,5 +1,5 @@
import { SearchFilter, SortOrder, SortType } from "../../api"
import { UIFieldMetadata } from "./table"
import { TableSchema, UIFieldMetadata } from "./table"
import { Document } from "../document"
import { DBView } from "../../sdk"
@ -48,6 +48,10 @@ export interface ViewV2 {
schema?: Record<string, UIFieldMetadata>
}
export interface ViewV2Enriched extends ViewV2 {
schema?: TableSchema
}
export type ViewSchema = ViewCountOrSumSchema | ViewStatisticsSchema
export interface ViewCountOrSumSchema {