feat: Add graceful QB connection shutdown and enhanced logout UI
- Add graceful shutdown handler to properly close QB sessions on server stop - Enhance /quickbooks/logout endpoint with detailed logging and error handling - Style logout button as 'danger' action with clear QB connection closing label - Improve logout feedback with timestamps and error messaging - Update user to aewing in .env for QB authentication
This commit is contained in:
+49
-1
@@ -882,8 +882,35 @@ app.post('/quickbooks/auth', async (c) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
app.post('/quickbooks/logout', (c) => {
|
app.post('/quickbooks/logout', (c) => {
|
||||||
|
try {
|
||||||
|
if (currentSession) {
|
||||||
|
const ticket = currentSession.ticket;
|
||||||
|
const userName = currentSession.userName;
|
||||||
|
|
||||||
|
// Log the closeConnection as if it came from QB
|
||||||
|
logLine('logs/qbws.log', `[CLOSE CONNECTION] Ticket: ${ticket}, User: ${userName}`);
|
||||||
|
|
||||||
|
// Clear the session to prevent further requests
|
||||||
currentSession = null;
|
currentSession = null;
|
||||||
return c.json({ success: true, message: 'Logged out successfully' });
|
|
||||||
|
logLine('logs/qbws.log', `[SESSION CLEARED] Connection properly closed by user`);
|
||||||
|
|
||||||
|
return c.json({
|
||||||
|
success: true,
|
||||||
|
message: 'QuickBooks connection closed successfully',
|
||||||
|
closedAt: new Date().toISOString()
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
return c.json({
|
||||||
|
success: true,
|
||||||
|
message: 'No active QuickBooks session to close'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Logout Error:', error);
|
||||||
|
logLine('logs/error.log', `Logout Error: ${error}`);
|
||||||
|
return c.json({ success: false, error: 'Logout failed' }, 500);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// 404 handler
|
// 404 handler
|
||||||
@@ -956,6 +983,27 @@ app.delete('/api/charges/:id', (c) => {
|
|||||||
return c.json({ error: 'Charge not found' }, 404);
|
return c.json({ error: 'Charge not found' }, 404);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Graceful shutdown handler
|
||||||
|
function gracefulShutdown() {
|
||||||
|
console.log('\n[SHUTDOWN] Received shutdown signal...');
|
||||||
|
|
||||||
|
if (currentSession) {
|
||||||
|
const ticket = currentSession.ticket;
|
||||||
|
const userName = currentSession.userName;
|
||||||
|
logLine('logs/qbws.log', `[SERVER SHUTDOWN] Closing active session - Ticket: ${ticket}, User: ${userName}`);
|
||||||
|
currentSession = null;
|
||||||
|
console.log('[SHUTDOWN] Active QuickBooks session closed');
|
||||||
|
}
|
||||||
|
|
||||||
|
logLine('logs/qbws.log', `[SERVER STOPPED] Server shutdown at ${new Date().toISOString()}`);
|
||||||
|
console.log('[SHUTDOWN] Server shutdown complete');
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle shutdown signals
|
||||||
|
process.on('SIGTERM', gracefulShutdown);
|
||||||
|
process.on('SIGINT', gracefulShutdown);
|
||||||
|
|
||||||
// Startup
|
// Startup
|
||||||
const PORT = process.env.PORT || 3005;
|
const PORT = process.env.PORT || 3005;
|
||||||
console.log(`
|
console.log(`
|
||||||
|
|||||||
@@ -65,6 +65,12 @@
|
|||||||
button:hover {
|
button:hover {
|
||||||
background: #5568d3;
|
background: #5568d3;
|
||||||
}
|
}
|
||||||
|
button.danger {
|
||||||
|
background: #dc3545;
|
||||||
|
}
|
||||||
|
button.danger:hover {
|
||||||
|
background: #c82333;
|
||||||
|
}
|
||||||
.form-group {
|
.form-group {
|
||||||
margin: 15px 0;
|
margin: 15px 0;
|
||||||
}
|
}
|
||||||
@@ -136,7 +142,7 @@
|
|||||||
<p><strong>Company File:</strong> <span id="companyFile"></span></p>
|
<p><strong>Company File:</strong> <span id="companyFile"></span></p>
|
||||||
<p><strong>User:</strong> <span id="sessionUser"></span></p>
|
<p><strong>User:</strong> <span id="sessionUser"></span></p>
|
||||||
<p><strong>Expires:</strong> <span id="sessionExpires"></span></p>
|
<p><strong>Expires:</strong> <span id="sessionExpires"></span></p>
|
||||||
<button onclick="logout()">Logout</button>
|
<button class="danger" onclick="logout()">🔌 Close QB Connection / Logout</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -359,9 +365,15 @@
|
|||||||
if (data.success) {
|
if (data.success) {
|
||||||
updateSessionInfo();
|
updateSessionInfo();
|
||||||
document.getElementById('authMessage').className = 'message success';
|
document.getElementById('authMessage').className = 'message success';
|
||||||
document.getElementById('authMessage').textContent = '✓ ' + data.message;
|
const timestamp = data.closedAt ? ` (${new Date(data.closedAt).toLocaleTimeString()})` : '';
|
||||||
|
document.getElementById('authMessage').textContent = '✓ ' + data.message + timestamp;
|
||||||
|
} else {
|
||||||
|
document.getElementById('authMessage').className = 'message error';
|
||||||
|
document.getElementById('authMessage').textContent = '✗ ' + (data.error || 'Logout failed');
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
document.getElementById('authMessage').className = 'message error';
|
||||||
|
document.getElementById('authMessage').textContent = '✗ Logout failed: ' + error.message;
|
||||||
console.error('Logout failed:', error);
|
console.error('Logout failed:', error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user