Skip to content
Snippets Groups Projects
Select Git revision
  • 2bde349787f6d612f8ae3ef7b2113f727dd41c0a
  • master default
2 results

main.cpp

Blame
  • mainStore.ts 4.00 KiB
    import {defineStore} from 'pinia'
    import {DBMetaInfoResponse, keepAlive, KeepAliveResponse, TableIdentifier, useAPI} from "@/services/api";
    import {computed, Ref, ref, shallowReactive} from "vue";
    
    export type APIStatus = "connecting" | "disconnected" | KeepAliveResponse
    
    export const useMainStore = defineStore('main', () => {
      const sessionId = ref(null as string)
      const dbUrl = ref(null as string)
      const originalDBSchema = ref(null as DBMetaInfoResponse)
      const virtualDBSchema = ref(null as DBMetaInfoResponse)
      const dbSchemas = shallowReactive({"original": originalDBSchema, "virtual": virtualDBSchema} as {
        [source: string]: Ref<DBMetaInfoResponse>
      })
    
      const api = useAPI()
    
      const apiStatus = ref<APIStatus>("connecting")
      testAPI() // ASYNC call!
    
      const sessionCreated = computed(() => sessionId.value != null)
      const sessionReady = computed(() => sessionCreated.value && (dbUrl.value != null))
      const schemaReady = computed(() => sessionReady.value && (originalDBSchema.value != null))
    
      async function testAPI() {
        if (apiStatus.value === "disconnected")
          apiStatus.value = "connecting"
        const r = await keepAlive()
        if (r?.data) {
          if (r.data.session_status !== "session valid") reset()
          apiStatus.value = r.data
        } else {
          reset()
          apiStatus.value = "disconnected"
        }
        return apiStatus.value
      }
    
      function reset() {
        sessionId.value = null
        dbUrl.value = null
        originalDBSchema.value = null
        virtualDBSchema.value = null
      }
    
      async function startSession() {
        const r = await api.startSession()
        if (r) {
          sessionId.value = r.data.session_id
          return true
        } else return false
      }
    
      async function stopSession() {
        await api.stopSession().finally(reset);
      }
    
      async function testDBConn() {
        const r = await api.testDBConn()
        if (r?.data?.db_url)
          dbUrl.value = r.data.db_url
        else
          dbUrl.value = null
      }
    
      async function retrieveAndStoreDBInfo() {
        const [r1, r2] = await Promise.all([api.testDBConn(), api.getDBSchema()]) //.then(res => this.dbUrl = res.data.db_url), api.getDBSchema()
        if (r1?.data)
          dbUrl.value = r1.data.db_url
        if (r2?.data)
          originalDBSchema.value = r2.data
      }
    
      function clearDBInfos() {
        originalDBSchema.value = null
        virtualDBSchema.value = null
      }
    
      async function reloadVirtualDB() {
        await retrieveAndStoreVirtualDBInfo()
      }
    
      function getCachedTableMeta(tableIdentifier: TableIdentifier) {
        if (!!tableIdentifier) {
          const tablesInSchema = dbSchemas[tableIdentifier.source]?.value?.db_structure[tableIdentifier.schema]
          return tablesInSchema?.[tableIdentifier.name]
        }
      }
    
      async function retrieveAndStoreVirtualDBInfo() {
        const r = await api.getDBSchema({source: 'virtual'});
    
        if (r?.data) {
          virtualDBSchema.value = r.data
        }
      }
    
      async function getTableMeta(tableIdentifier: TableIdentifier, useCache = false) {
        if (!!tableIdentifier) {
          const r = await api.getTableSchema({
            source: tableIdentifier.source,
            schema: tableIdentifier.schema,
            table: tableIdentifier.name
          })
          return r?.data
        }
      }
    
      async function getTableProbe(tableIdentifier: TableIdentifier) {
        if (!!tableIdentifier) {
          const r = await api.probeTable({
            source: tableIdentifier.source,
            schema: tableIdentifier.schema,
            table: tableIdentifier.name
          })
          return r?.data
        }
      }
    
      function $reset() {
        reset()
      }
    
      return {
        sessionId,
        originalDBSchema,
        virtualDBSchema,
        dbSchemas,
        dbUrl,
        apiStatus,
        sessionReady,
        sessionCreated,
        schemaReady,
        testAPI,
        startSession,
        stopSession,
        retrieveAndStoreDBInfo,
        testDBConn,
        retrieveAndStoreVirtualDBInfo,
        clearDBInfos,
        reloadVirtualDB,
        getTableProbe,
        getCachedTableMeta,
        getTableMeta,
        $reset
      }
    }, {persist: {pick: ['sessionId', 'dbUrl', 'originalDBSchema', 'virtualDBSchema']}})
    // {enabled: true, strategies: [{storage: localStorage, paths: ['sessionId', 'dbUrl']}]}