Files
crm-server/README.md

272 lines
8.0 KiB
Markdown

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