initialize git, basic setup for crm

This commit is contained in:
richardtekula
2025-11-18 13:53:28 +01:00
commit da01d586fc
47 changed files with 12776 additions and 0 deletions

View File

@@ -0,0 +1,49 @@
import express from 'express';
import * as adminController from '../controllers/admin.controller.js';
import { authenticate } from '../middlewares/auth/authMiddleware.js';
import { requireAdmin } from '../middlewares/auth/roleMiddleware.js';
import { validateBody, validateParams } from '../middlewares/security/validateInput.js';
import { createUserSchema, changeRoleSchema } from '../validators/auth.validators.js';
import { z } from 'zod';
const router = express.Router();
/**
* Všetky admin routes vyžadujú autentifikáciu a admin rolu
*/
router.use(authenticate);
router.use(requireAdmin);
/**
* User management
*/
// Vytvorenie nového usera
router.post('/users', validateBody(createUserSchema), adminController.createUser);
// Zoznam všetkých userov
router.get('/users', adminController.getAllUsers);
// Získanie konkrétneho usera
router.get(
'/users/:userId',
validateParams(z.object({ userId: z.string().uuid() })),
adminController.getUserById
);
// Zmena role usera
router.patch(
'/users/:userId/role',
validateParams(z.object({ userId: z.string().uuid() })),
validateBody(z.object({ role: z.enum(['admin', 'member']) })),
adminController.changeUserRole
);
// Zmazanie usera
router.delete(
'/users/:userId',
validateParams(z.object({ userId: z.string().uuid() })),
adminController.deleteUser
);
export default router;

63
src/routes/auth.routes.js Normal file
View File

@@ -0,0 +1,63 @@
import express from 'express';
import * as authController from '../controllers/auth.controller.js';
import { authenticate } from '../middlewares/auth/authMiddleware.js';
import { validateBody } from '../middlewares/security/validateInput.js';
import {
loginSchema,
setPasswordSchema,
linkEmailSchema,
} from '../validators/auth.validators.js';
import {
loginRateLimiter,
sensitiveOperationLimiter,
} from '../middlewares/security/rateLimiter.js';
const router = express.Router();
/**
* Public routes (bez autentifikácie)
*/
// KROK 1: Login s temporary password
router.post(
'/login',
loginRateLimiter,
validateBody(loginSchema),
authController.login
);
/**
* Protected routes (vyžadujú autentifikáciu)
*/
// KROK 2: Set new password
router.post(
'/set-password',
authenticate,
sensitiveOperationLimiter,
validateBody(setPasswordSchema),
authController.setPassword
);
// KROK 3: Link email
router.post(
'/link-email',
authenticate,
sensitiveOperationLimiter,
validateBody(linkEmailSchema),
authController.linkEmail
);
// KROK 3 (alternatíva): Skip email
router.post('/skip-email', authenticate, authController.skipEmail);
// Logout
router.post('/logout', authenticate, authController.logout);
// Get current session
router.get('/session', authenticate, authController.getSession);
// Get current user profile
router.get('/me', authenticate, authController.getMe);
export default router;

View File

@@ -0,0 +1,55 @@
import express from 'express';
import * as contactController from '../controllers/contact.controller.js';
import { authenticate } from '../middlewares/auth/authMiddleware.js';
import { validateBody, validateParams } from '../middlewares/security/validateInput.js';
import { z } from 'zod';
const router = express.Router();
// All contact routes require authentication
router.use(authenticate);
/**
* Contact management
*/
// Get all contacts
router.get('/', contactController.getContacts);
// Discover potential contacts from JMAP
router.get('/discover', contactController.discoverContacts);
// Add a new contact
router.post(
'/',
validateBody(
z.object({
email: z.string().email('Neplatný formát emailu'),
name: z.string().optional(),
notes: z.string().optional(),
})
),
contactController.addContact
);
// Update a contact
router.patch(
'/:contactId',
validateParams(z.object({ contactId: z.string().uuid() })),
validateBody(
z.object({
name: z.string().optional(),
notes: z.string().optional(),
})
),
contactController.updateContact
);
// Remove a contact
router.delete(
'/:contactId',
validateParams(z.object({ contactId: z.string().uuid() })),
contactController.removeContact
);
export default router;

View File

@@ -0,0 +1,69 @@
import express from 'express';
import * as crmEmailController from '../controllers/crm-email.controller.js';
import { authenticate } from '../middlewares/auth/authMiddleware.js';
import { validateBody, validateParams } from '../middlewares/security/validateInput.js';
import { z } from 'zod';
const router = express.Router();
// All email routes require authentication
router.use(authenticate);
/**
* Email management
*/
// Get all emails
router.get('/', crmEmailController.getEmails);
// Search emails
router.get('/search', crmEmailController.searchEmails);
// Get unread count
router.get('/unread-count', crmEmailController.getUnreadCount);
// Get email thread (conversation)
router.get(
'/thread/:threadId',
validateParams(z.object({ threadId: z.string() })),
crmEmailController.getThread
);
// Mark thread as read
router.post(
'/thread/:threadId/read',
validateParams(z.object({ threadId: z.string() })),
crmEmailController.markThreadRead
);
// Get emails for a specific contact
router.get(
'/contact/:contactId',
validateParams(z.object({ contactId: z.string().uuid() })),
crmEmailController.getContactEmails
);
// Mark email as read/unread
router.patch(
'/:jmapId/read',
validateParams(z.object({ jmapId: z.string() })),
validateBody(z.object({ isRead: z.boolean() })),
crmEmailController.markAsRead
);
// Send email reply
router.post(
'/reply',
validateBody(
z.object({
to: z.string().email('Neplatný formát emailu'),
subject: z.string().min(1, 'Subject nemôže byť prázdny'),
body: z.string().min(1, 'Telo emailu nemôže byť prázdne'),
inReplyTo: z.string().optional(),
threadId: z.string().optional(),
})
),
crmEmailController.replyToEmail
);
export default router;