initialize git, basic setup for crm
This commit is contained in:
49
src/routes/admin.routes.js
Normal file
49
src/routes/admin.routes.js
Normal 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
63
src/routes/auth.routes.js
Normal 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;
|
||||
55
src/routes/contact.routes.js
Normal file
55
src/routes/contact.routes.js
Normal 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;
|
||||
69
src/routes/crm-email.routes.js
Normal file
69
src/routes/crm-email.routes.js
Normal 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;
|
||||
Reference in New Issue
Block a user