diff --git a/server.js b/server.js index fe014b2..7af6b20 100644 --- a/server.js +++ b/server.js @@ -210,7 +210,60 @@ function setupRoutes() { res.status(500).json({ message: "Server error fetching logs." }); } }); +// Gets all users for the management table +app.get('/api/admin/users', authenticateToken, requireRole('admin'), async (req, res) => { + try { + const users = await db.all("SELECT id, username, role FROM users"); + // Add a flag to identify the primary admin to protect them from deletion/demotion + const usersWithPrimaryFlag = users.map(u => ({ + ...u, + isPrimary: u.username === ADMIN_USERNAME + })); + res.json(usersWithPrimaryFlag); + } catch { + res.status(500).json({ message: "Failed to fetch users." }); + } +}); +// Gets all time entries for the detailed log view +app.get('/api/admin/logs', authenticateToken, requireRole('admin'), async (req, res) => { + try { + const rows = await db.all("SELECT * FROM time_entries ORDER BY punch_in_time DESC"); + res.json(rows); + } catch { + res.status(500).json({ message: "Server error fetching logs." }); + } +}); + +// Gets only PENDING time off requests for the main dashboard view +app.get('/api/admin/time-off-requests/pending', authenticateToken, requireRole('admin'), async (req, res) => { + try { + const rows = await db.all("SELECT * FROM time_off_requests WHERE status = 'pending' ORDER BY start_date ASC"); + res.json(rows); + } catch { + res.status(500).json({ message: "Failed to fetch pending requests." }); + } +}); + +// Gets APPROVED/DENIED requests for the history view +app.get('/api/admin/time-off-requests/history', authenticateToken, requireRole('admin'), async (req, res) => { + try { + const rows = await db.all("SELECT * FROM time_off_requests WHERE status != 'pending' ORDER BY start_date DESC"); + res.json(rows); + } catch { + res.status(500).json({ message: "Failed to fetch request history." }); + } +}); + +// Gets archived time entries +app.get('/api/admin/archives', authenticateToken, requireRole('admin'), async (req, res) => { + try { + const rows = await db.all("SELECT * FROM archived_time_entries ORDER BY archived_at DESC"); + res.json(rows); + } catch { + res.status(500).json({ message: "Failed to fetch archives." }); + } +}); // THIS IS THE NEW/FIXED ROUTE app.put('/api/admin/logs/:id', authenticateToken, requireRole('admin'), async (req, res) => { try {