# 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** ```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 ```bash 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()`