refactor
This commit is contained in:
181
src/routes/entries.js
Normal file
181
src/routes/entries.js
Normal file
@@ -0,0 +1,181 @@
|
||||
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;
|
||||
Reference in New Issue
Block a user