useConfigDrawer.ts 2.24 KB
import { computed, ref, shallowRef } from 'vue'

import type { ConfigValues } from '@/types'
import { fetchJson, postJson } from '@/utils/http'

interface ConfigPayload {
  success: boolean
  config: ConfigValues
}

const CONFIG_GROUPS: Array<{ title: string; keys: string[] }> = [
  {
    title: '数据库',
    keys: ['DB_DIALECT', 'DB_HOST', 'DB_PORT', 'DB_USER', 'DB_PASSWORD', 'DB_NAME', 'DB_CHARSET'],
  },
  {
    title: 'Insight / Media / Query',
    keys: [
      'INSIGHT_ENGINE_API_KEY',
      'INSIGHT_ENGINE_BASE_URL',
      'INSIGHT_ENGINE_MODEL_NAME',
      'MEDIA_ENGINE_API_KEY',
      'MEDIA_ENGINE_BASE_URL',
      'MEDIA_ENGINE_MODEL_NAME',
      'QUERY_ENGINE_API_KEY',
      'QUERY_ENGINE_BASE_URL',
      'QUERY_ENGINE_MODEL_NAME',
    ],
  },
  {
    title: 'Report / Forum / Optimizer',
    keys: [
      'REPORT_ENGINE_API_KEY',
      'REPORT_ENGINE_BASE_URL',
      'REPORT_ENGINE_MODEL_NAME',
      'FORUM_HOST_API_KEY',
      'FORUM_HOST_BASE_URL',
      'FORUM_HOST_MODEL_NAME',
      'KEYWORD_OPTIMIZER_API_KEY',
      'KEYWORD_OPTIMIZER_BASE_URL',
      'KEYWORD_OPTIMIZER_MODEL_NAME',
    ],
  },
  {
    title: '搜索与网络',
    keys: ['SEARCH_TOOL_TYPE', 'TAVILY_API_KEY', 'BOCHA_WEB_SEARCH_API_KEY', 'ANSPIRE_API_KEY'],
  },
]

export function useConfigDrawer() {
  const loading = shallowRef(false)
  const saving = shallowRef(false)
  const values = ref<ConfigValues>({})

  const groups = computed(() => (
    CONFIG_GROUPS.map((group) => ({
      title: group.title,
      fields: group.keys.map((key) => ({
        key,
        label: key,
        type: key.includes('KEY') || key.includes('PASSWORD') ? 'password' : 'text',
        value: values.value[key] ?? '',
      })),
    }))
  ))

  async function loadConfig() {
    loading.value = true
    try {
      const payload = await fetchJson<ConfigPayload>('/api/config')
      values.value = payload.config
    } finally {
      loading.value = false
    }
  }

  async function saveConfig() {
    saving.value = true
    try {
      const payload = await postJson<ConfigPayload>('/api/config', values.value)
      values.value = payload.config
    } finally {
      saving.value = false
    }
  }

  return {
    loading,
    saving,
    values,
    groups,
    loadConfig,
    saveConfig,
  }
}