budibase/packages/builder/src/stores/backend/queries.js

81 lines
2.3 KiB
JavaScript

import { writable, get } from "svelte/store"
import { datasources, integrations } from "./"
import api from "builderStore/api"
export function createQueriesStore() {
const { subscribe, set, update } = writable({ list: [], selected: null })
return {
subscribe,
set,
update,
init: async () => {
const response = await api.get(`/api/queries`)
const json = await response.json()
set({ list: json, selected: null })
},
fetch: async () => {
const response = await api.get(`/api/queries`)
const json = await response.json()
update(state => ({ ...state, list: json }))
return json
},
save: async (datasourceId, query) => {
const _integrations = get(integrations)
const dataSource = get(datasources).list.filter(
ds => ds._id === datasourceId
)
// check if readable attribute is found
if (dataSource.length !== 0) {
const integration = _integrations[dataSource[0].source]
const readable = integration.query[query.queryVerb].readable
if (readable) {
query.readable = readable
}
}
query.datasourceId = datasourceId
const response = await api.post(`/api/queries`, query)
if (response.status !== 200) {
throw new Error("Failed saving query.")
}
const json = await response.json()
update(state => {
const currentIdx = state.list.findIndex(query => query._id === json._id)
const queries = state.list
if (currentIdx >= 0) {
queries.splice(currentIdx, 1, json)
} else {
queries.push(json)
}
return { list: queries, selected: json._id }
})
return json
},
select: query => {
update(state => ({ ...state, selected: query._id }))
datasources.update(state => ({
...state,
selected: query.datasourceId,
}))
},
delete: async query => {
const response = await api.delete(
`/api/queries/${query._id}/${query._rev}`
)
update(state => {
state.list = state.list.filter(existing => existing._id !== query._id)
if (state.selected === query._id) {
state.selected = null
}
return state
})
return response
},
}
}
export const queries = createQueriesStore()