jeongsoo's picture
add function
460bd69
/**
* RAG 검색 챗봇 λ¬Έμ„œ 관리 JavaScript
*/
// DOM μš”μ†Œ 미리 μ„ μ–Έ
let uploadForm, documentFile, fileName, uploadButton, uploadStatus;
let refreshDocsButton, docsList, docsLoading, noDocsMessage;
/**
* λ¬Έμ„œ 관리 DOM μš”μ†Œ μ΄ˆκΈ°ν™”
*/
function initDocsElements() {
console.log('λ¬Έμ„œ 관리 DOM μš”μ†Œ μ΄ˆκΈ°ν™” 쀑...');
uploadForm = document.getElementById('uploadForm');
documentFile = document.getElementById('documentFile');
fileName = document.getElementById('fileName');
uploadButton = document.getElementById('uploadButton');
uploadStatus = document.getElementById('uploadStatus');
refreshDocsButton = document.getElementById('refreshDocsButton');
docsList = document.getElementById('docsList');
docsLoading = document.getElementById('docsLoading');
noDocsMessage = document.getElementById('noDocsMessage');
console.log('λ¬Έμ„œ 관리 DOM μš”μ†Œ μ΄ˆκΈ°ν™” μ™„λ£Œ');
// λ¬Έμ„œ 관리 이벀트 λ¦¬μŠ€λ„ˆ μ΄ˆκΈ°ν™”
initDocsEventListeners();
}
/**
* λ¬Έμ„œ 관리 이벀트 λ¦¬μŠ€λ„ˆ μ΄ˆκΈ°ν™”
*/
function initDocsEventListeners() {
console.log('λ¬Έμ„œ 관리 이벀트 λ¦¬μŠ€λ„ˆ μ΄ˆκΈ°ν™” 쀑...');
// λ¬Έμ„œ μ—…λ‘œλ“œ 이벀트 λ¦¬μŠ€λ„ˆ
documentFile.addEventListener('change', (event) => {
if (event.target.files.length > 0) {
fileName.textContent = event.target.files[0].name;
console.log(`파일 선택됨: ${event.target.files[0].name}`);
} else {
fileName.textContent = 'μ„ νƒλœ 파일 μ—†μŒ';
console.log('파일 선택 μ·¨μ†Œλ¨');
}
});
uploadForm.addEventListener('submit', (event) => {
event.preventDefault();
console.log('μ—…λ‘œλ“œ 폼 제좜됨');
uploadDocument();
});
// λ¬Έμ„œ λͺ©λ‘ μƒˆλ‘œκ³ μΉ¨ 이벀트 λ¦¬μŠ€λ„ˆ
refreshDocsButton.addEventListener('click', () => {
console.log('λ¬Έμ„œ λͺ©λ‘ μƒˆλ‘œκ³ μΉ¨ μš”μ²­');
loadDocuments();
});
console.log('λ¬Έμ„œ 관리 이벀트 λ¦¬μŠ€λ„ˆ μ΄ˆκΈ°ν™” μ™„λ£Œ');
}
/**
* λ¬Έμ„œ μ—…λ‘œλ“œ ν•¨μˆ˜
*/
async function uploadDocument() {
if (documentFile.files.length === 0) {
console.log('μ—…λ‘œλ“œν•  파일이 μ„ νƒλ˜μ§€ μ•ŠμŒ');
alert('νŒŒμΌμ„ 선택해 μ£Όμ„Έμš”.');
return;
}
console.log(`파일 μ—…λ‘œλ“œ μ‹œμž‘: ${documentFile.files[0].name}`);
// UI μ—…λ°μ΄νŠΈ
uploadStatus.classList.remove('hidden');
uploadStatus.className = 'upload-status';
uploadStatus.innerHTML = '<div class="spinner"></div><p>μ—…λ‘œλ“œ 쀑...</p>';
uploadButton.disabled = true;
try {
const formData = new FormData();
formData.append('document', documentFile.files[0]);
console.log('λ¬Έμ„œ μ—…λ‘œλ“œ API μš”μ²­ 전솑');
// API μš”μ²­
const response = await fetch('/api/upload', {
method: 'POST',
body: formData
});
const data = await response.json();
console.log('λ¬Έμ„œ μ—…λ‘œλ“œ API 응닡 μˆ˜μ‹ ');
// 응닡 처리
if (data.error) {
console.error('μ—…λ‘œλ“œ 였λ₯˜:', data.error);
uploadStatus.className = 'upload-status error';
uploadStatus.textContent = `였λ₯˜: ${data.error}`;
} else if (data.warning) {
console.warn('μ—…λ‘œλ“œ κ²½κ³ :', data.message);
uploadStatus.className = 'upload-status warning';
uploadStatus.textContent = data.message;
} else {
console.log('μ—…λ‘œλ“œ 성곡:', data.message);
uploadStatus.className = 'upload-status success';
uploadStatus.textContent = data.message;
// λ¬Έμ„œ λͺ©λ‘ μƒˆλ‘œκ³ μΉ¨
loadDocuments();
// μž…λ ₯ ν•„λ“œ μ΄ˆκΈ°ν™”
documentFile.value = '';
fileName.textContent = 'μ„ νƒλœ 파일 μ—†μŒ';
}
} catch (error) {
console.error('μ—…λ‘œλ“œ 처리 쀑 였λ₯˜:', error);
uploadStatus.className = 'upload-status error';
uploadStatus.textContent = 'μ—…λ‘œλ“œ 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. λ‹€μ‹œ μ‹œλ„ν•΄ μ£Όμ„Έμš”.';
} finally {
uploadButton.disabled = false;
}
}
/**
* λ¬Έμ„œ λͺ©λ‘ λ‘œλ“œ ν•¨μˆ˜
*/
async function loadDocuments() {
console.log('λ¬Έμ„œ λͺ©λ‘ λ‘œλ“œ μ‹œμž‘');
// UI μ—…λ°μ΄νŠΈ
docsList.querySelector('tbody').innerHTML = '';
docsLoading.classList.remove('hidden');
noDocsMessage.classList.add('hidden');
try {
console.log('λ¬Έμ„œ λͺ©λ‘ API μš”μ²­ 전솑');
// API μš”μ²­
const response = await fetch('/api/documents');
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
console.log(`λ¬Έμ„œ λͺ©λ‘ API 응닡 μˆ˜μ‹ : ${data.documents ? data.documents.length : 0}개 λ¬Έμ„œ`);
// 응닡 처리
docsLoading.classList.add('hidden');
if (!data.documents || data.documents.length === 0) {
console.log('λ‘œλ“œλœ λ¬Έμ„œκ°€ μ—†μŒ');
noDocsMessage.classList.remove('hidden');
return;
}
// λ¬Έμ„œ λͺ©λ‘ μ—…λ°μ΄νŠΈ
const tbody = docsList.querySelector('tbody');
data.documents.forEach(doc => {
console.log(`λ¬Έμ„œ ν‘œμ‹œ: ${doc.filename || doc.source}`);
const row = document.createElement('tr');
const fileNameCell = document.createElement('td');
fileNameCell.textContent = doc.filename || doc.source;
row.appendChild(fileNameCell);
const chunksCell = document.createElement('td');
chunksCell.textContent = doc.chunks;
row.appendChild(chunksCell);
const typeCell = document.createElement('td');
typeCell.textContent = doc.filetype || '-';
row.appendChild(typeCell);
tbody.appendChild(row);
});
console.log('λ¬Έμ„œ λͺ©λ‘ μ—…λ°μ΄νŠΈ μ™„λ£Œ');
} catch (error) {
console.error('λ¬Έμ„œ λͺ©λ‘ λ‘œλ“œ 였λ₯˜:', error);
docsLoading.classList.add('hidden');
noDocsMessage.classList.remove('hidden');
noDocsMessage.querySelector('p').textContent = 'λ¬Έμ„œ λͺ©λ‘μ„ λΆˆλŸ¬μ˜€λŠ” 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.';
}
}
// νŽ˜μ΄μ§€ λ‘œλ“œ μ‹œ λͺ¨λ“ˆ μ΄ˆκΈ°ν™”
document.addEventListener('DOMContentLoaded', function() {
console.log('λ¬Έμ„œ 관리 λͺ¨λ“ˆ μ΄ˆκΈ°ν™”');
// λΉ„λ™κΈ°μ μœΌλ‘œ μ΄ˆκΈ°ν™” (DOM μš”μ†Œκ°€ μ€€λΉ„λœ ν›„)
setTimeout(() => {
initDocsElements();
}, 100);
});