add time tracker with stats

This commit is contained in:
richardtekula
2025-11-24 09:10:04 +01:00
parent 540c1719d3
commit dfcf8056f3
2 changed files with 86 additions and 24 deletions

View File

@@ -107,25 +107,50 @@ export const updateNoteSchema = z.object({
});
// Time Tracking validators
const optionalUuid = (message) =>
z
.preprocess(
(val) => {
if (val === undefined) return undefined;
if (val === null || val === '') return null;
return val;
},
z.string().uuid(message).nullable()
)
.optional();
const optionalDescription = z
.preprocess(
(val) => {
if (val === undefined) return undefined;
if (val === null) return null;
if (typeof val !== 'string') return val;
const trimmed = val.trim();
return trimmed === '' ? null : trimmed;
},
z.string().max(1000).nullable()
)
.optional();
export const startTimeEntrySchema = z.object({
projectId: z.string().uuid('Neplatný formát project ID').optional().or(z.literal('')),
todoId: z.string().uuid('Neplatný formát todo ID').optional().or(z.literal('')),
companyId: z.string().uuid('Neplatný formát company ID').optional().or(z.literal('')),
description: z.string().max(1000).optional(),
projectId: optionalUuid('Neplatný formát project ID'),
todoId: optionalUuid('Neplatný formát todo ID'),
companyId: optionalUuid('Neplatný formát company ID'),
description: optionalDescription,
});
export const stopTimeEntrySchema = z.object({
projectId: z.string().uuid('Neplatný formát project ID').optional().or(z.literal('')),
todoId: z.string().uuid('Neplatný formát todo ID').optional().or(z.literal('')),
companyId: z.string().uuid('Neplatný formát company ID').optional().or(z.literal('')),
description: z.string().max(1000).optional(),
projectId: optionalUuid('Neplatný formát project ID'),
todoId: optionalUuid('Neplatný formát todo ID'),
companyId: optionalUuid('Neplatný formát company ID'),
description: optionalDescription,
});
export const updateTimeEntrySchema = z.object({
startTime: z.string().optional(),
endTime: z.string().optional(),
projectId: z.string().uuid('Neplatný formát project ID').optional().or(z.literal('').or(z.null())),
todoId: z.string().uuid('Neplatný formát todo ID').optional().or(z.literal('').or(z.null())),
companyId: z.string().uuid('Neplatný formát company ID').optional().or(z.literal('').or(z.null())),
description: z.string().max(1000).optional(),
projectId: optionalUuid('Neplatný formát project ID'),
todoId: optionalUuid('Neplatný formát todo ID'),
companyId: optionalUuid('Neplatný formát company ID'),
description: optionalDescription,
});