# Bookibra - Backend Dokümantasyonu ## Backend Genel Bakış Backend, **Node.js** ve **Express.js** kullanılarak geliştirilmiş REST API sunucusudur. Amazon kitap verilerini scraping eder, kullanıcı kimlik doğrulaması yönetir ve önbellekleme sağlar. ## Teknoloji Yığını | Teknoloji | Versiyon | Kullanım Amacı | |-----------|----------|----------------| | Express | ^5.1.0 | Web framework | | Node.js | - | Runtime environment | | PostgreSQL | 8.16.3 | Kullanıcı veritabanı | | Redis (ioredis) | ^5.8.2 | Önbellekleme | | Socket.IO | ^4.8.1 | WebSocket desteği | | JWT | ^9.0.2 | Kimlik doğrulama | | bcrypt | ^6.0.0 | Şifre hashleme | | Axios | ^1.13.2 | HTTP istekleri | | Cheerio | ^1.1.2 | HTML parsing | ## Dizin Yapısı ``` src/ ├── config/ │ ├── env.js # Ortam değişkenleri yapılandırması │ ├── services.js # Redis ve PostgreSQL bağlantıları │ └── socket.js # Socket.IO yapılandırması ├── controllers/ │ ├── authController.js # Kimlik doğrulama endpoint'leri │ └── bookController.js # Kitap arama endpoint'leri ├── middleware/ │ ├── auth.js # JWT doğrulama middleware │ ├── errorHandler.js # Hata yakalama middleware │ ├── notFound.js # 404 middleware │ └── requestLogger.js # İstek loglama middleware ├── routes/ │ ├── authRoutes.js # /api/auth rotaları │ └── bookRoutes.js # /api/books rotaları ├── services/ │ ├── amazonService.js # Amazon scraping iş mantığı │ ├── cacheService.js # Redis önbellekleme │ └── userService.js # Kullanıcı işlemleri ├── utils/ │ ├── isbn.js # ISBN doğrulama ve normalizasyon │ ├── logger.js # Loglama yardımcıları │ ├── mediaCache.js # Medya önbellekleme │ └── request.js # İstek parametre çözümleme ├── validators/ │ └── authValidators.js # İstek doğrulama kuralları ├── app.js # Express uygulaması └── server.js # HTTP sunucusu ``` ## API Endpoint'leri ### Sağlık Kontrolü ``` GET /health ``` **Cevap**: `{"status": "ok", "timestamp": "2026-02-10T..."}` ### Kitap Endpoint'leri #### ISBN ile Arama ``` GET /api/books/isbn/:isbn ``` **Query Parametreleri:** - `locales` (string): Amazon siteleri (örn: "tr,en" veya "tr") - `withGemini` (boolean): Gemini AI entegrasyonu - `limit` (number): Sonuç sayısı limiti **Örnek:** ``` GET /api/books/isbn/9786053717355?locales=tr,en&withGemini=false&limit=3 ``` **Cevap:** ```json { "isbn": "9786053717355", "normalizedIsbn": "9786053717355", "locales": ["tr", "en"], "includeGemini": false, "data": { "tr": { "title": "Suç ve Ceza", "authorName": "Fyodor Dostoyevski", "isbn": "9786053717355", "thumbImage": "https://...", "page": 752, "rate": 4.5, "publisher": "İthaki Yayınları" }, "en": { ... } }, "cacheHit": false, "cachedAt": "2026-02-10T..." } ``` #### Başlık ile Arama ``` GET /api/books/title?title={kitap-adi} ``` **Query Parametreleri:** - `title` (required): Kitap başlığı - `locales` (optional): Amazon siteleri - `withGemini` (optional): Gemini AI entegrasyonu - `limit` (optional): Sonuç limiti (default: 3) **Örnek:** ``` GET /api/books/title?title=Su%C3%A7%20ve%20Ceza&locales=tr&limit=5 ``` #### Başlık ve Tarihe Göre Filtreleme ``` GET /api/books/filter?title={kitap-adi}&published={yil} ``` **Query Parametreleri:** - `title` (required): Kitap başlığı - `published` (required): Yayın yılı - `locales`, `withGemini`, `limit`: ISBN aramasıyla aynı **Örnek:** ``` GET /api/books/filter?title=Sapiens&published=2011&locales=en ``` ### Kimlik Doğrulama Endpoint'leri #### Kayıt Olma ``` POST /api/auth/register ``` **İstek Gövdesi:** ```json { "email": "ornek@email.com", "password": "sifre123" } ``` **Cevap:** ```json { "token": "eyJhbGciOiJIUzI1NiIs...", "user": { "id": "uuid", "email": "ornek@email.com" } } ``` #### Giriş Yapma ``` POST /api/auth/login ``` **İstek Gövdesi:** Kayıt olma ile aynı **Cevap:** Kayıt olma ile aynı #### Profil Bilgisi ``` GET /api/auth/profile ``` **Header:** `Authorization: Bearer {token}` **Cevap:** ```json { "user": { "id": "uuid", "email": "ornek@email.com" } } ``` ## Middleware Yapısı ### 1. Auth Middleware (`src/middleware/auth.js`) JWT token doğrulaması yapar. ```javascript // Kullanıcı req.user = { id: decoded.sub, email: decoded.email } ``` ### 2. Error Handler Middleware (`src/middleware/errorHandler.js`) Hataları yakalar ve standart formatta döner. ```javascript // Cevap formatı res.status(error.status || 500).json({ message: error.message || 'Sunucu hatası' }) ``` ### 3. Request Logger Middleware (`src/middleware/requestLogger.js`) Her isteği loglar. Ortam değişkeni ile kontrol edilir: - `REQUEST_LOGGING=true` → Aktif ### 4. Not Found Middleware (`src/middleware/notFound.js`) Tanımsız rotalar için 404 döner. ## Servis Katmanı ### Amazon Service (`src/services/amazonService.js`) Amazon'dan kitap verisi çekme iş mantığı. **Ana Fonksiyonlar:** - `getBooksByIsbn(isbn, locales, includeGemini)`: ISBN ile arama - `searchBooksByTitle({ title, locales, includeGemini, limit })`: Başlık ile arama - `searchBooksByTitleAndDate(...)`: Başlık ve tarih ile arama **Dış Bağımlılıklar:** - `szbk-amazon-book-search`: Amazon scraping kütüphanesi ### Cache Service (`src/services/cacheService.js`) Redis ile önbellekleme iş mantığı. **Cache Anahtar Formatları:** - ISBN: `book:isbn:{isbn}:loc={tr,en}:gem={0|1}` - Title: `book:title:q={title}:loc={...}:gem={...}:limit={n}` - Filter: `book:filter:q={title}:pub={year}:loc={...}:gem={...}:limit={n}` **Cache TTL:** 6 saat (21600 saniye) ### User Service (`src/services/userService.js`) PostgreSQL ile kullanıcı işlemleri. **Veritabanı Tablosu:** ```sql CREATE TABLE users ( id VARCHAR(36) PRIMARY KEY, email VARCHAR(255) UNIQUE NOT NULL, password_hash TEXT NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); ``` **Ana Fonksiyonlar:** - `ensureUserTable()`: Tablo oluşturma - `createUser({ email, password })`: Yeni kullanıcı - `validateCredentials({ email, password })`: Giriş doğrulama - `buildAuthResponse(user)`: Token ve kullanıcı bilgisi ## Socket.IO Entegrasyonu WebSocket bağlantıları için Socket.IO kullanılır. **Yapılandırma (`src/config/socket.js`):** ```javascript // Bağlantı eventi io.on('connection', (socket) => { socket.emit('connection:ack', { message: 'Bookibra soket servisine hos geldiniz.' }); }); ``` ## Veritabanı Yapılandırması ### PostgreSQL Bağlantısı ```javascript // src/config/services.js const pgPool = new Pool({ host: env.postgres.host, // postgres port: env.postgres.port, // 5432 database: env.postgres.database, // bookibra user: env.postgres.user, // bookibra password: env.postgres.password // bookibra }); ``` ### Redis Bağlantısı ```javascript const redis = new Redis(env.redisUrl, { lazyConnect: true, maxRetriesPerRequest: null }); ``` ## Ortam Değişkenleri ```bash NODE_ENV=development PORT=8080 GEMINI_API_KEY=your_gemini_key # İsteğe bağlı ALLOWED_ORIGINS=* # CORS için REQUEST_LOGGING=true REDIS_URL=redis://redis:6379 ISBN_CACHE_TTL_SECONDS=21600 JWT_SECRET=please_change_me # Production'da değiştirilmeli JWT_EXPIRES_IN=1h POSTGRES_HOST=postgres POSTGRES_PORT=5432 POSTGRES_DB=bookibra POSTGRES_USER=bookibra POSTGRES_PASSWORD=bookibra ``` ## Hata Yönetimi Tüm hatalar `errorHandler` middleware tarafından yakalanır. **Hata Durum Kodları:** - `400`: Geçersiz istek parametresi - `401`: Kimlik doğrulama hatası - `404`: Kaynak bulunamadı - `409`: Çakışma (örn: email zaten kayıtlı) - `500`: Sunucu hatası ## Güvenlik 1. **JWT**: Kimlik doğrulama için JWT token kullanılır 2. **bcrypt**: Şifreler hash'lenir (10 rounds) 3. **CORS**: Çapraz kaynak istekleri kontrol edilir 4. **Input Validation**: express-validator ile istek doğrulama --- **İlgili Dosyalar:** - [Proje Genel Bakış](./proje-genel-bakis.md) - [Frontend Yapısı](./frontend-yapisi.md) - [Teknoloji Yığını](./teknoloji-yigini.md)