81 lines
2.3 KiB
JavaScript
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()
|