Files
crm-server/src/routes/time-tracking.routes.js
2025-12-04 07:41:31 +01:00

107 lines
2.9 KiB
JavaScript

import express from 'express';
import * as timeTrackingController from '../controllers/time-tracking.controller.js';
import { authenticate } from '../middlewares/auth/authMiddleware.js';
import { validateBody, validateParams } from '../middlewares/security/validateInput.js';
import {
startTimeEntrySchema,
stopTimeEntrySchema,
updateTimeEntrySchema,
} from '../validators/crm.validators.js';
import { z } from 'zod';
const router = express.Router();
// All time tracking routes require authentication
router.use(authenticate);
/**
* Time Tracking management
*/
// Start new time entry
router.post('/start', validateBody(startTimeEntrySchema), timeTrackingController.startTimeEntry);
// Stop running time entry
router.post(
'/:entryId/stop',
validateParams(z.object({ entryId: z.string().uuid() })),
validateBody(stopTimeEntrySchema),
timeTrackingController.stopTimeEntry
);
// Get running time entry
router.get('/running', timeTrackingController.getRunningTimeEntry);
// Get all running time entries (for dashboard)
router.get('/running-all', timeTrackingController.getAllRunningTimeEntries);
// Get all time entries with filters
router.get('/', timeTrackingController.getAllTimeEntries);
// Get monthly time entries
router.get(
'/month/:year/:month',
validateParams(
z.object({
year: z.string().regex(/^\d{4}$/, 'Rok musí byť 4-ciferné číslo'),
month: z.string().regex(/^(0?[1-9]|1[0-2])$/, 'Mesiac musí byť číslo 1-12'),
})
),
timeTrackingController.getMonthlyTimeEntries
);
// Generate monthly timesheet (XLSX)
router.post(
'/month/:year/:month/generate',
validateParams(
z.object({
year: z.string().regex(/^\d{4}$/, 'Rok musí byť 4-ciferné číslo'),
month: z.string().regex(/^(0?[1-9]|1[0-2])$/, 'Mesiac musí byť číslo 1-12'),
})
),
timeTrackingController.generateMonthlyTimesheet
);
// Get monthly statistics
router.get(
'/stats/monthly/:year/:month',
validateParams(
z.object({
year: z.string().regex(/^\d{4}$/, 'Rok musí byť 4-ciferné číslo'),
month: z.string().regex(/^(0?[1-9]|1[0-2])$/, 'Mesiac musí byť číslo 1-12'),
})
),
timeTrackingController.getMonthlyStats
);
// Get time entry by ID
router.get(
'/:entryId',
validateParams(z.object({ entryId: z.string().uuid() })),
timeTrackingController.getTimeEntryById
);
// Get time entry with relations
router.get(
'/:entryId/details',
validateParams(z.object({ entryId: z.string().uuid() })),
timeTrackingController.getTimeEntryWithRelations
);
// Update time entry
router.patch(
'/:entryId',
validateParams(z.object({ entryId: z.string().uuid() })),
validateBody(updateTimeEntrySchema),
timeTrackingController.updateTimeEntry
);
// Delete time entry
router.delete(
'/:entryId',
validateParams(z.object({ entryId: z.string().uuid() })),
timeTrackingController.deleteTimeEntry
);
export default router;