Use new table schema
This commit is contained in:
parent
ed02aa4d8b
commit
396c4ad439
|
@ -11,7 +11,9 @@ import {
|
||||||
FetchTablesResponse,
|
FetchTablesResponse,
|
||||||
Table,
|
Table,
|
||||||
TableResponse,
|
TableResponse,
|
||||||
|
TableSchema,
|
||||||
TableViewsResponse,
|
TableViewsResponse,
|
||||||
|
UIFieldMetadata,
|
||||||
UserCtx,
|
UserCtx,
|
||||||
} from "@budibase/types"
|
} from "@budibase/types"
|
||||||
import sdk from "../../../sdk"
|
import sdk from "../../../sdk"
|
||||||
|
@ -55,6 +57,25 @@ export async function fetch(ctx: UserCtx<void, FetchTablesResponse>) {
|
||||||
ctx.body = response
|
ctx.body = response
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function enrichSchema(
|
||||||
|
tableSchema: TableSchema,
|
||||||
|
viewOverrides: Record<string, UIFieldMetadata>
|
||||||
|
) {
|
||||||
|
const result: TableSchema = {}
|
||||||
|
for (const [columnName, columnUIMetadata] of Object.entries(viewOverrides)) {
|
||||||
|
if (!columnUIMetadata.visible) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!tableSchema[columnName]) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
result[columnName] = _.merge(tableSchema[columnName], columnUIMetadata)
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
function enrichTable(table: Table): TableResponse {
|
function enrichTable(table: Table): TableResponse {
|
||||||
const result: TableResponse = {
|
const result: TableResponse = {
|
||||||
...table,
|
...table,
|
||||||
|
@ -64,26 +85,16 @@ function enrichTable(table: Table): TableResponse {
|
||||||
} else {
|
} else {
|
||||||
p[v.name] = {
|
p[v.name] = {
|
||||||
...v,
|
...v,
|
||||||
schema: !v?.columns?.length
|
schema:
|
||||||
? table.schema
|
!v?.columns || !Object.entries(v?.columns).length
|
||||||
: _.pick(table.schema, ...v.columns),
|
? table.schema
|
||||||
|
: enrichSchema(table.schema, v.columns),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return p
|
return p
|
||||||
}, {} as TableViewsResponse),
|
}, {} as TableViewsResponse),
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const [viewName, view] of Object.entries(table.views!)) {
|
|
||||||
if (sdk.views.isV2(view)) {
|
|
||||||
table.views![viewName] = {
|
|
||||||
...view,
|
|
||||||
schema: !view?.columns?.length
|
|
||||||
? table.schema
|
|
||||||
: _.pick(table.schema, ...view.columns),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -184,7 +184,46 @@ describe("/tables", () => {
|
||||||
let testTable: Table
|
let testTable: Table
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
testTable = await config.createTable(testTable)
|
testTable = await config.createTable({
|
||||||
|
name: "TestTable",
|
||||||
|
type: "table",
|
||||||
|
schema: {
|
||||||
|
name: {
|
||||||
|
type: FieldType.STRING,
|
||||||
|
name: "name",
|
||||||
|
visible: true,
|
||||||
|
width: 80,
|
||||||
|
constraints: {
|
||||||
|
type: "string",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
type: FieldType.STRING,
|
||||||
|
name: "description",
|
||||||
|
visible: true,
|
||||||
|
width: 200,
|
||||||
|
constraints: {
|
||||||
|
type: "string",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
id: {
|
||||||
|
type: FieldType.NUMBER,
|
||||||
|
name: "id",
|
||||||
|
visible: true,
|
||||||
|
constraints: {
|
||||||
|
type: "number",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
hiddenField: {
|
||||||
|
type: FieldType.STRING,
|
||||||
|
name: "hiddenField",
|
||||||
|
visible: false,
|
||||||
|
constraints: {
|
||||||
|
type: "string",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
|
@ -253,6 +292,8 @@ describe("/tables", () => {
|
||||||
name: {
|
name: {
|
||||||
type: "string",
|
type: "string",
|
||||||
name: "name",
|
name: "name",
|
||||||
|
visible: true,
|
||||||
|
width: 80,
|
||||||
constraints: {
|
constraints: {
|
||||||
type: "string",
|
type: "string",
|
||||||
},
|
},
|
||||||
|
@ -260,6 +301,24 @@ describe("/tables", () => {
|
||||||
description: {
|
description: {
|
||||||
type: "string",
|
type: "string",
|
||||||
name: "description",
|
name: "description",
|
||||||
|
visible: true,
|
||||||
|
width: 200,
|
||||||
|
constraints: {
|
||||||
|
type: "string",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
id: {
|
||||||
|
type: "number",
|
||||||
|
name: "id",
|
||||||
|
visible: true,
|
||||||
|
constraints: {
|
||||||
|
type: "number",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
hiddenField: {
|
||||||
|
type: "string",
|
||||||
|
name: "hiddenField",
|
||||||
|
visible: false,
|
||||||
constraints: {
|
constraints: {
|
||||||
type: "string",
|
type: "string",
|
||||||
},
|
},
|
||||||
|
@ -273,10 +332,17 @@ describe("/tables", () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
it("should fetch the default schema if not overriden", async () => {
|
it("should fetch the default schema if not overriden", async () => {
|
||||||
const tableId = config.table!._id!
|
const tableId = testTable._id!
|
||||||
const views = [
|
const views = [
|
||||||
await config.api.viewV2.create({ tableId }),
|
await config.api.viewV2.create({ tableId }),
|
||||||
await config.api.viewV2.create({ tableId, columns: ["name"] }),
|
await config.api.viewV2.create({
|
||||||
|
tableId,
|
||||||
|
columns: {
|
||||||
|
name: { visible: true },
|
||||||
|
id: { visible: true },
|
||||||
|
description: { visible: false },
|
||||||
|
},
|
||||||
|
}),
|
||||||
]
|
]
|
||||||
|
|
||||||
const res = await config.api.table.fetch()
|
const res = await config.api.table.fetch()
|
||||||
|
@ -292,6 +358,8 @@ describe("/tables", () => {
|
||||||
name: {
|
name: {
|
||||||
type: "string",
|
type: "string",
|
||||||
name: "name",
|
name: "name",
|
||||||
|
visible: true,
|
||||||
|
width: 80,
|
||||||
constraints: {
|
constraints: {
|
||||||
type: "string",
|
type: "string",
|
||||||
},
|
},
|
||||||
|
@ -299,6 +367,24 @@ describe("/tables", () => {
|
||||||
description: {
|
description: {
|
||||||
type: "string",
|
type: "string",
|
||||||
name: "description",
|
name: "description",
|
||||||
|
visible: true,
|
||||||
|
width: 200,
|
||||||
|
constraints: {
|
||||||
|
type: "string",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
id: {
|
||||||
|
type: "number",
|
||||||
|
name: "id",
|
||||||
|
visible: true,
|
||||||
|
constraints: {
|
||||||
|
type: "number",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
hiddenField: {
|
||||||
|
type: "string",
|
||||||
|
name: "hiddenField",
|
||||||
|
visible: false,
|
||||||
constraints: {
|
constraints: {
|
||||||
type: "string",
|
type: "string",
|
||||||
},
|
},
|
||||||
|
@ -311,10 +397,20 @@ describe("/tables", () => {
|
||||||
name: {
|
name: {
|
||||||
type: "string",
|
type: "string",
|
||||||
name: "name",
|
name: "name",
|
||||||
|
visible: true,
|
||||||
|
width: 80,
|
||||||
constraints: {
|
constraints: {
|
||||||
type: "string",
|
type: "string",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
id: {
|
||||||
|
type: "number",
|
||||||
|
name: "id",
|
||||||
|
visible: true,
|
||||||
|
constraints: {
|
||||||
|
type: "number",
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -327,7 +423,7 @@ describe("/tables", () => {
|
||||||
const tableId = config.table!._id!
|
const tableId = config.table!._id!
|
||||||
const view = await config.api.viewV2.create({
|
const view = await config.api.viewV2.create({
|
||||||
tableId,
|
tableId,
|
||||||
columns: ["unnexisting", "name"],
|
columns: { unnexisting: { visible: true }, name: { visible: true } },
|
||||||
})
|
})
|
||||||
|
|
||||||
const res = await config.api.table.fetch()
|
const res = await config.api.table.fetch()
|
||||||
|
@ -343,6 +439,8 @@ describe("/tables", () => {
|
||||||
name: {
|
name: {
|
||||||
type: "string",
|
type: "string",
|
||||||
name: "name",
|
name: "name",
|
||||||
|
visible: true,
|
||||||
|
width: 80,
|
||||||
constraints: {
|
constraints: {
|
||||||
type: "string",
|
type: "string",
|
||||||
},
|
},
|
||||||
|
|
|
@ -111,75 +111,4 @@ describe("/v2/views", () => {
|
||||||
expect(await getPersistedView()).toBeUndefined()
|
expect(await getPersistedView()).toBeUndefined()
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
// describe("getSchema", () => {
|
|
||||||
// beforeAll(async () => {
|
|
||||||
// await config.createTable(priceTable())
|
|
||||||
// })
|
|
||||||
|
|
||||||
// it("returns table schema if no columns are defined", async () => {
|
|
||||||
// const view = await config.api.viewV2.create()
|
|
||||||
// const result = await config.api.viewV2.getSchema(view.id)
|
|
||||||
// expect(result).toEqual({
|
|
||||||
// schema: {
|
|
||||||
// Price: {
|
|
||||||
// type: "number",
|
|
||||||
// name: "Price",
|
|
||||||
// constraints: {},
|
|
||||||
// },
|
|
||||||
// Currency: {
|
|
||||||
// type: "string",
|
|
||||||
// name: "Currency",
|
|
||||||
// constraints: {},
|
|
||||||
// },
|
|
||||||
// ItemId: {
|
|
||||||
// type: "string",
|
|
||||||
// name: "ItemId",
|
|
||||||
// constraints: {
|
|
||||||
// type: "string",
|
|
||||||
// },
|
|
||||||
// },
|
|
||||||
// },
|
|
||||||
// })
|
|
||||||
// })
|
|
||||||
|
|
||||||
// it("respects view column definition if exists", async () => {
|
|
||||||
// const view = await config.api.viewV2.create({
|
|
||||||
// columns: ["Price", "ItemId"],
|
|
||||||
// })
|
|
||||||
// const result = await config.api.viewV2.getSchema(view.id)
|
|
||||||
// expect(result).toEqual({
|
|
||||||
// schema: {
|
|
||||||
// Price: {
|
|
||||||
// type: "number",
|
|
||||||
// name: "Price",
|
|
||||||
// constraints: {},
|
|
||||||
// },
|
|
||||||
// ItemId: {
|
|
||||||
// type: "string",
|
|
||||||
// name: "ItemId",
|
|
||||||
// constraints: {
|
|
||||||
// type: "string",
|
|
||||||
// },
|
|
||||||
// },
|
|
||||||
// },
|
|
||||||
// })
|
|
||||||
// })
|
|
||||||
|
|
||||||
// it("respects view column definition if exists", async () => {
|
|
||||||
// const view = await config.api.viewV2.create({
|
|
||||||
// columns: ["Price", "innexistingColumn"],
|
|
||||||
// })
|
|
||||||
// const result = await config.api.viewV2.getSchema(view.id)
|
|
||||||
// expect(result).toEqual({
|
|
||||||
// schema: {
|
|
||||||
// Price: {
|
|
||||||
// type: "number",
|
|
||||||
// name: "Price",
|
|
||||||
// constraints: {},
|
|
||||||
// },
|
|
||||||
// },
|
|
||||||
// })
|
|
||||||
// })
|
|
||||||
// })
|
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue