feat: Add user management APIs, status enum, enhanced notifications

- Add updateUser and resetUserPassword admin endpoints
- Change company status from boolean to enum (registered, lead, customer, inactive)
- Add 'important' event type to calendar validators and email templates
- Add 1-hour-before event notifications cron job
- Add 18:00 evening notifications for next-day events
- Add contact description field support
- Fix count() function usage in admin service
- Add SQL migrations for schema changes

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
richardtekula
2026-01-15 09:41:29 +01:00
parent 5d01fc9542
commit 70fa080455
13 changed files with 423 additions and 19 deletions

View File

@@ -15,6 +15,7 @@ export const createCompanySchema = z.object({
phone: z.string().max(50).optional(),
email: z.string().email('Neplatný formát emailu').max(255).optional().or(z.literal('')),
website: z.string().url('Neplatný formát URL').max(255).optional().or(z.literal('')),
status: z.enum(['registered', 'lead', 'customer', 'inactive']).optional(),
});
export const updateCompanySchema = z.object({
@@ -26,7 +27,7 @@ export const updateCompanySchema = z.object({
phone: z.string().max(50).optional(),
email: z.string().email('Neplatný formát emailu').max(255).optional().or(z.literal('')),
website: z.string().url('Neplatný formát URL').max(255).optional().or(z.literal('')),
isActive: z.boolean().optional(),
status: z.enum(['registered', 'lead', 'customer', 'inactive']).optional(),
});
// Project validators
@@ -176,7 +177,7 @@ export const updateTimeEntrySchema = z.object({
export const createEventSchema = z.object({
title: z.string().min(1, 'Názov je povinný'),
description: z.string().optional(),
type: z.enum(['meeting', 'event']).default('meeting'),
type: z.enum(['meeting', 'event', 'important']).default('meeting'),
start: z.string().min(1, 'Začiatok je povinný'),
end: z.string().min(1, 'Koniec je povinný'),
assignedUserIds: z.array(z.string().uuid('Neplatný formát user ID')).optional(),
@@ -185,7 +186,7 @@ export const createEventSchema = z.object({
export const updateEventSchema = z.object({
title: z.string().min(1).optional(),
description: z.string().optional(),
type: z.enum(['meeting', 'event']).optional(),
type: z.enum(['meeting', 'event', 'important']).optional(),
start: z.string().optional(),
end: z.string().optional(),
assignedUserIds: z.array(z.string().uuid('Neplatný formát user ID')).optional(),