"use client";
import React, { useState, useEffect } from "react";
export interface RSSFeedInfo {
name: string;
type: "naver" | "generic";
url?: string;
blogId?: string;
itemCount?: number;
lastUpdated?: Date;
}
export interface RSSManagerProps {
ragEngine?: any;
onFeedAdded?: (feedInfo: RSSFeedInfo) => void;
onFeedRemoved?: (feedName: string) => void;
onFeedRefreshed?: (feedName: string, itemCount: number) => void;
}
// RSS 통합 관리 컴포넌트
export function RSSManager({
ragEngine,
onFeedAdded,
onFeedRemoved,
onFeedRefreshed,
}: RSSManagerProps) {
// 탭 상태 관리
const [activeRSSTab, setActiveRSSTab] = useState("manual");
const rssTabs = [
{ id: "manual", label: "수동 학습", icon: "📖" },
{ id: "auto", label: "자동화 관리", icon: "🤖" },
];
return (
{/* RSS 서브 탭 */}
{activeRSSTab === "manual" &&
}
{activeRSSTab === "auto" &&
}
);
}
// 수동 RSS 학습 컴포넌트
function ManualRSSManager() {
const [rssUrl, setRssUrl] = useState("");
const [rssFeeds, setRssFeeds] = useState([]);
const [loading, setLoading] = useState(false);
const [processing, setProcessing] = useState(false);
const [savedFeeds, setSavedFeeds] = useState([]);
// 저장된 RSS 피드 목록 로드
useEffect(() => {
const saved = localStorage.getItem("naverRssFeeds");
if (saved) {
setSavedFeeds(JSON.parse(saved));
}
}, []);
// RSS 피드 가져오기
const fetchRSSFeed = async () => {
if (!rssUrl.trim()) return;
try {
setLoading(true);
setRssFeeds([]);
const response = await fetch("/api/rag/rss", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ url: rssUrl }),
});
const data = await response.json();
if (data.success) {
setRssFeeds(data.items || []);
} else {
console.error("RSS 피드 가져오기 실패:", data.error);
alert("RSS 피드를 가져오는데 실패했습니다: " + data.error);
}
} catch (error) {
console.error("RSS 피드 가져오기 중 오류:", error);
alert("네트워크 오류가 발생했습니다.");
} finally {
setLoading(false);
}
};
// RSS 피드를 RAG 시스템에 학습
const processRSSFeed = async (items: any[]) => {
if (items.length === 0) return;
try {
setProcessing(true);
const response = await fetch("/api/rag/rss/process", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ items }),
});
const data = await response.json();
if (data.success) {
alert(
`${data.processedCount}개의 RSS 아이템이 성공적으로 학습되었습니다.`
);
// RSS URL을 저장된 목록에 추가
if (!savedFeeds.includes(rssUrl)) {
const newSavedFeeds = [...savedFeeds, rssUrl];
setSavedFeeds(newSavedFeeds);
localStorage.setItem("naverRssFeeds", JSON.stringify(newSavedFeeds));
}
} else {
console.error("RSS 학습 실패:", data.error);
alert("RSS 학습에 실패했습니다: " + data.error);
}
} catch (error) {
console.error("RSS 학습 중 오류:", error);
alert("네트워크 오류가 발생했습니다.");
} finally {
setProcessing(false);
}
};
// 저장된 RSS 피드 삭제
const removeSavedFeed = (feedUrl: string) => {
const newSavedFeeds = savedFeeds.filter((url) => url !== feedUrl);
setSavedFeeds(newSavedFeeds);
localStorage.setItem("naverRssFeeds", JSON.stringify(newSavedFeeds));
};
return (
{/* RSS URL 입력 */}
📖
RSS 피드 수동 학습
네이버 블로그 RSS 피드를 직접 가져와서 RAG 시스템에 즉시 학습시킵니다.
{/* 네이버 블로그 RSS 예제 */}
네이버 블로그 RSS 예제:
https://rss.blog.naver.com/{"{블로그아이디}"}
예: https://rss.blog.naver.com/myblog123
{/* 저장된 RSS 피드 목록 */}
{savedFeeds.length > 0 && (
저장된 RSS 피드
{savedFeeds.map((feedUrl, index) => (
{feedUrl}
))}
)}
{/* RSS 피드 결과 */}
{rssFeeds.length > 0 && (
RSS 피드 결과 ({rssFeeds.length}개 아이템)
{rssFeeds.map((item, index) => (
{item.title}
{item.description}
발행일: {new Date(item.pubDate).toLocaleString("ko-KR")}
원문 보기
))}
)}
);
}
// 자동 RSS 관리 컴포넌트
function AutoRSSManager() {
const [registeredUrls, setRegisteredUrls] = useState([]);
const [newUrl, setNewUrl] = useState("");
const [loading, setLoading] = useState(false);
const [updating, setUpdating] = useState(false);
const [message, setMessage] = useState("");
const [updateResults, setUpdateResults] = useState([]);
// 등록된 RSS URL 목록 로드
const loadRegisteredUrls = async () => {
try {
setLoading(true);
const response = await fetch("/api/rag/rss/auto-update");
const data = await response.json();
if (data.success) {
setRegisteredUrls(data.urls);
} else {
console.error("RSS URL 목록 로드 실패:", data.error);
setMessage("RSS URL 목록을 불러오는데 실패했습니다.");
}
} catch (error) {
console.error("RSS URL 목록 로드 중 오류:", error);
setMessage("네트워크 오류가 발생했습니다.");
} finally {
setLoading(false);
}
};
// RSS URL 등록
const registerUrl = async () => {
if (!newUrl.trim()) {
setMessage("RSS URL을 입력해주세요.");
return;
}
try {
setLoading(true);
setMessage("");
const response = await fetch("/api/rag/rss/auto-update", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ action: "register", url: newUrl.trim() }),
});
const data = await response.json();
if (data.success) {
setRegisteredUrls(data.urls);
setNewUrl("");
setMessage("RSS URL이 자동 업데이트 목록에 등록되었습니다!");
setTimeout(() => setMessage(""), 3000);
} else {
setMessage("RSS URL 등록에 실패했습니다: " + data.error);
}
} catch (error) {
console.error("RSS URL 등록 중 오류:", error);
setMessage("네트워크 오류가 발생했습니다.");
} finally {
setLoading(false);
}
};
// RSS URL 등록 해제
const unregisterUrl = async (url: string) => {
if (
!confirm(`이 RSS URL을 자동 업데이트 목록에서 제거하시겠습니까?\n${url}`)
) {
return;
}
try {
setLoading(true);
setMessage("");
const response = await fetch("/api/rag/rss/auto-update", {
method: "DELETE",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ url }),
});
const data = await response.json();
if (data.success) {
setRegisteredUrls(data.urls);
setMessage("RSS URL이 자동 업데이트 목록에서 제거되었습니다!");
setTimeout(() => setMessage(""), 3000);
} else {
setMessage("RSS URL 제거에 실패했습니다: " + data.error);
}
} catch (error) {
console.error("RSS URL 제거 중 오류:", error);
setMessage("네트워크 오류가 발생했습니다.");
} finally {
setLoading(false);
}
};
// 수동 업데이트 실행
const runManualUpdate = async () => {
if (registeredUrls.length === 0) {
setMessage("등록된 RSS URL이 없습니다.");
return;
}
if (!confirm("등록된 모든 RSS를 지금 업데이트하시겠습니까?")) {
return;
}
try {
setUpdating(true);
setMessage("");
setUpdateResults([]);
const response = await fetch("/api/rag/rss/auto-update", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ action: "update-all" }),
});
const data = await response.json();
if (data.success) {
setUpdateResults(data.results);
setMessage(
`RSS 업데이트 완료: ${data.summary.success}/${data.summary.total} 성공`
);
} else {
setMessage("RSS 업데이트에 실패했습니다: " + data.error);
}
} catch (error) {
console.error("RSS 업데이트 중 오류:", error);
setMessage("네트워크 오류가 발생했습니다.");
} finally {
setUpdating(false);
}
};
// 컴포넌트 마운트 시 등록된 URL 목록 로드
useEffect(() => {
loadRegisteredUrls();
}, []);
return (
{/* 메시지 표시 */}
{message && (
{message}
)}
{/* 자동 업데이트 설명 */}
📅 자동 업데이트 스케줄
등록된 RSS 피드는 매일 새벽 1시에 자동으로 최신 내용을 학습합니다.
수동으로 즉시 업데이트하려면 아래 "지금 업데이트" 버튼을 사용하세요.
{/* RSS URL 등록 */}
{/* 등록된 RSS URL 목록 */}
등록된 RSS 목록
{registeredUrls.length === 0 ? (
등록된 RSS URL이 없습니다.
) : (
{registeredUrls.map((url, index) => (
))}
)}
{/* 업데이트 결과 */}
{updateResults.length > 0 && (
최근 업데이트 결과
{updateResults.map((result, index) => (
{result.url}
{result.success ? "✅ 성공" : "❌ 실패"}
{result.success ? result.message : result.error}
))}
)}
);
}