From 4327f542a088af71f0d1087e1c7ce8f8b208a41c Mon Sep 17 00:00:00 2001
From: 9qeklajc <9qeklajc>
Date: Wed, 15 Oct 2025 20:23:00 +0200
Subject: [PATCH] test
---
routstr/core/admin.py | 116 +++++++++++++++++++++++++++++++++++++-
routstr/core/main.py | 3 +-
routstr/core/settings.py | 3 +-
routstr/payment/models.py | 112 +++++++++++++++++++++++++++---------
4 files changed, 202 insertions(+), 32 deletions(-)
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:
+
+
+