107 lines
2.9 KiB
JavaScript
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;
|