diff --git a/routstr/core/admin.py b/routstr/core/admin.py index b52fdde6..234e8aad 100644 --- a/routstr/core/admin.py +++ b/routstr/core/admin.py @@ -8,6 +8,7 @@ from fastapi.responses import HTMLResponse from pydantic import BaseModel from sqlmodel import select +from ..payment.models import sync_models_with_api from ..wallet import ( fetch_all_balances, get_proofs_per_mint_and_unit, @@ -417,6 +418,64 @@ async def dashboard(request: Request) -> str: window.location.href = `/admin/logs/${requestId}`; } + function openSyncModelsModal() { + const modal = document.getElementById('sync-models-modal'); + modal.style.display = 'block'; + } + + function closeSyncModelsModal() { + const modal = document.getElementById('sync-models-modal'); + modal.style.display = 'none'; + } + + async function syncModels() { + const deleteRemoved = document.getElementById('delete-removed-models').checked; + const button = document.getElementById('sync-models-btn'); + const resultDiv = document.getElementById('sync-models-result'); + + button.disabled = true; + button.textContent = 'Syncing...'; + resultDiv.style.display = 'none'; + + try { + const response = await fetch('/admin/api/sync_models', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + credentials: 'same-origin', + body: JSON.stringify({ + delete_removed: deleteRemoved + }) + }); + + if (response.ok) { + const data = await response.json(); + resultDiv.innerHTML = `✅ Success!
${data.message}`; + resultDiv.style.display = 'block'; + resultDiv.style.backgroundColor = '#d4edda'; + resultDiv.style.borderColor = '#c3e6cb'; + resultDiv.style.color = '#155724'; + } else { + const errorData = await response.json(); + resultDiv.innerHTML = `❌ Error:
${errorData.detail || 'Unknown error'}`; + resultDiv.style.display = 'block'; + resultDiv.style.backgroundColor = '#f8d7da'; + resultDiv.style.borderColor = '#f5c6cb'; + resultDiv.style.color = '#721c24'; + } + } catch (error) { + resultDiv.innerHTML = `❌ Error:
${error.message}`; + resultDiv.style.display = 'block'; + resultDiv.style.backgroundColor = '#f8d7da'; + resultDiv.style.borderColor = '#f5c6cb'; + resultDiv.style.color = '#721c24'; + } finally { + button.disabled = false; + button.textContent = 'Sync Models'; + } + } + async function openSettingsModal() { const modal = document.getElementById('settings-modal'); const textarea = document.getElementById('settings-json'); @@ -498,12 +557,15 @@ async def dashboard(request: Request) -> str: const withdrawModal = document.getElementById('withdraw-modal'); const investigateModal = document.getElementById('investigate-modal'); const settingsModal = document.getElementById('settings-modal'); + const syncModelsModal = document.getElementById('sync-models-modal'); if (event.target == withdrawModal) { closeWithdrawModal(); } else if (event.target == investigateModal) { closeInvestigateModal(); } else if (event.target == settingsModal) { closeSettingsModal(); + } else if (event.target == syncModelsModal) { + closeSyncModelsModal(); } } @@ -532,6 +594,29 @@ async def dashboard(request: Request) -> str: + + +