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ásenie
  • POST /set-password - Nastavenie hesla (onboarding)
  • POST /change-password - Zmena hesla
  • POST /logout - Odhlásenie
  • GET /session - Získanie session info
  • GET /me - Aktuálny používateľ

Email účty /api/email-accounts

  • GET / - Zoznam účtov
  • POST / - Pridanie účtu
  • DELETE /:id - Odstránenie účtu
  • PATCH /:id/primary - Nastavenie primárneho

Admin /api/admin (Admin only)

  • POST /users - Vytvorenie používateľa
  • GET /users - Zoznam používateľov
  • PATCH /users/:id/role - Zmena role
  • DELETE /users/:id - Zmazanie používateľa

Kontakty /api/contacts

  • GET / - Zoznam kontaktov (s accountId filtrom)
  • GET /discover - Potenciálne kontakty z JMAP
  • POST / - Pridať kontakt + auto-sync emailov
  • PATCH /:id - Upraviť kontakt
  • DELETE /:id - Odstrániť kontakt

Emaily /api/emails

  • GET / - Zoznam emailov (s accountId filtrom)
  • GET /search - Vyhľadávanie v DB
  • GET /search-jmap - JMAP full-text search
  • GET /thread/:id - Thread konverzácie
  • POST /thread/:id/read - Označiť thread ako prečítaný
  • POST /sync - Manuálna synchronizácia
  • POST /reply - Odpovedať na email
  • GET /unread-count - Počet neprecítaných per účet

Services

auth.service.js

  • getUserById() - Získanie usera z DB
  • createUser() - Vytvorenie nového usera s temp heslom
  • validatePassword() - Validácia hesla (bcrypt compare)
  • changePassword() - Zmena hesla s auditom

email-account.service.js

  • getEmailAccounts() - Zoznam účtov pre usera
  • addEmailAccount() - Pridanie JMAP účtu (šifrovanie hesla)
  • getEmailAccountWithCredentials() - Účet s dešifrovaným heslom
  • getPrimaryEmailAccount() - Primárny účet
  • removeEmailAccount() - Odstránenie s cascade delete
  • setPrimaryAccount() - Nastavenie primárneho

jmap.service.js

  • jmapRequest() - HTTP request na JMAP server
  • getJmapSession() - Získanie JMAP session
  • getJmapConfigFromAccount() - Config z email účtu
  • syncEmailsFromSender() - Sync emailov od kontaktu
  • searchEmailsJMAP() - Full-text search v JMAP
  • sendEmail() - Poslanie odpovede cez JMAP
  • discoverContactsFromJMAP() - Objavenie odosielateľov

contact.service.js

  • getUserContacts() - Kontakty usera (s accountId filtrom)
  • addContact() - Pridanie + auto-sync emailov
  • updateContact() - Úprava kontaktu
  • removeContact() - Odstránenie + cascade delete

crm-email.service.js

  • getUserEmails() - Emaily usera (s accountId filtrom)
  • getEmailThread() - Thread konverzácia
  • markThreadAsRead() - Označenie threadu
  • searchEmails() - DB vyhľadávanie
  • getUnreadCount() - 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 usera
  • requireAdmin - Overenie admin role
  • requireOwnerOrAdmin - Vlastník alebo admin

Bezpečnosť

  • loginRateLimiter - 5 pokusov / 15 min
  • apiRateLimiter - 100 requestov / 15 min (dev: 1000)
  • sensitiveOperationLimiter - 3 pokusy / 15 min
  • validateBody - Zod schema validácia
  • validateParams - Zod params validácia

Global

  • errorHandler - Centrálne error handling
  • notFound - 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

  1. Nainštaluj dependencies: npm install
  2. Nastav .env s DB credentials a secrets
  3. Spusti PostgreSQL: docker-compose up -d postgres
  4. Aplikuj migrácie: npm run db:migrate
  5. Seed admin: npm run db:seed (uložíš si temp password!)
  6. Spusti server: npm run dev
  7. 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_KEY z .env (32 znakov)
  • Funkcie: encryptPassword(), decryptPassword()

User heslá - Bcrypt

  • 12 rounds (2^12 iterations)
  • Funkcie: hashPassword(), comparePassword()
Description
No description provided
Readme 5.5 MiB
Languages
JavaScript 92%
HTML 7.9%
Dockerfile 0.1%