272 lines
8.0 KiB
Markdown
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()`
|