From a3da16c6ef5af162795171cad2bb7c1a9a877768 Mon Sep 17 00:00:00 2001 From: Youssef Awichawi Date: Fri, 2 Feb 2024 14:32:18 +0100 Subject: [PATCH] feat: Migrate preferred queries --- src/composables/CallElasticsearch.ts | 2 +- .../components/home/ClusterHealth.ts | 11 ----- src/db/Idb.ts | 15 ++++++- src/db/indexeddb.ts | 5 +++ src/db/types.ts | 1 + src/main.ts | 14 ++++--- src/services/VuexMigrator.ts | 42 +++++++++++++++---- tests/unit/migration.spec.ts | 15 +++++-- 8 files changed, 72 insertions(+), 33 deletions(-) diff --git a/src/composables/CallElasticsearch.ts b/src/composables/CallElasticsearch.ts index 9dc382ce..818d2449 100644 --- a/src/composables/CallElasticsearch.ts +++ b/src/composables/CallElasticsearch.ts @@ -41,7 +41,7 @@ export function useElasticsearchAdapter () { const cluster = connectionStore.activeCluster if (!cluster) return elasticsearchAdapter = new ElasticsearchAdapter(cluster as ElasticsearchClusterCredentials) - await elasticsearchAdapter.ping() + // await elasticsearchAdapter.ping() } try { diff --git a/src/composables/components/home/ClusterHealth.ts b/src/composables/components/home/ClusterHealth.ts index 5fe94b26..e5d64864 100644 --- a/src/composables/components/home/ClusterHealth.ts +++ b/src/composables/components/home/ClusterHealth.ts @@ -1,13 +1,11 @@ import { ElasticsearchCluster, ElasticsearchClusterCredentials, useConnectionStore } from '../../../store/connection.ts' import ElasticsearchAdapter from '../../../services/ElasticsearchAdapter.ts' -import { clusterUuid } from '../../ClusterConnection.ts' export const useClusterHealth = () => { const connectionStore = useConnectionStore() const setupHealthLoading = () => { if (!connectionStore.activeCluster) return - checkHealth(connectionStore.activeCluster) //setInterval(() => (checkHealth(connectionStore.activeCluster)), 30000) } setupHealthLoading() @@ -28,15 +26,6 @@ export const checkHealth = async (cluster: ElasticsearchCluster) => { const clusterHealthBody = await clusterHealthResponse.json() cluster.status = clusterHealthBody.status - const pingResponse: any = await adapter.ping() - const pingBody = await pingResponse.json() - const version = pingBody.version.number - - cluster.clusterName = pingBody.cluster_name - cluster.version = version - cluster.majorVersion = version[0] - if (!cluster.uuid || cluster.uuid.length === 0) cluster.uuid = clusterUuid(pingBody) - delete cluster.loading } catch (e) { cluster.status = 'unknown' diff --git a/src/db/Idb.ts b/src/db/Idb.ts index fb9b3fa8..2fc2aecf 100644 --- a/src/db/Idb.ts +++ b/src/db/Idb.ts @@ -11,7 +11,7 @@ const dbDefinition = { ] } -const databaseName = (clusterUuid: string) => (`elasticvue-${clusterUuid}`) +const databaseName = (clusterUuid?: string) => (`elasticvue${clusterUuid ? '-' + clusterUuid : ''}`) let db: Db export const useIdb = () => { @@ -25,7 +25,7 @@ export const useIdb = () => { return db } -export const initDb = (clusterUuid: string) => { +export const initDb = (clusterUuid?: string) => { db = new Db({ dbName: databaseName(clusterUuid), ...dbDefinition }) db.connect() db.models.restQueryHistory = new DbModel('restQueryHistory', db) @@ -36,3 +36,14 @@ export const initDb = (clusterUuid: string) => { } export const useIdbStore = () => (useIdb()?.models) +export const useOldIdbStore = async () => { + const instance = new Db({ + dbName: databaseName(), dbVersion: 1, tables: [ + { name: 'rest', indexes: ['date', 'favorite'] } + ] + }); + await instance.connect(); + + instance.models.restQuerySavedQueries = new DbModel('rest', instance) + return instance.models; +} diff --git a/src/db/indexeddb.ts b/src/db/indexeddb.ts index c4dab1d5..14f26f64 100644 --- a/src/db/indexeddb.ts +++ b/src/db/indexeddb.ts @@ -112,6 +112,11 @@ export class DbModel { return this.db._idb.getAll(this.tableName) } + async getAllByCriteria (criteria: IDBKeyRange): Promise { + await this.db.connect() + return this.db._idb.getAll(this.tableName, criteria) + } + async clear () { await this.db.connect() return this.db._idb?.clear(this.tableName) diff --git a/src/db/types.ts b/src/db/types.ts index 954d9ad7..8b7bff35 100644 --- a/src/db/types.ts +++ b/src/db/types.ts @@ -18,6 +18,7 @@ export type IdbRestQuerySavedQuery = { method: string path: string body: string + favorite?: 1 | 0 } export type IdbRestQueryTab = { diff --git a/src/main.ts b/src/main.ts index fc5d893f..e5eca3e5 100644 --- a/src/main.ts +++ b/src/main.ts @@ -10,10 +10,12 @@ import './assets/stylesheets/style.scss' import { migrate } from './services/VuexMigrator.ts' migrate() -const myApp = createApp(App) +.finally(() => { + const myApp = createApp(App) -myApp.use(Quasar, quasarOptions) -myApp.use(pinia) -myApp.use(vueI18n()) -myApp.use(router) -myApp.mount('#app') + myApp.use(Quasar, quasarOptions) + myApp.use(pinia) + myApp.use(vueI18n()) + myApp.use(router) + myApp.mount('#app') +}) diff --git a/src/services/VuexMigrator.ts b/src/services/VuexMigrator.ts index 9de0c876..772633d8 100644 --- a/src/services/VuexMigrator.ts +++ b/src/services/VuexMigrator.ts @@ -1,8 +1,12 @@ -import { ConnectionState } from '../store/connection.ts' +import { ConnectionState, ElasticsearchClusterCredentials, useConnectionStore } from '../store/connection.ts' import { ThemeState } from '../store/theme.ts' import { I18nState } from '../store/i18n.ts' -import { useIdbStore } from '../db/Idb.ts' +import { useIdbStore, useOldIdbStore } from '../db/Idb.ts' import { toRaw } from 'vue' +import ElasticsearchAdapter from './ElasticsearchAdapter.ts' +import { clusterUuid } from '../composables/ClusterConnection.ts' +import { pinia } from '../plugins/pinia.ts' +import { setActivePinia } from 'pinia' type PiniaData = { theme?: ThemeState @@ -10,7 +14,7 @@ type PiniaData = { connection: ConnectionState } -export const migrateVuexData = (data: string): PiniaData => { +export const migrateVuexData = async (data: string): Promise => { const newData = {} as PiniaData const vuex = JSON.parse(data) @@ -18,7 +22,10 @@ export const migrateVuexData = (data: string): PiniaData => { if (vuex.language) newData.language = vuex.language newData.connection = { activeClusterIndex: 0, clusters: [] } - vuex.connection?.instances?.forEach((cluster: any) => { + for (const cluster of (vuex.connection?.instances || [])) { + const esAdapter = new ElasticsearchAdapter(cluster as ElasticsearchClusterCredentials); + const pingBody: any = await esAdapter.ping(); + newData.connection.clusters.push({ name: cluster.name, username: cluster.username, @@ -27,16 +34,17 @@ export const migrateVuexData = (data: string): PiniaData => { clusterName: '', version: cluster.version, majorVersion: cluster.major_version, - uuid: '', + uuid: clusterUuid(await pingBody.json()) || '', status: '' }) - }) + } return newData } const migrateTabs = async () => { const { restQueryTabs } = useIdbStore() + if (!restQueryTabs) return const tabs = await restQueryTabs.getAll() for await (const tab of tabs) { if (!tab.response) { @@ -45,15 +53,31 @@ const migrateTabs = async () => { } } -export const migrate = () => { +const migrateQueries = async () => { + const oldIdbStore = await useOldIdbStore(); + const { restQuerySavedQueries } = useIdbStore(); + const savedQueries = await oldIdbStore.restQuerySavedQueries.getAll() + + for await (const savedQuery of savedQueries) { + if (savedQuery.favorite === 1) { + await restQuerySavedQueries.update(savedQuery) + } + } +} + +export const migrate = async () => { if (localStorage.getItem('connection')) return const elasticvuex = localStorage.getItem('elasticvuex') if (!elasticvuex) return - const migrated = migrateVuexData(elasticvuex) + const store = useConnectionStore(setActivePinia(pinia)); + const migrated = await migrateVuexData(elasticvuex) Object.entries(migrated).forEach(([key, value]) => { localStorage.setItem(key, JSON.stringify(value)) }) - migrateTabs() + store.$patch(migrated.connection); + + await migrateTabs() + await migrateQueries() } diff --git a/tests/unit/migration.spec.ts b/tests/unit/migration.spec.ts index f51d0584..a4848cb8 100644 --- a/tests/unit/migration.spec.ts +++ b/tests/unit/migration.spec.ts @@ -1,5 +1,6 @@ -import { describe, it } from 'vitest' +import { describe, it, vi } from 'vitest' import { migrateVuexData } from '../../src/services/VuexMigrator' +import ElasticsearchAdapter from '../../src/services/ElasticsearchAdapter' const vuexData = { 'connection': { @@ -35,7 +36,7 @@ const newData = { 'clusterName': '', 'version': '6.8.2', 'majorVersion': '6', - 'uuid': '', + 'uuid': 'D_qHru2wRbSM6kZwsP853Q', 'status': '' }, { @@ -46,7 +47,7 @@ const newData = { 'clusterName': '', 'version': '8.7.1', 'majorVersion': '8', - 'uuid': '', + 'uuid': 'D_qHru2wRbSM6kZwsP853Q', 'status': '' }], 'activeClusterIndex': 0 @@ -61,7 +62,13 @@ const newData = { describe.concurrent('migrate vuex', () => { it('migrate', async ({ expect }) => { + // Given const data = JSON.stringify(vuexData) - expect(migrateVuexData(data)).toEqual(newData) + + // When + vi.spyOn(ElasticsearchAdapter.prototype, 'ping').mockResolvedValue({ json: () => ({ cluster_uuid: 'D_qHru2wRbSM6kZwsP853Q' }) }); + + // Then + expect(migrateVuexData(data)).resolves.toStrictEqual(newData) }) })