const timeEntryService = require('../services/TimeEntryService'); /** * Controller-Klasse für Zeiteinträge * Verantwortlich für HTTP-Request/Response-Handling */ class TimeEntryController { /** * Alle Zeiteinträge abrufen * GET /api/time-entries */ async getAllEntries(req, res) { try { const userId = req.user?.userId; const entries = await timeEntryService.getAllEntries(userId); res.json(entries); } catch (error) { console.error('Fehler beim Abrufen der Einträge:', error); res.status(500).json({ error: 'Fehler beim Abrufen der Einträge', message: process.env.NODE_ENV === 'development' ? error.message : undefined }); } } /** * Einzelnen Zeiteintrag anhand der ID abrufen * GET /api/time-entries/:id */ async getEntryById(req, res) { try { const { id } = req.params; const entry = timeEntryService.getEntryById(id); if (!entry) { return res.status(404).json({ error: 'Eintrag nicht gefunden', id: parseInt(id) }); } res.json(entry); } catch (error) { console.error('Fehler beim Abrufen des Eintrags:', error); res.status(500).json({ error: 'Fehler beim Abrufen des Eintrags', message: process.env.NODE_ENV === 'development' ? error.message : undefined }); } } /** * Neuen Zeiteintrag erstellen (Timer starten) * POST /api/time-entries */ async createEntry(req, res) { try { const entryData = req.body; const newEntry = timeEntryService.createEntry(entryData); res.status(201).json(newEntry); } catch (error) { console.error('Fehler beim Erstellen des Eintrags:', error); // Spezifische Fehlerbehandlung if (error.message.includes('läuft bereits')) { return res.status(400).json({ error: 'Validierungsfehler', message: error.message }); } res.status(500).json({ error: 'Fehler beim Erstellen des Eintrags', message: process.env.NODE_ENV === 'development' ? error.message : undefined }); } } /** * Zeiteintrag aktualisieren (Timer stoppen oder Daten ändern) * PUT /api/time-entries/:id */ async updateEntry(req, res) { try { const { id } = req.params; const updateData = req.body; const updatedEntry = timeEntryService.updateEntry(id, updateData); res.json(updatedEntry); } catch (error) { console.error('Fehler beim Aktualisieren des Eintrags:', error); // Spezifische Fehlerbehandlung if (error.message.includes('nicht gefunden')) { return res.status(404).json({ error: 'Eintrag nicht gefunden', message: error.message }); } if (error.message.includes('Endzeit') || error.message.includes('Startzeit')) { return res.status(400).json({ error: 'Validierungsfehler', message: error.message }); } res.status(500).json({ error: 'Fehler beim Aktualisieren des Eintrags', message: process.env.NODE_ENV === 'development' ? error.message : undefined }); } } /** * Zeiteintrag löschen * DELETE /api/time-entries/:id */ async deleteEntry(req, res) { try { const { id } = req.params; await timeEntryService.deleteEntry(id); res.status(204).send(); } catch (error) { console.error('Fehler beim Löschen des Eintrags:', error); if (error.message.includes('nicht gefunden')) { return res.status(404).json({ error: 'Eintrag nicht gefunden', message: error.message }); } res.status(500).json({ error: 'Fehler beim Löschen des Eintrags', message: process.env.NODE_ENV === 'development' ? error.message : undefined }); } } /** * Aktuellen Status abrufen (letzter Worklog-Eintrag) * GET /api/time-entries/current-state */ async getCurrentState(req, res) { try { const userId = req.user.userId; const state = await timeEntryService.getCurrentState(userId); res.json({ success: true, state: state }); } catch (error) { console.error('Fehler beim Abrufen des aktuellen Status:', error); res.status(500).json({ success: false, error: 'Fehler beim Abrufen des Status' }); } } /** * Stempeln (Clock In/Out, Pause Start/Stop) * POST /api/time-entries/clock */ async clock(req, res) { try { const userId = req.user.userId; const { action } = req.body; if (!action) { return res.status(400).json({ success: false, error: 'Aktion ist erforderlich' }); } const result = await timeEntryService.clock(userId, action); res.json({ success: true, message: 'Erfolgreich gestempelt', entry: result }); } catch (error) { console.error('Fehler beim Stempeln:', error); res.status(400).json({ success: false, error: error.message }); } } /** * Statistiken abrufen * GET /api/time-entries/stats/summary */ async getStats(req, res) { try { const userId = req.user?.userId; const stats = await timeEntryService.getStatistics(userId); res.json(stats || {}); } catch (error) { console.error('Fehler beim Abrufen der Statistiken:', error); res.status(500).json({ error: 'Fehler beim Abrufen der Statistiken', message: process.env.NODE_ENV === 'development' ? error.message : undefined }); } } /** * Aktuell laufenden Timer abrufen * GET /api/time-entries/running */ async getRunningEntry(req, res) { try { const userId = req.user.userId; const runningEntry = await timeEntryService.getRunningEntry(userId); if (!runningEntry) { return res.json({}); // Leeres Objekt wenn nichts läuft } res.json(runningEntry); } catch (error) { console.error('Fehler beim Abrufen des laufenden Timers:', error); res.status(500).json({ error: 'Fehler beim Abrufen des laufenden Timers', message: process.env.NODE_ENV === 'development' ? error.message : undefined }); } } /** * Einträge nach Projekt filtern * GET /api/time-entries/project/:projectName */ async getEntriesByProject(req, res) { try { const { projectName } = req.params; const entries = timeEntryService.getEntriesByProject(projectName); res.json({ project: projectName, count: entries.length, entries }); } catch (error) { console.error('Fehler beim Filtern nach Projekt:', error); res.status(500).json({ error: 'Fehler beim Filtern nach Projekt', message: process.env.NODE_ENV === 'development' ? error.message : undefined }); } } } // Singleton-Instanz exportieren module.exports = new TimeEntryController();