1e7c1eab90d327b85744757c5414b81efc8f539f
CRM Server API
Backend API pre email a kontaktný manažment s podporou viacerých JMAP účtov.
Funkcie
Autentifikácia
- Login - Session-based auth s JWT tokens (httpOnly cookies)
- Onboarding - 3-krokový flow (login → nastavenie hesla → pripojenie emailu)
- Session management - Automatický refresh tokenov
- Role-based access - Admin a Member
Email účty (Multi-account)
- Pridanie účtu - Pripojenie viacerých JMAP účtov
- Šifrovanie hesiel - AES-256-GCM encryption pre JMAP heslá
- Primárny účet - Označenie hlavného účtu
- Cascade delete - Odstránenie účtu vymaže všetky jeho dáta
JMAP Email integrácia
- Sync emailov - Stiahnutie emailov z Truemail.sk JMAP servera
- Thread organizácia - Emaily zoskupené do konverzácií
- Full-text search - Vyhľadávanie v predmete, tele, odosielateľovi
- Posielanie odpovedí - Odpoveď na emaily cez JMAP
- Neprecítané správy - Počítadlo per účet
Kontakty
- Objavovanie - Automatické získanie odosielateľov z emailov
- Auto-sync emailov - Pri pridaní kontaktu sa stiahnu všetky jeho emaily
- CRUD operácie - Pridanie, úprava, odstránenie
- Account filtering - Kontakty izolované per email účet
Správa používateľov (Admin)
- Vytvorenie usera - Auto-generovanie temporary hesla
- Zmena rolí - Admin/Member
- Zoznam používateľov - Len pre adminov
Bezpečnosť
- Password hashing - Bcrypt (12 rounds)
- Rate limiting - Login, API, citlivé operácie
- Helmet - HTTP security headers (CSP, HSTS)
- Input validation - Zod schemas
- SQL injection protection - Drizzle ORM prepared statements
- XSS protection - Sanitizácia inputov
- Audit logging - Všetky dôležité akcie logované
API Endpointy
Autentifikácia /api/auth
POST /login- PrihláseniePOST /set-password- Nastavenie hesla (onboarding)POST /change-password- Zmena heslaPOST /logout- OdhlásenieGET /session- Získanie session infoGET /me- Aktuálny používateľ
Email účty /api/email-accounts
GET /- Zoznam účtovPOST /- Pridanie účtuDELETE /:id- Odstránenie účtuPATCH /:id/primary- Nastavenie primárneho
Admin /api/admin (Admin only)
POST /users- Vytvorenie používateľaGET /users- Zoznam používateľovPATCH /users/:id/role- Zmena roleDELETE /users/:id- Zmazanie používateľa
Kontakty /api/contacts
GET /- Zoznam kontaktov (s accountId filtrom)GET /discover- Potenciálne kontakty z JMAPPOST /- Pridať kontakt + auto-sync emailovPATCH /:id- Upraviť kontaktDELETE /:id- Odstrániť kontakt
Emaily /api/emails
GET /- Zoznam emailov (s accountId filtrom)GET /search- Vyhľadávanie v DBGET /search-jmap- JMAP full-text searchGET /thread/:id- Thread konverzáciePOST /thread/:id/read- Označiť thread ako prečítanýPOST /sync- Manuálna synchronizáciaPOST /reply- Odpovedať na emailGET /unread-count- Počet neprecítaných per účet
Services
auth.service.js
getUserById()- Získanie usera z DBcreateUser()- Vytvorenie nového usera s temp heslomvalidatePassword()- Validácia hesla (bcrypt compare)changePassword()- Zmena hesla s auditom
email-account.service.js
getEmailAccounts()- Zoznam účtov pre useraaddEmailAccount()- Pridanie JMAP účtu (šifrovanie hesla)getEmailAccountWithCredentials()- Účet s dešifrovaným heslomgetPrimaryEmailAccount()- Primárny účetremoveEmailAccount()- Odstránenie s cascade deletesetPrimaryAccount()- Nastavenie primárneho
jmap.service.js
jmapRequest()- HTTP request na JMAP servergetJmapSession()- Získanie JMAP sessiongetJmapConfigFromAccount()- Config z email účtusyncEmailsFromSender()- Sync emailov od kontaktusearchEmailsJMAP()- Full-text search v JMAPsendEmail()- Poslanie odpovede cez JMAPdiscoverContactsFromJMAP()- Objavenie odosielateľov
contact.service.js
getUserContacts()- Kontakty usera (s accountId filtrom)addContact()- Pridanie + auto-sync emailovupdateContact()- Úprava kontakturemoveContact()- Odstránenie + cascade delete
crm-email.service.js
getUserEmails()- Emaily usera (s accountId filtrom)getEmailThread()- Thread konverzáciamarkThreadAsRead()- Označenie threadusearchEmails()- DB vyhľadávaniegetUnreadCount()- Počet neprecítaných per účet
audit.service.js
logAuditEvent()- Zaloguje akciu s IP, user-agent, timestamp
Middlewares
Autentifikácia
authenticate- Validácia JWT tokenu, načítanie userarequireAdmin- Overenie admin rolerequireOwnerOrAdmin- Vlastník alebo admin
Bezpečnosť
loginRateLimiter- 5 pokusov / 15 minapiRateLimiter- 100 requestov / 15 min (dev: 1000)sensitiveOperationLimiter- 3 pokusy / 15 minvalidateBody- Zod schema validáciavalidateParams- Zod params validácia
Global
errorHandler- Centrálne error handlingnotFound- 404 handler
Database Schema
users
- id, username, role (admin/member)
- password, temp_password (bcrypt hash)
- changed_password, last_login
- created_at, updated_at
email_accounts
- id, user_id (FK → users)
- email, email_password (AES-256 encrypted)
- jmap_account_id
- is_primary, is_active
- created_at, updated_at
contacts
- id, user_id (FK → users)
- email_account_id (FK → email_accounts)
- email, name, notes
- added_at, created_at, updated_at
emails
- id, user_id (FK → users)
- email_account_id (FK → email_accounts)
- contact_id (FK → contacts)
- jmap_id, message_id, thread_id
- from, to, subject, body
- is_read, date
- created_at, updated_at
audit_logs
- id, user_id (FK → users)
- action, resource, resource_id
- old_value, new_value (JSON)
- ip_address, user_agent
- success, error_message
- created_at
Konfigurácia
.env
# Server
PORT=5000
NODE_ENV=development
# Database
DB_HOST=localhost
DB_PORT=5432
DB_USER=postgres
DB_PASSWORD=password
DB_NAME=crm
# JWT
JWT_SECRET=your-secret-key
JWT_REFRESH_SECRET=your-refresh-secret
JWT_EXPIRES_IN=1h
# JMAP
JMAP_SERVER=https://mail.truemail.sk/jmap/
# Encryption
ENCRYPTION_KEY=your-32-char-encryption-key
# CORS
CORS_ORIGIN=http://localhost:5173
Skripty
npm run dev # Dev server s nodemon
npm start # Production server
npm run db:generate # Generovanie Drizzle migrácií
npm run db:migrate # Aplikovanie migrácií
npm run db:push # Push schema (bez migrácií)
npm run db:studio # Drizzle Studio (DB GUI)
npm run db:seed # Seed admin account
npm test # Spustenie testov
Spustenie
- Nainštaluj dependencies:
npm install - Nastav
.envs DB credentials a secrets - Spusti PostgreSQL:
docker-compose up -d postgres - Aplikuj migrácie:
npm run db:migrate - Seed admin:
npm run db:seed(uložíš si temp password!) - Spusti server:
npm run dev - API beží na
http://localhost:5000
Systém rolí
Admin
- Všetko čo Member
/api/admin/*endpointy- Vytvorenie/zmazanie používateľov
- Zmena rolí
Member
- Vlastný profil a nastavenia
- Správa vlastných email účtov
- Vlastné kontakty a emaily
- Inbox
JMAP Integrácia
- Provider: Truemail.sk
- Endpoint: https://mail.truemail.sk/jmap/
- Auth: Basic Auth (email + heslo)
- Operácie:
- Email/query - Vyhľadávanie emailov
- Email/get - Získanie detailov
- Email/set - Vytvorenie emailu
- EmailSubmission/set - Poslanie emailu
- Mailbox/get - Zoznam mailboxov
- Identity/get - Email identity
Šifrovanie
JMAP heslá - AES-256-GCM
- Format:
iv:authTag:encryptedText - Kľúč:
ENCRYPTION_KEYz .env (32 znakov) - Funkcie:
encryptPassword(),decryptPassword()
User heslá - Bcrypt
- 12 rounds (2^12 iterations)
- Funkcie:
hashPassword(),comparePassword()
Description
Languages
JavaScript
92%
HTML
7.9%
Dockerfile
0.1%