Check server is read-only: list lookup and server data, no registration

- Looks the exact URL up in /datalist and shows expiry, balance and donations from /weinfodata
- No terms box, no POST /data: checking an unlisted URL creates nothing; clear message either way
This commit is contained in:
2026-11-06 18:55:42 +01:00
parent 6c58a80f26
commit f6dab5de5f

View File

@@ -716,7 +716,70 @@ function startDepositWatch(chain, id) {
pollDeposit(); pollDeposit();
} }
document.getElementById('check').addEventListener('click', () => document.getElementById('submit').click()); // "Check server" is read-only: it looks the URL up in the list (GET /datalist) and
// shows the server's expiry and balance from /weinfodata. It never POSTs to /data,
// so checking a URL that is not listed creates nothing.
function normalizeUrl(u) {
u = u.trim();
if (!u) return '';
if (!u.startsWith('http://') && !u.startsWith('https://')) u = 'https://' + u;
return u.replace(/\/+$/, '');
}
function hidePaymentRows() {
document.getElementById('iv-min').parentElement.style.display = 'none';
document.getElementById('iv-addr').parentElement.style.display = 'none';
document.getElementById('qrcode').style.display = 'none';
document.getElementById('share-btn').style.display = 'none';
}
document.getElementById('check').addEventListener('click', async () => {
stopDepositWatch();
const urlInput = document.getElementById('url');
const url = normalizeUrl(urlInput.value);
if (!url) return;
urlInput.value = url;
const chain = getChain();
const status = document.getElementById('iv-status');
const inv = document.getElementById('invoice');
inv.classList.remove('show');
document.getElementById('terms-box').classList.remove('show');
status.className = '';
status.textContent = 'Checking…';
try {
const listResp = await fetch(`/datalist/${chain}?page=0&limit=100`);
if (!listResp.ok) throw new Error(`HTTP ${listResp.status}`);
const list = await listResp.json();
const idx = list.findIndex(d => normalizeUrl(d.url || '').toLowerCase() === url.toLowerCase());
if (idx < 0) {
status.className = 'err-line';
status.textContent = `Not in the ${chain} list: no server with this exact URL. To list it, press "Add server".`;
return;
}
const d = list[idx];
const infoResp = await fetch(`/weinfodata/${chain}/${d.id}`);
const info = infoResp.ok ? await infoResp.json() : {};
const expiry = (info.expiry_date || '').slice(0, 10) || '—'; // '2027-07-16 00:00:00' -> the date
const bal = info.balance != null ? fmt(info.balance) : null;
const unc = info.unconfirmed_balance != null ? fmt(info.unconfirmed_balance) : null;
document.getElementById('iv-chain').textContent = info.chain || chain;
document.getElementById('iv-balance').textContent = bal ? (unc ? bal + ' (' + unc + ')' : bal) : '—';
document.getElementById('iv-donations').textContent = info.donation != null ? fmt(info.donation) : '—';
document.getElementById('iv-contact').textContent = '—';
document.getElementById('iv-url').textContent = d.url;
const weinfoEl = document.getElementById('iv-weinfo');
weinfoEl.href = `/weinfo/${chain}/${d.id}`;
weinfoEl.textContent = 'View page';
document.getElementById('iv-nextdep').textContent = expiry;
document.getElementById('iv-nextdep-row').style.display = 'flex';
hidePaymentRows();
status.className = 'ok-line';
status.textContent = `Server is listed (#${idx + 1} of ${list.length}). Expiry: ${expiry}. Renewal opens 6 months before.`;
inv.classList.add('show');
inv.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
} catch (err) {
status.className = 'err-line';
status.textContent = 'Could not check the list right now. Please try again in a moment.';
}
});
document.getElementById('submit').addEventListener('click', async () => { document.getElementById('submit').addEventListener('click', async () => {
stopDepositWatch(); stopDepositWatch();
const urlInput = document.getElementById('url'); const urlInput = document.getElementById('url');