import { api } from '../api.js'; import { escapeHtml, showAlert, hideAlert } from '../utils.js'; export async function initDatabase() { const tenantsTbody = document.getElementById('tenants-tbody'); const addTenantForm = document.getElementById('add-tenant-form'); const statusInfo = document.getElementById('db-status-info'); const btnTest = document.getElementById('btn-test-connection'); // === Загрузка статуса текущего подключения === async function loadStatus() { try { const data = await api.get('/api/database/status'); const statusBadge = data.connected ? 'Online' : 'Offline'; statusInfo.innerHTML = `
Тенант: ${escapeHtml(data.tenant || '—')}
Название: ${escapeHtml(data.name || '—')}
Статус: ${statusBadge}
${data.url ? `
URL: ${escapeHtml(data.url)}
` : ''}
`; } catch (e) { statusInfo.innerHTML = `
Ошибка загрузки статуса: ${e.message}
`; } } // === Загрузка списка тенантов === async function loadTenants() { try { const tenants = await api.get('/api/database/tenants'); renderTenantsTable(tenants); } catch (e) { tenantsTbody.innerHTML = `Ошибка загрузки: ${e.message}`; } } function renderTenantsTable(tenants) { if (!tenants || !tenants.length) { tenantsTbody.innerHTML = 'Нет подключённых тенантов'; return; } tenantsTbody.innerHTML = tenants.map(t => { const statusBadge = t.connected ? 'Online' : 'Offline'; return ` ${escapeHtml(t.name || '—')} ${escapeHtml(t.domain)} ${escapeHtml(t.url)} ${escapeHtml(t.username || '—')} ${statusBadge} `; }).join(''); } // === Тест подключения === btnTest.addEventListener('click', async () => { hideAlert('add-tenant-alert'); const url = document.getElementById('tenant-url').value.trim(); const username = document.getElementById('tenant-username').value.trim(); const password = document.getElementById('tenant-password').value; if (!url) { showAlert('add-tenant-alert', 'Введите JDBC URL', 'error'); return; } btnTest.textContent = '...'; btnTest.disabled = true; try { const result = await api.post('/api/database/test', { url, username, password }); if (result.success) { showAlert('add-tenant-alert', '✓ Подключение успешно!', 'success'); } else { showAlert('add-tenant-alert', `✗ ${result.message}`, 'error'); } } catch (e) { showAlert('add-tenant-alert', `Ошибка: ${e.message}`, 'error'); } finally { btnTest.textContent = 'Тест'; btnTest.disabled = false; } }); // === Добавление тенанта === addTenantForm.addEventListener('submit', async (e) => { e.preventDefault(); hideAlert('add-tenant-alert'); const name = document.getElementById('tenant-name').value.trim(); const domain = document.getElementById('tenant-domain').value.trim().toLowerCase(); const url = document.getElementById('tenant-url').value.trim(); const username = document.getElementById('tenant-username').value.trim(); const password = document.getElementById('tenant-password').value; if (!name || !domain || !url) { showAlert('add-tenant-alert', 'Заполните все обязательные поля', 'error'); return; } try { const result = await api.post('/api/database/tenants', { name, domain, url, username, password }); if (result.success) { showAlert('add-tenant-alert', `Тенант "${escapeHtml(domain)}" добавлен!`, 'success'); addTenantForm.reset(); loadTenants(); loadStatus(); } else { showAlert('add-tenant-alert', result.message, 'error'); } } catch (e) { showAlert('add-tenant-alert', `Ошибка: ${e.message}`, 'error'); } }); // === Удаление тенанта === tenantsTbody.addEventListener('click', async (e) => { const btn = e.target.closest('.btn-delete'); if (!btn) return; const domain = btn.dataset.domain; if (!confirm(`Удалить тенант "${domain}"? Пул соединений будет закрыт.`)) return; try { await api.delete(`/api/database/tenants/${domain}`); loadTenants(); loadStatus(); } catch (e) { alert(`Ошибка: ${e.message}`); } }); // === Init === loadStatus(); loadTenants(); }