Skip to content

Commit bc14b77

Browse files
committed
fix: prevent orphaned server_meta records on failed Pterodactyl deletion; hide delete button for suspended servers
1 parent b721f01 commit bc14b77

4 files changed

Lines changed: 22 additions & 2 deletions

File tree

public/js/admin.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,13 +443,15 @@ async function renderAdminServerDetail(serverId) {
443443
<div id="admin-action-msg" style="margin-top:12px;display:none"></div>
444444
</div>
445445
446+
${!isSuspended ? ahtml`
446447
<div class="card">
447448
<h2 class="card-title" style="margin-bottom:16px">Danger Zone</h2>
448449
<p style="color:var(--text-secondary);font-size:0.88rem;margin-bottom:12px">
449450
Irreversible actions.
450451
</p>
451452
<button class="btn btn-danger" id="admin-btn-delete" style="width:auto">Delete Server</button>
452453
</div>
454+
` : ''}
453455
</div>
454456
`;
455457

public/js/app.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2076,6 +2076,7 @@ async function renderServerDetail(serverId) {
20762076
<button class="btn btn-warning btn-full btn-reinstall-server" data-server-id="${s.id}" data-server-name="${s.name.replace(/"/g, '&quot;')}">Reinstall Server</button>
20772077
</div>
20782078
2079+
${!isSuspended ? html`
20792080
<div class="action-card">
20802081
<div class="action-card-header">
20812082
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 6h18M19 6v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6m3 0V4a2 2 0 012-2h4a2 2 0 012 2v2"/></svg>
@@ -2086,6 +2087,7 @@ async function renderServerDetail(serverId) {
20862087
</div>
20872088
<button class="btn btn-danger btn-full btn-delete-server" data-server-id="${s.id}" data-server-name="${s.name.replace(/"/g, '&quot;')}">Delete Server</button>
20882089
</div>
2090+
` : ''}
20892091
</div>
20902092
`;
20912093

routes/admin.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,15 @@ router.delete('/servers/:id', authenticateToken, requireAdmin, async (req, res)
218218
return res.status(400).json({ error: 'Invalid server ID' });
219219
}
220220

221-
await deletePteroServer(serverId);
221+
const meta = await query('SELECT status FROM server_meta WHERE ptero_server_id = ?', [serverId]);
222+
if (meta.length > 0 && meta[0].status === 'suspended') {
223+
return res.status(403).json({ error: 'Cannot delete a suspended server' });
224+
}
225+
try {
226+
await deletePteroServer(serverId);
227+
} catch (err) {
228+
console.warn('Pterodactyl delete failed (proceeding with local cleanup):', err.message);
229+
}
222230
await query('DELETE FROM server_meta WHERE ptero_server_id = ?', [serverId]);
223231
await logActivity(req.user.userId, 'admin_delete', `Admin deleted server #${serverId}`, serverId);
224232
res.json({ success: true });

routes/servers.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,15 @@ router.delete('/:id', authenticateToken, async (req, res) => {
338338
if (isNaN(serverId)) {
339339
return res.status(400).json({ error: 'Invalid server ID' });
340340
}
341-
await deletePteroServer(serverId);
341+
const meta = await query('SELECT status FROM server_meta WHERE ptero_server_id = ?', [serverId]);
342+
if (meta.length > 0 && meta[0].status === 'suspended') {
343+
return res.status(403).json({ error: 'Cannot delete a suspended server' });
344+
}
345+
try {
346+
await deletePteroServer(serverId);
347+
} catch (err) {
348+
console.warn('Pterodactyl delete failed (proceeding with local cleanup):', err.message);
349+
}
342350
await query('DELETE FROM server_meta WHERE ptero_server_id = ?', [serverId]);
343351
await logActivity(req.user.userId, 'server_deleted', `Deleted server #${serverId}`);
344352
res.json({ success: true });

0 commit comments

Comments
 (0)