"use client"; import { useState, useEffect } from "react"; import { useSession } from "next-auth/react"; import { useRouter } from "next/navigation"; import Link from "next/link"; export default function AdminSettingsPage() { const { data: session, status } = useSession(); const router = useRouter(); const [settings, setSettings] = useState([]); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [users, setUsers] = useState([]); const [cronStatus, setCronStatus] = useState(null); const [cronLoading, setCronLoading] = useState(false); const [cronActionLoading, setCronActionLoading] = useState(null); // Redirect if not admin useEffect(() => { if (status === "loading") return; if (!session || session.user.role !== "admin") { router.push("/"); return; } fetchSettings(); fetchUsers(); fetchCronStatus(); }, [session, status, router]); const fetchSettings = async () => { try { const response = await fetch("/api/admin/settings"); if (response.ok) { const data = await response.json(); setSettings(data); } } catch (error) { console.error("Error fetching settings:", error); } finally { setLoading(false); } }; const fetchUsers = async () => { try { const response = await fetch("/api/admin/users"); if (response.ok) { const data = await response.json(); setUsers(data); } } catch (error) { console.error("Error fetching users:", error); } }; const fetchCronStatus = async () => { setCronLoading(true); try { const response = await fetch("/api/admin/cron"); if (response.ok) { const data = await response.json(); setCronStatus(data); } } catch (error) { console.error("Error fetching cron status:", error); } finally { setCronLoading(false); } }; const handleCronAction = async (action) => { setCronActionLoading(action); try { const response = await fetch("/api/admin/cron", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ action }), }); const data = await response.json(); if (data.success) { alert(data.message); fetchCronStatus(); } else { alert("Error: " + data.message); } } catch (error) { console.error("Error performing cron action:", error); alert("Error performing action"); } finally { setCronActionLoading(null); } }; const updateSetting = async (key, value) => { setSaving(true); try { const response = await fetch("/api/admin/settings", { method: "PUT", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ key, value }), }); if (response.ok) { // Update local state setSettings(prev => prev.map(setting => setting.key === key ? { ...setting, value } : setting ) ); alert("Setting updated successfully!"); } else { alert("Failed to update setting"); } } catch (error) { console.error("Error updating setting:", error); alert("Error updating setting"); } finally { setSaving(false); } }; const handleBackupUserChange = (userId) => { updateSetting("backup_notification_user_id", userId); }; if (status === "loading" || loading) { return (
Loading...
); } if (!session || session.user.role !== "admin") { return (

Access Denied

You need admin privileges to access this page.

Go Home
); } const backupUserSetting = settings.find(s => s.key === "backup_notification_user_id"); return (

Admin Settings

← Back to Admin
{/* Backup Notifications Setting */}

Backup Notifications

Select which user should receive notifications when daily database backups are completed.

{saving && (

Saving...

)}
{/* Future settings can be added here */}

Cron Jobs Status

{cronLoading && !cronStatus ? (

Loading cron status...

) : cronStatus ? (
{/* Status indicators */}
{cronStatus.available ? "✓ Cron Available" : "⚠ Cron Unavailable"}
{cronStatus.available && (
{cronStatus.running ? "✓ Daemon Running" : "✗ Daemon Not Running"}
)} {cronStatus.available && (
{cronStatus.jobCount || 0} Job(s) Scheduled
)}
{/* Scheduled jobs */} {cronStatus.jobs && cronStatus.jobs.length > 0 && (

Scheduled Jobs:

{cronStatus.jobs.map((job, idx) => (
{job}
))}
)} {/* Last backup info */} {cronStatus.lastBackup && (
Last Backup: {cronStatus.lastBackup.exists ? ( {cronStatus.lastBackup.filename} ({new Date(cronStatus.lastBackup.date).toLocaleString()}) ({cronStatus.lastBackup.count} total backups) ) : ( {cronStatus.lastBackup.message || "No backups"} )}
)} {/* Message for non-Linux environments */} {cronStatus.message && (

{cronStatus.message}

)} {/* Action buttons */}
{cronStatus.available && ( )}
) : (

Failed to load cron status

)}
{/* System Information */}

System Information

Daily database backups run automatically at 2 AM and keep the last 30 backups. Backups are stored in the ./backups/ directory.

); }