103 lines
2.7 KiB
JavaScript
103 lines
2.7 KiB
JavaScript
import { writable, get } from "svelte/store"
|
|
import { queries, tables, views } from "./"
|
|
import { API } from "api"
|
|
|
|
export const INITIAL_DATASOURCE_VALUES = {
|
|
list: [],
|
|
selected: null,
|
|
schemaError: null,
|
|
}
|
|
|
|
export function createDatasourcesStore() {
|
|
const store = writable(INITIAL_DATASOURCE_VALUES)
|
|
const { subscribe, update, set } = store
|
|
|
|
async function updateDatasource(response) {
|
|
const { datasource, error } = response
|
|
update(state => {
|
|
const currentIdx = state.list.findIndex(ds => ds._id === datasource._id)
|
|
const sources = state.list
|
|
if (currentIdx >= 0) {
|
|
sources.splice(currentIdx, 1, datasource)
|
|
} else {
|
|
sources.push(datasource)
|
|
}
|
|
return {
|
|
list: sources,
|
|
selected: datasource._id,
|
|
schemaError: error,
|
|
}
|
|
})
|
|
return datasource
|
|
}
|
|
|
|
return {
|
|
subscribe,
|
|
update,
|
|
init: async () => {
|
|
const datasources = await API.getDatasources()
|
|
set({
|
|
list: datasources,
|
|
selected: null,
|
|
})
|
|
},
|
|
fetch: async () => {
|
|
const datasources = await API.getDatasources()
|
|
|
|
// Clear selected if it no longer exists, otherwise keep it
|
|
const selected = get(store).selected
|
|
let nextSelected = null
|
|
if (selected && datasources.find(source => source._id === selected)) {
|
|
nextSelected = selected
|
|
}
|
|
|
|
update(state => ({ ...state, list: datasources, selected: nextSelected }))
|
|
},
|
|
select: datasourceId => {
|
|
update(state => ({ ...state, selected: datasourceId }))
|
|
queries.unselect()
|
|
tables.unselect()
|
|
views.unselect()
|
|
},
|
|
unselect: () => {
|
|
update(state => ({ ...state, selected: null }))
|
|
},
|
|
updateSchema: async datasource => {
|
|
const response = await API.buildDatasourceSchema(datasource?._id)
|
|
return await updateDatasource(response)
|
|
},
|
|
save: async (body, fetchSchema = false) => {
|
|
let response
|
|
if (body._id) {
|
|
response = await API.updateDatasource(body)
|
|
} else {
|
|
response = await API.createDatasource({
|
|
datasource: body,
|
|
fetchSchema,
|
|
})
|
|
}
|
|
return updateDatasource(response)
|
|
},
|
|
delete: async datasource => {
|
|
await API.deleteDatasource({
|
|
datasourceId: datasource?._id,
|
|
datasourceRev: datasource?._rev,
|
|
})
|
|
update(state => {
|
|
const sources = state.list.filter(
|
|
existing => existing._id !== datasource._id
|
|
)
|
|
return { list: sources, selected: null }
|
|
})
|
|
await queries.fetch()
|
|
},
|
|
removeSchemaError: () => {
|
|
update(state => {
|
|
return { ...state, schemaError: null }
|
|
})
|
|
},
|
|
}
|
|
}
|
|
|
|
export const datasources = createDatasourcesStore()
|