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:
@@ -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)
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user