2021-12-17 09:22:04 +01:00
|
|
|
import TableFetch from "./fetch/TableFetch.js"
|
|
|
|
import ViewFetch from "./fetch/ViewFetch.js"
|
|
|
|
import QueryFetch from "./fetch/QueryFetch.js"
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Fetches the schema of any kind of datasource.
|
|
|
|
*/
|
|
|
|
export const fetchDatasourceSchema = async datasource => {
|
|
|
|
const type = datasource?.type
|
|
|
|
|
|
|
|
// Nested providers should already have exposed their own schema
|
|
|
|
if (type === "provider") {
|
|
|
|
return datasource.value?.schema
|
|
|
|
}
|
|
|
|
|
|
|
|
// Field sources have their schema statically defined
|
|
|
|
if (type === "field") {
|
|
|
|
if (datasource.fieldType === "attachment") {
|
|
|
|
return {
|
|
|
|
url: {
|
|
|
|
type: "string",
|
|
|
|
},
|
|
|
|
name: {
|
|
|
|
type: "string",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
} else if (datasource.fieldType === "array") {
|
|
|
|
return {
|
|
|
|
value: {
|
|
|
|
type: "string",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// All normal datasource schema can use their corresponsing implementations
|
|
|
|
// in the data fetch classes
|
2021-12-17 19:39:48 +01:00
|
|
|
const handler = {
|
|
|
|
table: TableFetch,
|
|
|
|
link: TableFetch,
|
|
|
|
view: ViewFetch,
|
|
|
|
query: QueryFetch,
|
|
|
|
}[type]
|
|
|
|
if (handler) {
|
|
|
|
const definition = await handler.getDefinition(datasource)
|
|
|
|
return handler.getSchema(datasource, definition)
|
2021-12-17 09:22:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return null
|
|
|
|
}
|