adds statistics

This commit is contained in:
2026-02-16 19:15:23 +01:00
parent 2311cd8265
commit 9206453394
12 changed files with 613 additions and 58 deletions

View File

@@ -1,16 +1,44 @@
import { Router } from 'express';
import { requireAuth } from '../middleware/auth';
import { validateBody, validateParams, validateQuery } from '../middleware/validation';
import { TimeEntryService } from '../services/timeEntry.service';
import { CreateTimeEntrySchema, UpdateTimeEntrySchema, IdSchema, TimeEntryFiltersSchema } from '../schemas';
import type { AuthenticatedRequest } from '../types';
import { Router } from "express";
import { requireAuth } from "../middleware/auth";
import {
validateBody,
validateParams,
validateQuery,
} from "../middleware/validation";
import { TimeEntryService } from "../services/timeEntry.service";
import {
CreateTimeEntrySchema,
UpdateTimeEntrySchema,
IdSchema,
TimeEntryFiltersSchema,
StatisticsFiltersSchema,
} from "../schemas";
import type { AuthenticatedRequest } from "../types";
const router = Router();
const timeEntryService = new TimeEntryService();
// GET /api/time-entries/statistics - Get aggregated statistics
router.get(
"/statistics",
requireAuth,
validateQuery(StatisticsFiltersSchema),
async (req: AuthenticatedRequest, res, next) => {
try {
const stats = await timeEntryService.getStatistics(
req.user!.id,
req.query,
);
res.json(stats);
} catch (error) {
next(error);
}
},
);
// GET /api/time-entries - List user's entries
router.get(
'/',
"/",
requireAuth,
validateQuery(TimeEntryFiltersSchema),
async (req: AuthenticatedRequest, res, next) => {
@@ -20,12 +48,12 @@ router.get(
} catch (error) {
next(error);
}
}
},
);
// POST /api/time-entries - Create entry manually
router.post(
'/',
"/",
requireAuth,
validateBody(CreateTimeEntrySchema),
async (req: AuthenticatedRequest, res, next) => {
@@ -35,28 +63,32 @@ router.post(
} catch (error) {
next(error);
}
}
},
);
// PUT /api/time-entries/:id - Update entry
router.put(
'/:id',
"/:id",
requireAuth,
validateParams(IdSchema),
validateBody(UpdateTimeEntrySchema),
async (req: AuthenticatedRequest, res, next) => {
try {
const entry = await timeEntryService.update(req.params.id, req.user!.id, req.body);
const entry = await timeEntryService.update(
req.params.id,
req.user!.id,
req.body,
);
res.json(entry);
} catch (error) {
next(error);
}
}
},
);
// DELETE /api/time-entries/:id - Delete entry
router.delete(
'/:id',
"/:id",
requireAuth,
validateParams(IdSchema),
async (req: AuthenticatedRequest, res, next) => {
@@ -66,7 +98,7 @@ router.delete(
} catch (error) {
next(error);
}
}
},
);
export default router;
export default router;