feat: AI Kurzy module, project/service documents, services SQL import

- Add AI Kurzy module with courses, participants, and registrations management
- Add project documents and service documents features
- Add service folders for document organization
- Add SQL import queries for services from firmy.slovensko.ai
- Update todo notifications and group messaging
- Various API improvements and bug fixes

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
richardtekula
2026-01-21 11:32:49 +01:00
parent d9f16ad0a6
commit 4089bb4be2
37 changed files with 7514 additions and 35 deletions

View File

@@ -1,5 +1,8 @@
import express from 'express';
import multer from 'multer';
import * as serviceController from '../controllers/service.controller.js';
import * as serviceFolderController from '../controllers/service-folder.controller.js';
import * as serviceDocumentController from '../controllers/service-document.controller.js';
import { authenticate } from '../middlewares/auth/authMiddleware.js';
import { requireAdmin } from '../middlewares/auth/roleMiddleware.js';
import { validateBody, validateParams } from '../middlewares/security/validateInput.js';
@@ -8,27 +11,129 @@ import { z } from 'zod';
const router = express.Router();
const upload = multer({
storage: multer.memoryStorage(),
limits: { fileSize: 50 * 1024 * 1024 }, // 50MB limit
});
const serviceIdSchema = z.object({
serviceId: z.string().uuid(),
});
const folderIdSchema = z.object({
folderId: z.string().uuid(),
});
const folderDocumentIdSchema = z.object({
folderId: z.string().uuid(),
documentId: z.string().uuid(),
});
const createFolderSchema = z.object({
name: z.string().min(1).max(255),
});
const updateFolderSchema = z.object({
name: z.string().min(1).max(255),
});
// All service routes require authentication
router.use(authenticate);
// ==================== SERVICE FOLDERS (must be before :serviceId routes) ====================
/**
* GET /api/services/folders - Get all folders (all authenticated users)
*/
router.get('/folders', serviceFolderController.getAllFolders);
/**
* POST /api/services/folders - Create new folder (admin only)
*/
router.post(
'/folders',
requireAdmin,
validateBody(createFolderSchema),
serviceFolderController.createFolder
);
/**
* GET /api/services/folders/:folderId - Get folder by ID (all authenticated users)
*/
router.get(
'/folders/:folderId',
validateParams(folderIdSchema),
serviceFolderController.getFolderById
);
/**
* PUT /api/services/folders/:folderId - Update folder (admin only)
*/
router.put(
'/folders/:folderId',
requireAdmin,
validateParams(folderIdSchema),
validateBody(updateFolderSchema),
serviceFolderController.updateFolder
);
/**
* DELETE /api/services/folders/:folderId - Delete folder (admin only)
*/
router.delete(
'/folders/:folderId',
requireAdmin,
validateParams(folderIdSchema),
serviceFolderController.deleteFolder
);
// ==================== SERVICE DOCUMENTS ====================
/**
* GET /api/services/folders/:folderId/documents - Get all documents in folder
*/
router.get(
'/folders/:folderId/documents',
validateParams(folderIdSchema),
serviceDocumentController.getDocumentsByFolderId
);
/**
* POST /api/services/folders/:folderId/documents - Upload document to folder
*/
router.post(
'/folders/:folderId/documents',
validateParams(folderIdSchema),
upload.single('file'),
serviceDocumentController.uploadDocument
);
/**
* GET /api/services/folders/:folderId/documents/:documentId/download - Download document
*/
router.get(
'/folders/:folderId/documents/:documentId/download',
validateParams(folderDocumentIdSchema),
serviceDocumentController.downloadDocument
);
/**
* DELETE /api/services/folders/:folderId/documents/:documentId - Delete document (admin only)
*/
router.delete(
'/folders/:folderId/documents/:documentId',
requireAdmin,
validateParams(folderDocumentIdSchema),
serviceDocumentController.deleteDocument
);
// ==================== SERVICES ====================
/**
* GET /api/services - Get all services (all authenticated users)
*/
router.get('/', serviceController.getAllServices);
/**
* GET /api/services/:serviceId - Get service by ID (all authenticated users)
*/
router.get(
'/:serviceId',
validateParams(serviceIdSchema),
serviceController.getServiceById
);
/**
* POST /api/services - Create new service (admin only)
*/
@@ -39,6 +144,15 @@ router.post(
serviceController.createService
);
/**
* GET /api/services/:serviceId - Get service by ID (all authenticated users)
*/
router.get(
'/:serviceId',
validateParams(serviceIdSchema),
serviceController.getServiceById
);
/**
* PUT /api/services/:serviceId - Update service (admin only)
*/