const express = require('express'); const router = express.Router(); const { calculateNetHours } = require('../utils/timeCalculator'); /** * Initialize routes with database instance * @param {Database} db - SQLite database instance * @returns {Router} - Configured Express router */ function createEntriesRouter(db) { /** * GET /api/entries?from=YYYY-MM-DD&to=YYYY-MM-DD * Get all entries in a date range */ router.get('/', (req, res) => { try { const { from, to } = req.query; let query = 'SELECT * FROM entries'; const params = []; if (from && to) { query += ' WHERE date >= ? AND date <= ?'; params.push(from, to); } else if (from) { query += ' WHERE date >= ?'; params.push(from); } else if (to) { query += ' WHERE date <= ?'; params.push(to); } query += ' ORDER BY date DESC, start_time DESC'; const stmt = db.prepare(query); const entries = stmt.all(...params); // Add calculated net hours to each entry const enrichedEntries = entries.map(entry => { const calculated = calculateNetHours(entry.start_time, entry.end_time, entry.pause_minutes); return { id: entry.id, date: entry.date, startTime: entry.start_time, endTime: entry.end_time, pauseMinutes: entry.pause_minutes, netHours: calculated.netHours, location: entry.location || 'office' }; }); res.json(enrichedEntries); } catch (error) { console.error('Error fetching entries:', error); res.status(500).json({ error: 'Failed to fetch entries' }); } }); /** * POST /api/entries * Create a new entry */ router.post('/', (req, res) => { try { const { date, startTime, endTime, pauseMinutes, location } = req.body; if (!date || !startTime || !endTime) { return res.status(400).json({ error: 'Missing required fields: date, startTime, endTime' }); } // Calculate with auto-pause or use provided pause const calculated = calculateNetHours(startTime, endTime, pauseMinutes); const pause = calculated.pauseMinutes; const loc = location || 'office'; try { const stmt = db.prepare('INSERT INTO entries (date, start_time, end_time, pause_minutes, location) VALUES (?, ?, ?, ?, ?)'); const result = stmt.run(date, startTime, endTime, pause, loc); // Return the created entry with calculated fields const newEntry = { id: result.lastInsertRowid, date, startTime, endTime, pauseMinutes: pause, netHours: calculated.netHours, location: loc }; res.status(201).json(newEntry); } catch (dbError) { // Check for UNIQUE constraint violation if (dbError.message.includes('UNIQUE constraint failed')) { return res.status(409).json({ error: 'Ein Eintrag für dieses Datum existiert bereits' }); } throw dbError; } } catch (error) { console.error('Error creating entry:', error); res.status(500).json({ error: 'Failed to create entry' }); } }); /** * PUT /api/entries/:id * Update an existing entry */ router.put('/:id', (req, res) => { try { const { id } = req.params; const { date, startTime, endTime, pauseMinutes, location } = req.body; if (!date || !startTime || !endTime) { return res.status(400).json({ error: 'Missing required fields: date, startTime, endTime' }); } // Calculate with auto-pause or use provided pause const calculated = calculateNetHours(startTime, endTime, pauseMinutes); const pause = calculated.pauseMinutes; const loc = location || 'office'; try { const stmt = db.prepare('UPDATE entries SET date = ?, start_time = ?, end_time = ?, pause_minutes = ?, location = ? WHERE id = ?'); const result = stmt.run(date, startTime, endTime, pause, loc, id); if (result.changes === 0) { return res.status(404).json({ error: 'Entry not found' }); } // Return the updated entry with calculated fields const updatedEntry = { id: parseInt(id), date, startTime, endTime, pauseMinutes: pause, netHours: calculated.netHours, location: loc }; res.json(updatedEntry); } catch (dbError) { // Check for UNIQUE constraint violation if (dbError.message.includes('UNIQUE constraint failed')) { return res.status(409).json({ error: 'Ein Eintrag für dieses Datum existiert bereits' }); } throw dbError; } } catch (error) { console.error('Error updating entry:', error); res.status(500).json({ error: 'Failed to update entry' }); } }); /** * DELETE /api/entries/:id * Delete an entry */ router.delete('/:id', (req, res) => { try { const { id } = req.params; const stmt = db.prepare('DELETE FROM entries WHERE id = ?'); const result = stmt.run(id); if (result.changes === 0) { return res.status(404).json({ error: 'Entry not found' }); } res.json({ message: 'Entry deleted successfully' }); } catch (error) { console.error('Error deleting entry:', error); res.status(500).json({ error: 'Failed to delete entry' }); } }); return router; } module.exports = createEntriesRouter;