python v2 - added feartures 1 and 3 - no errors

This commit is contained in:
2025-08-08 14:32:16 -07:00
parent 9ed2f3720d
commit 4207ffe5aa
3 changed files with 101 additions and 6 deletions

Binary file not shown.

View File

@@ -148,6 +148,55 @@ async def get_logs(limit: int = 50):
finally: finally:
session.close() session.close()
@router.post("/daemon/start")
async def start_daemon():
"""Start the daemon process"""
from garminsync.daemon import daemon_instance
try:
# Start the daemon in a separate thread to avoid blocking
import threading
daemon_thread = threading.Thread(target=daemon_instance.start)
daemon_thread.daemon = True
daemon_thread.start()
# Update daemon status in database
session = get_session()
config = session.query(DaemonConfig).first()
if not config:
config = DaemonConfig()
session.add(config)
config.status = "running"
session.commit()
return {"message": "Daemon started successfully"}
except Exception as e:
session.rollback()
raise HTTPException(status_code=500, detail=f"Failed to start daemon: {str(e)}")
finally:
session.close()
@router.post("/daemon/stop")
async def stop_daemon():
"""Stop the daemon process"""
from garminsync.daemon import daemon_instance
try:
# Stop the daemon
daemon_instance.stop()
# Update daemon status in database
session = get_session()
config = session.query(DaemonConfig).first()
if config:
config.status = "stopped"
session.commit()
return {"message": "Daemon stopped successfully"}
except Exception as e:
session.rollback()
raise HTTPException(status_code=500, detail=f"Failed to stop daemon: {str(e)}")
finally:
session.close()
@router.delete("/logs") @router.delete("/logs")
async def clear_logs(): async def clear_logs():
"""Clear all sync logs""" """Clear all sync logs"""

View File

@@ -11,6 +11,7 @@ async function updateStatus() {
<p>Status: <span class="badge ${data.daemon.running ? 'badge-success' : 'badge-danger'}"> <p>Status: <span class="badge ${data.daemon.running ? 'badge-success' : 'badge-danger'}">
${data.daemon.running ? 'Running' : 'Stopped'} ${data.daemon.running ? 'Running' : 'Stopped'}
</span></p> </span></p>
<p>Last Run: ${data.daemon.last_run || 'Never'}</p>
<p>Next Run: ${data.daemon.next_run || 'Not scheduled'}</p> <p>Next Run: ${data.daemon.next_run || 'Not scheduled'}</p>
<p>Schedule: ${data.daemon.schedule || 'Not configured'}</p> <p>Schedule: ${data.daemon.schedule || 'Not configured'}</p>
`; `;
@@ -23,6 +24,7 @@ async function updateStatus() {
${log.status} ${log.status}
</span> </span>
${log.operation}: ${log.message || ''} ${log.operation}: ${log.message || ''}
${log.activities_downloaded > 0 ? `Downloaded ${log.activities_downloaded} activities` : ''}
</div> </div>
`).join(''); `).join('');
@@ -43,10 +45,54 @@ async function triggerSync() {
} }
} }
async function toggleDaemon() {
try {
const statusResponse = await fetch('/api/status');
const statusData = await statusResponse.json();
const isRunning = statusData.daemon.running;
if (isRunning) {
await fetch('/api/daemon/stop', { method: 'POST' });
alert('Daemon stopped successfully');
} else {
await fetch('/api/daemon/start', { method: 'POST' });
alert('Daemon started successfully');
}
updateStatus();
} catch (error) {
alert('Failed to toggle daemon: ' + error.message);
}
}
// Schedule form handling
document.getElementById('schedule-form')?.addEventListener('submit', async function(e) {
e.preventDefault();
const enabled = document.getElementById('schedule-enabled').checked;
const cronSchedule = document.getElementById('cron-schedule').value;
try {
const response = await fetch('/api/schedule', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
enabled: enabled,
cron_schedule: cronSchedule
})
});
if (response.ok) {
alert('Schedule updated successfully');
updateStatus();
} else {
const error = await response.json();
alert(`Error: ${error.detail}`);
}
} catch (error) {
alert('Failed to update schedule: ' + error.message);
}
});
// Initialize on page load // Initialize on page load
document.addEventListener('DOMContentLoaded', updateStatus); document.addEventListener('DOMContentLoaded', updateStatus);
async function toggleDaemon() {
// TODO: Implement daemon toggle functionality
alert('Daemon toggle functionality not yet implemented');
}