mirror of
https://github.com/sstent/GarminSync.git
synced 2026-01-25 08:35:02 +00:00
python v2 - added feartures 1 and 3 - no errors
This commit is contained in:
BIN
data/garmin.db
BIN
data/garmin.db
Binary file not shown.
@@ -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"""
|
||||||
@@ -160,4 +209,4 @@ async def clear_logs():
|
|||||||
session.rollback()
|
session.rollback()
|
||||||
raise HTTPException(status_code=500, detail=f"Failed to clear logs: {str(e)}")
|
raise HTTPException(status_code=500, detail=f"Failed to clear logs: {str(e)}")
|
||||||
finally:
|
finally:
|
||||||
session.close()
|
session.close()
|
||||||
|
|||||||
@@ -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');
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user