"use client"; import React, { useState, useEffect } from "react"; import { ChartDataSource } from "@/components/admin/dashboard/types"; import { Button } from "@/components/ui/button"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Loader2, CheckCircle, XCircle } from "lucide-react"; interface MultiDatabaseConfigProps { dataSource: ChartDataSource; onChange: (updates: Partial) => void; } interface ExternalConnection { id: string; name: string; type: string; } export default function MultiDatabaseConfig({ dataSource, onChange }: MultiDatabaseConfigProps) { const [testing, setTesting] = useState(false); const [testResult, setTestResult] = useState<{ success: boolean; message: string; rowCount?: number } | null>(null); const [externalConnections, setExternalConnections] = useState([]); const [loadingConnections, setLoadingConnections] = useState(false); // 외부 DB 커넥션 목록 로드 useEffect(() => { if (dataSource.connectionType === "external") { loadExternalConnections(); } }, [dataSource.connectionType]); const loadExternalConnections = async () => { setLoadingConnections(true); try { const response = await fetch("/api/admin/reports/external-connections", { credentials: "include", }); if (response.ok) { const result = await response.json(); if (result.success && result.data) { const connections = Array.isArray(result.data) ? result.data : result.data.data || []; setExternalConnections(connections); } } } catch (error) { console.error("외부 DB 커넥션 로드 실패:", error); } finally { setLoadingConnections(false); } }; // 쿼리 테스트 const handleTestQuery = async () => { if (!dataSource.query) { setTestResult({ success: false, message: "SQL 쿼리를 입력해주세요" }); return; } setTesting(true); setTestResult(null); try { // dashboardApi 사용 (인증 토큰 자동 포함) const { dashboardApi } = await import("@/lib/api/dashboard"); if (dataSource.connectionType === "external" && dataSource.externalConnectionId) { // 외부 DB const { ExternalDbConnectionAPI } = await import("@/lib/api/externalDbConnection"); const result = await ExternalDbConnectionAPI.executeQuery( parseInt(dataSource.externalConnectionId), dataSource.query ); if (result.success && result.data) { const rowCount = Array.isArray(result.data.rows) ? result.data.rows.length : 0; setTestResult({ success: true, message: "쿼리 실행 성공", rowCount, }); } else { setTestResult({ success: false, message: result.message || "쿼리 실행 실패" }); } } else { // 현재 DB const result = await dashboardApi.executeQuery(dataSource.query); setTestResult({ success: true, message: "쿼리 실행 성공", rowCount: result.rowCount || 0, }); } } catch (error: any) { setTestResult({ success: false, message: error.message || "네트워크 오류" }); } finally { setTesting(false); } }; return (
Database 설정
{/* 커넥션 타입 */}
onChange({ connectionType: value }) } >
{/* 외부 DB 선택 */} {dataSource.connectionType === "external" && (
{loadingConnections ? (
) : ( )}
)} {/* SQL 쿼리 */}