docs: proje dokümantasyonunu ekle
README.md ve detaylı teknik dokümantasyon dosyaları (genel bakış, backend yapısı, frontend yapısı, teknoloji yığını) eklendi.
This commit is contained in:
299
README.md
Normal file
299
README.md
Normal file
@@ -0,0 +1,299 @@
|
|||||||
|
# Bookibra 📚
|
||||||
|
|
||||||
|
**Bookibra**, Amazon'dan kitap verilerini çeken, barkod tarama özelliği olan ve kişisel kitap kütüphanesi yönetimi sağlayan modern bir full-stack web uygulamasıdır.
|
||||||
|
|
||||||
|
## 📋 Proje Hakkında
|
||||||
|
|
||||||
|
Bookibra, kitap severler için geliştirilmiş bir platformdur. Ana özellikleri:
|
||||||
|
|
||||||
|
- 🔍 **Kitap Arama**: ISBN veya başlık ile kitap arama
|
||||||
|
- 📸 **Barkod Tarama**: Kamera ile ISBN barkod tarama
|
||||||
|
- 🌍 **Çoklu Dil**: Türkçe ve İngilizce Amazon sitelerinden veri çekme
|
||||||
|
- 💾 **Kütüphane Yönetimi**: Kitapları kaydetme ve organize etme
|
||||||
|
- ⚡ **Önbellekleme**: Redis ile hızlı erişim
|
||||||
|
|
||||||
|
## 🏗️ Mimari
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
|
||||||
|
│ Frontend │─────▶│ Backend │─────▶│ Amazon │
|
||||||
|
│ (React) │ │ (Express) │ │ Scraping │
|
||||||
|
└─────────────┘ └─────────────┘ └─────────────┘
|
||||||
|
│
|
||||||
|
┌───────────────────┼───────────────────┐
|
||||||
|
▼ ▼ ▼
|
||||||
|
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
|
||||||
|
│ Redis │ │ PostgreSQL │ │ Socket.IO │
|
||||||
|
│ (Cache) │ │ (Users) │ │ (WebSocket) │
|
||||||
|
└─────────────┘ └─────────────┘ └─────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🚀 Hızlı Başlangıç
|
||||||
|
|
||||||
|
### Gereksinimler
|
||||||
|
|
||||||
|
- Docker ve Docker Compose
|
||||||
|
- Node.js 20+ (Docker olmadan geliştirme için)
|
||||||
|
|
||||||
|
### Docker ile Başlatma
|
||||||
|
|
||||||
|
1. Projeyi klonlayın:
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/yourusername/bookibra.git
|
||||||
|
cd bookibra
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Ortam değişkenlerini yapılandırın:
|
||||||
|
```bash
|
||||||
|
cp .env.example .env
|
||||||
|
# .env dosyasını düzenleyin (JWT_SECRET vb.)
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Tüm servisleri başlatın:
|
||||||
|
```bash
|
||||||
|
docker-compose up --build
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Tarayıcıda açın:
|
||||||
|
- Frontend: http://localhost:5173
|
||||||
|
- Backend API: http://localhost:8080
|
||||||
|
- Health Check: http://localhost:8080/health
|
||||||
|
|
||||||
|
### Manuel Kurulum (Development)
|
||||||
|
|
||||||
|
#### Backend
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Backend dizininde
|
||||||
|
npm install
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Frontend
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Frontend dizininde
|
||||||
|
npm install
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📁 Proje Yapısı
|
||||||
|
|
||||||
|
```
|
||||||
|
bookibra/
|
||||||
|
├── doc/ # Dokümantasyon
|
||||||
|
├── frontend/ # React Frontend
|
||||||
|
│ ├── src/
|
||||||
|
│ │ ├── components/ # React bileşenleri
|
||||||
|
│ │ ├── pages/ # Sayfalar
|
||||||
|
│ │ ├── context/ # Context API
|
||||||
|
│ │ └── main.jsx # Giriş noktası
|
||||||
|
│ └── package.json
|
||||||
|
├── src/ # Backend
|
||||||
|
│ ├── config/ # Yapılandırma
|
||||||
|
│ ├── controllers/ # Endpoint kontrolcüleri
|
||||||
|
│ ├── middleware/ # Express middleware
|
||||||
|
│ ├── routes/ # API rotaları
|
||||||
|
│ ├── services/ # İş mantığı
|
||||||
|
│ └── utils/ # Yardımcı fonksiyonlar
|
||||||
|
├── docker-compose.yml # Docker orchestration
|
||||||
|
├── Dockerfile # Backend Docker image
|
||||||
|
└── package.json
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔧 Ortam Değişkenleri
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Backend (.env)
|
||||||
|
NODE_ENV=development
|
||||||
|
PORT=8080
|
||||||
|
GEMINI_API_KEY=your_gemini_key # İsteğe bağlı
|
||||||
|
ALLOWED_ORIGINS=*
|
||||||
|
REQUEST_LOGGING=true
|
||||||
|
REDIS_URL=redis://redis:6379
|
||||||
|
ISBN_CACHE_TTL_SECONDS=21600
|
||||||
|
JWT_SECRET=please_change_me # Production'da değiştirin!
|
||||||
|
JWT_EXPIRES_IN=1h
|
||||||
|
|
||||||
|
# PostgreSQL
|
||||||
|
POSTGRES_HOST=postgres
|
||||||
|
POSTGRES_PORT=5432
|
||||||
|
POSTGRES_DB=bookibra
|
||||||
|
POSTGRES_USER=bookibra
|
||||||
|
POSTGRES_PASSWORD=bookibra
|
||||||
|
|
||||||
|
# Frontend (frontend/.env)
|
||||||
|
VITE_API_BASE_URL=http://localhost:8080
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📡 API Endpoint'leri
|
||||||
|
|
||||||
|
### Kitap Arama
|
||||||
|
|
||||||
|
| Endpoint | Method | Açıklama |
|
||||||
|
|----------|--------|----------|
|
||||||
|
| `/api/books/isbn/:isbn` | GET | ISBN ile kitap arama |
|
||||||
|
| `/api/books/title` | GET | Başlık ile kitap arama |
|
||||||
|
| `/api/books/filter` | GET | Başlık ve yıl ile filtreleme |
|
||||||
|
|
||||||
|
**Örnek:**
|
||||||
|
```bash
|
||||||
|
# ISBN ile arama
|
||||||
|
curl "http://localhost:8080/api/books/isbn/9786053717355?locales=tr,en"
|
||||||
|
|
||||||
|
# Başlık ile arama
|
||||||
|
curl "http://localhost:8080/api/books/title?title=Suç%20ve%20Ceza&locales=tr"
|
||||||
|
|
||||||
|
# Tarih filtreleme
|
||||||
|
curl "http://localhost:8080/api/books/filter?title=Sapiens&published=2011"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Kimlik Doğrulama
|
||||||
|
|
||||||
|
| Endpoint | Method | Açıklama |
|
||||||
|
|----------|--------|----------|
|
||||||
|
| `/api/auth/register` | POST | Kayıt olma |
|
||||||
|
| `/api/auth/login` | POST | Giriş yapma |
|
||||||
|
| `/api/auth/profile` | GET | Profil bilgisi (Auth required) |
|
||||||
|
|
||||||
|
**Örnek:**
|
||||||
|
```bash
|
||||||
|
# Kayıt olma
|
||||||
|
curl -X POST http://localhost:8080/api/auth/register \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"email":"user@example.com","password":"password123"}'
|
||||||
|
|
||||||
|
# Giriş yapma
|
||||||
|
curl -X POST http://localhost:8080/api/auth/login \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"email":"user@example.com","password":"password123"}'
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🎨 Kullanım
|
||||||
|
|
||||||
|
### Kitap Arama
|
||||||
|
|
||||||
|
1. **Add Books** sayfasına gidin
|
||||||
|
2. Arama kutusuna kitap adını yazın
|
||||||
|
3. Ara butonuna tıklayın
|
||||||
|
4. Sonuçları görüntüleyin ve kütüphanenize ekleyin
|
||||||
|
|
||||||
|
### Barkod Tarama
|
||||||
|
|
||||||
|
1. **Add Books** sayfasında barkod ikonuna tıklayın
|
||||||
|
2. Kitabın barkodunu kameraya gösterin
|
||||||
|
3. Kitap bilgileri otomatik getirilecek
|
||||||
|
|
||||||
|
### Kütüphane Yönetimi
|
||||||
|
|
||||||
|
1. **My Books** sayfasına gidin
|
||||||
|
2. Kayıtlı kitaplarınızı görüntüleyin
|
||||||
|
3. Detayları görmek için kitaba tıklayın
|
||||||
|
4. Silmek için "Remove from My Books" butonuna tıklayın
|
||||||
|
|
||||||
|
## 🛠️ Geliştirme
|
||||||
|
|
||||||
|
### Backend Development
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run dev # nodemon ile development server
|
||||||
|
npm start # Production server
|
||||||
|
```
|
||||||
|
|
||||||
|
### Frontend Development
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run dev # Vite development server
|
||||||
|
npm run build # Production build
|
||||||
|
npm run preview # Build preview
|
||||||
|
```
|
||||||
|
|
||||||
|
### Docker Development
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Tüm servisleri başlat
|
||||||
|
docker-compose up
|
||||||
|
|
||||||
|
# Arka planda çalıştır
|
||||||
|
docker-compose up -d
|
||||||
|
|
||||||
|
# Logları görüntüle
|
||||||
|
docker-compose logs -f
|
||||||
|
|
||||||
|
# Servisleri durdur
|
||||||
|
docker-compose down
|
||||||
|
|
||||||
|
# Volumes ile birlikte temizle
|
||||||
|
docker-compose down -v
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📚 Dokümantasyon
|
||||||
|
|
||||||
|
Detaylı dokümantasyon için `/doc` dizinine bakın:
|
||||||
|
|
||||||
|
- [Proje Genel Bakış](./doc/proje-genel-bakis.md) - Proje hakkında genel bilgi
|
||||||
|
- [Backend Yapısı](./doc/backend-yapisi.md) - Backend detayları
|
||||||
|
- [Frontend Yapısı](./doc/frontend-yapisi.md) - Frontend detayları
|
||||||
|
- [Teknoloji Yığını](./doc/teknoloji-yigini.md) - Kullanılan teknolojiler
|
||||||
|
|
||||||
|
## 🔐 Güvenlik
|
||||||
|
|
||||||
|
- JWT token tabanlı kimlik doğrulama
|
||||||
|
- bcrypt ile şifre hashleme (10 rounds)
|
||||||
|
- CORS yapılandırması
|
||||||
|
- Input validation (express-validator)
|
||||||
|
|
||||||
|
**Production için:**
|
||||||
|
- `JWT_SECRET` ortam değişkenini güçlü bir değerle değiştirin
|
||||||
|
- HTTPS kullanın
|
||||||
|
- Rate limiting ekleyin
|
||||||
|
- Güvenlik header'larını ekleyin (helmet)
|
||||||
|
|
||||||
|
## 🐛 Sorun Giderme
|
||||||
|
|
||||||
|
### Redis Bağlantı Hatası
|
||||||
|
```bash
|
||||||
|
# Redis container'ının çalıştığından emin olun
|
||||||
|
docker-compose ps redis
|
||||||
|
|
||||||
|
# Redis loglarını kontrol edin
|
||||||
|
docker-compose logs redis
|
||||||
|
```
|
||||||
|
|
||||||
|
### PostgreSQL Bağlantı Hatası
|
||||||
|
```bash
|
||||||
|
# PostgreSQL container'ını kontrol edin
|
||||||
|
docker-compose ps postgres
|
||||||
|
|
||||||
|
# Database'i yeniden oluşturun
|
||||||
|
docker-compose down -v
|
||||||
|
docker-compose up
|
||||||
|
```
|
||||||
|
|
||||||
|
### Frontend API Erişim Hatası
|
||||||
|
```bash
|
||||||
|
# frontend/.env dosyasında VITE_API_BASE_URL'in doğru olduğundan emin olun
|
||||||
|
# Docker kullanıyorsanız: http://localhost:8080
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📝 Lisans
|
||||||
|
|
||||||
|
ISC
|
||||||
|
|
||||||
|
## 🤝 Katkıda Bulunma
|
||||||
|
|
||||||
|
Katkılarınızı bekliyoruz! Lütfen:
|
||||||
|
|
||||||
|
1. Fork yapın
|
||||||
|
2. Feature branch oluşturun (`git checkout -b feature/amazing-feature`)
|
||||||
|
3. Değişikliklerinizi commit edin (`git commit -m 'feat: Add amazing feature'`)
|
||||||
|
4. Branch'inizi push edin (`git push origin feature/amazing-feature`)
|
||||||
|
5. Pull Request açın
|
||||||
|
|
||||||
|
## 👥 Geliştiriciler
|
||||||
|
|
||||||
|
- Bookibra Development Team
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Not**: Bu proje AI agent'ların projeyi daha iyi anlaması için detaylı dokümantasyon ile geliştirilmiştir. Dokümantasyon `/doc` dizininde Türkçe olarak bulunabilir.
|
||||||
351
doc/backend-yapisi.md
Normal file
351
doc/backend-yapisi.md
Normal file
@@ -0,0 +1,351 @@
|
|||||||
|
# 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)
|
||||||
341
doc/frontend-yapisi.md
Normal file
341
doc/frontend-yapisi.md
Normal file
@@ -0,0 +1,341 @@
|
|||||||
|
# Bookibra - Frontend Dokümantasyonu
|
||||||
|
|
||||||
|
## Frontend Genel Bakış
|
||||||
|
|
||||||
|
Frontend, **React 19** ve **Vite** kullanılarak geliştirilmiş modern bir SPA (Single Page Application) uygulamasıdır. Mobil öncelikli tasarıma sahiptir ve kitap arama, barkod tarama, kütüphane yönetimi özellikleri sunar.
|
||||||
|
|
||||||
|
## Teknoloji Yığını
|
||||||
|
|
||||||
|
| Teknoloji | Versiyon | Kullanım Amacı |
|
||||||
|
|-----------|----------|----------------|
|
||||||
|
| React | ^19.1.1 | UI framework |
|
||||||
|
| Vite | ^7.1.7 | Build tool ve dev server |
|
||||||
|
| React Router | ^7.9.5 | Client-side routing |
|
||||||
|
| Framer Motion | ^12.23.24 | Animasyonlar |
|
||||||
|
| FontAwesome | ^7.1.0 | İkonlar |
|
||||||
|
| react-qr-barcode-scanner | ^2.1.18 | Barkod tarama |
|
||||||
|
| react-image-glow | ^1.0.6 | Resim efektleri |
|
||||||
|
| color-thief-react | ^2.1.0 | Renk extract |
|
||||||
|
|
||||||
|
## Dizin Yapısı
|
||||||
|
|
||||||
|
```
|
||||||
|
frontend/src/
|
||||||
|
├── components/ # Yeniden kullanılabilir bileşenler
|
||||||
|
│ ├── BookCard.jsx # Kitap kartı bileşeni
|
||||||
|
│ └── SocialButton.jsx # Sosyal medya butonu
|
||||||
|
├── pages/ # Sayfa bileşenleri
|
||||||
|
│ ├── HomePage.jsx # Ana sayfa
|
||||||
|
│ ├── MyBooksPage.jsx # Kütüphane sayfası
|
||||||
|
│ ├── AddBooksPage.jsx # Kitap ekleme sayfası
|
||||||
|
│ └── ProfilePage.jsx # Profil sayfası
|
||||||
|
├── context/ # React Context
|
||||||
|
│ └── SavedBooksContext.jsx # Kitap kütüphanesi state yönetimi
|
||||||
|
├── assets/ # Statik dosyalar
|
||||||
|
│ ├── booklibra-logo.svg
|
||||||
|
│ └── ...
|
||||||
|
├── App.jsx # Ana uygulama bileşeni
|
||||||
|
├── main.jsx # Uygulama giriş noktası
|
||||||
|
├── App.css # Ana stiller
|
||||||
|
└── index.css # Global stiller
|
||||||
|
```
|
||||||
|
|
||||||
|
## Uygulama Mimarisi
|
||||||
|
|
||||||
|
### App Bileşeni (`src/App.jsx`)
|
||||||
|
|
||||||
|
Uygulamanın kök bileşenidir. Routing ve layout yapısını belirler.
|
||||||
|
|
||||||
|
**Ana Özellikler:**
|
||||||
|
- `SavedBooksProvider` ile context provider wrapping
|
||||||
|
- `BrowserRouter` ile routing
|
||||||
|
- Bottom navigation ile sayfa geçişi
|
||||||
|
|
||||||
|
**Navigasyon Yapısı:**
|
||||||
|
```javascript
|
||||||
|
const tabs = [
|
||||||
|
{ path: '/', label: 'Home', icon: faHouse },
|
||||||
|
{ path: '/my-books', label: 'My Books', icon: faBookOpen },
|
||||||
|
{ path: '/add-books', label: 'Add Books', icon: faPlusCircle },
|
||||||
|
{ path: '/profile', label: 'Profile', icon: faUser }
|
||||||
|
];
|
||||||
|
```
|
||||||
|
|
||||||
|
### Sayfalar
|
||||||
|
|
||||||
|
#### 1. HomePage (`src/pages/HomePage.jsx`)
|
||||||
|
|
||||||
|
Ana sayfa bileşeni. Şu anda basit bir başlık gösterir.
|
||||||
|
|
||||||
|
**Gelecek Özellikler:**
|
||||||
|
- Son eklenen kitaplar
|
||||||
|
- Önerilen kitaplar
|
||||||
|
- İstatistikler
|
||||||
|
|
||||||
|
#### 2. AddBooksPage (`src/pages/AddBooksPage.jsx`)
|
||||||
|
|
||||||
|
Kitap arama ve ekleme sayfası. En karmaşık sayfa bileşenidir.
|
||||||
|
|
||||||
|
**Ana Özellikler:**
|
||||||
|
- Başlık ile arama (yayın yılı filtreleme desteği)
|
||||||
|
- Barkod tarama ile ISBN ile arama
|
||||||
|
- Sonuçları listeleme
|
||||||
|
- Kitapları kütüphaneye ekleme
|
||||||
|
|
||||||
|
**Önemli Fonksiyonlar:**
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// API Base URL çözümleme
|
||||||
|
const resolveApiBaseUrl = () => {
|
||||||
|
// 1. Environment variable kontrolü
|
||||||
|
// 2. Window location tabanlı çözümleme
|
||||||
|
// 3. Default localhost:8080
|
||||||
|
};
|
||||||
|
|
||||||
|
// Arama input'u parsing
|
||||||
|
const parseSearchInput = (raw) => {
|
||||||
|
// "Kitap Adı .2020" → { title: "Kitap Adı", published: "2020" }
|
||||||
|
// "Kitap Adı" → { title: "Kitap Adı", published: undefined }
|
||||||
|
};
|
||||||
|
|
||||||
|
// API cevabını normalizasyon
|
||||||
|
const normalizeBook = (item) => ({
|
||||||
|
title, authorName, thumbImage, page, rate,
|
||||||
|
publisher, description, isbn, raw
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
**Barkod Tarama Akışı:**
|
||||||
|
1. Kamera butonuna tıklama
|
||||||
|
2. `react-qr-barcode-scanner` ile kamera açma
|
||||||
|
3. Barkod algılama (`handleBarcodeUpdate`)
|
||||||
|
4. ISBN ile API çağrısı
|
||||||
|
5. Sonuçları gösterme
|
||||||
|
|
||||||
|
**API Endpoint'ler:**
|
||||||
|
- `/api/books/title?title={query}`
|
||||||
|
- `/api/books/filter?title={query}&published={year}`
|
||||||
|
- `/api/books/isbn/{isbn}?locales=en`
|
||||||
|
|
||||||
|
#### 3. MyBooksPage (`src/pages/MyBooksPage.jsx`)
|
||||||
|
|
||||||
|
Kullanıcının kayıtlı kitaplarını gösterir.
|
||||||
|
|
||||||
|
**Ana Özellikler:**
|
||||||
|
- Kitap listesi görünümü
|
||||||
|
- Kitap detay görünümü
|
||||||
|
- Kitap silme
|
||||||
|
- Görsel efektler (ImageGlow)
|
||||||
|
|
||||||
|
**State Yönetimi:**
|
||||||
|
```javascript
|
||||||
|
const { savedBooks, removeBook } = useSavedBooks();
|
||||||
|
const [selected, setSelected] = useState(null);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Detay Görünümü:**
|
||||||
|
Seçili kitap için:
|
||||||
|
- Kapak resmi (glow efekti ile)
|
||||||
|
- Kitap bilgileri (başlık, yazar, sayfa, puan)
|
||||||
|
- Açıklama
|
||||||
|
- Silme butonu
|
||||||
|
|
||||||
|
#### 4. ProfilePage (`src/pages/ProfilePage.jsx`)
|
||||||
|
|
||||||
|
Kullanıcı profili sayfası. Şu anda placeholder durumunda.
|
||||||
|
|
||||||
|
**Gelecek Özellikler:**
|
||||||
|
- Kullanıcı bilgileri
|
||||||
|
- Ayarlar
|
||||||
|
- İstatistikler
|
||||||
|
|
||||||
|
### Bileşenler
|
||||||
|
|
||||||
|
#### BookCard (`src/components/BookCard.jsx`)
|
||||||
|
|
||||||
|
Tek bir kitabı gösteren kart bileşeni.
|
||||||
|
|
||||||
|
**Props:**
|
||||||
|
```javascript
|
||||||
|
{
|
||||||
|
book: {
|
||||||
|
title: string,
|
||||||
|
authorName: string,
|
||||||
|
thumbImage: string,
|
||||||
|
page: number,
|
||||||
|
rate: number,
|
||||||
|
...
|
||||||
|
},
|
||||||
|
onSelect: (book) => void
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Özellikler:**
|
||||||
|
- Kitap kapak resmi
|
||||||
|
- Başlık ve yazar
|
||||||
|
- Sayfa sayısı ve puan
|
||||||
|
- Tıklanabilir (onSelect callback)
|
||||||
|
|
||||||
|
#### SocialButton (`src/components/SocialButton.jsx`)
|
||||||
|
|
||||||
|
Sosyal medya giriş butonu.
|
||||||
|
|
||||||
|
**Props:**
|
||||||
|
```javascript
|
||||||
|
{
|
||||||
|
provider: 'apple' | 'google',
|
||||||
|
onClick: () => void
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Context Yönetimi
|
||||||
|
|
||||||
|
#### SavedBooksContext (`src/context/SavedBooksContext.jsx`)
|
||||||
|
|
||||||
|
Kitap kütüphanesi için global state yönetimi.
|
||||||
|
|
||||||
|
**API:**
|
||||||
|
```javascript
|
||||||
|
const { savedBooks, addBook, removeBook } = useSavedBooks();
|
||||||
|
```
|
||||||
|
|
||||||
|
**Özellikler:**
|
||||||
|
- `savedBooks`: Kayıtlı kitaplar dizisi
|
||||||
|
- `addBook(book)`: Kitap ekleme (tekrarı kontrol eder)
|
||||||
|
- `removeBook(title)`: Kitap silme
|
||||||
|
|
||||||
|
**Persistence:**
|
||||||
|
Kitaplar `localStorage`'da saklanır:
|
||||||
|
```javascript
|
||||||
|
localStorage.setItem('bookibra_saved_books', JSON.stringify(savedBooks));
|
||||||
|
```
|
||||||
|
|
||||||
|
## Stil Yapısı
|
||||||
|
|
||||||
|
### Ana Layout (`App.css`)
|
||||||
|
|
||||||
|
**Mobile Shell Pattern:**
|
||||||
|
```css
|
||||||
|
.mobile-shell {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
height: 100vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-container {
|
||||||
|
flex: 1;
|
||||||
|
overflow-y: auto;
|
||||||
|
padding-bottom: 70px; /* Bottom nav için boşluk */
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Bottom Navigation:**
|
||||||
|
```css
|
||||||
|
.bottom-nav {
|
||||||
|
position: fixed;
|
||||||
|
bottom: 0;
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-around;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Renk Paleti
|
||||||
|
|
||||||
|
CSS değişkenleri ile tanımlı:
|
||||||
|
```css
|
||||||
|
:root {
|
||||||
|
--primary: /* Ana renk */;
|
||||||
|
--secondary: /* İkincil renk */;
|
||||||
|
--accent: /* Vurgu rengi */;
|
||||||
|
--text: /* Metin rengi */;
|
||||||
|
--bg: /* Arka plan */;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## API Entegrasyonu
|
||||||
|
|
||||||
|
### API Base URL Çözümleme
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const resolveApiBaseUrl = () => {
|
||||||
|
// 1. Environment variable (VITE_API_BASE_URL)
|
||||||
|
if (import.meta.env.VITE_API_BASE_URL)
|
||||||
|
return import.meta.env.VITE_API_BASE_URL;
|
||||||
|
|
||||||
|
// 2. Window location (production)
|
||||||
|
if (typeof window !== 'undefined') {
|
||||||
|
const { protocol, hostname } = window.location;
|
||||||
|
return `${protocol}//${hostname}:8080`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. Default (development)
|
||||||
|
return 'http://localhost:8080';
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
### Örnek API Çağrısı
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const response = await fetch(`${API_BASE_URL}/api/books/isbn/${isbn}?locales=en`);
|
||||||
|
const data = await response.json();
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(data.message || 'Kitap bulunamadi');
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Build ve Deployment
|
||||||
|
|
||||||
|
### Development
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd frontend
|
||||||
|
npm install
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
### Production Build
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run build
|
||||||
|
# Çıktı: dist/ dizini
|
||||||
|
```
|
||||||
|
|
||||||
|
### Docker Build
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
FROM node:20-alpine
|
||||||
|
WORKDIR /app
|
||||||
|
COPY package*.json ./
|
||||||
|
RUN npm install
|
||||||
|
COPY . .
|
||||||
|
RUN npm run build
|
||||||
|
CMD ["npm", "run", "preview"]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Ortam Değişkenleri
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# .env.example (frontend/.env.example)
|
||||||
|
VITE_API_BASE_URL=http://localhost:8080
|
||||||
|
```
|
||||||
|
|
||||||
|
## Performans İpuçları
|
||||||
|
|
||||||
|
1. **Lazy Loading**: Sayfalar ihtiyaç anında yüklenir
|
||||||
|
2. **Image Optimization**: Kapak resimleri lazy loading
|
||||||
|
3. **Local Caching**: Kitaplar localStorage'da saklanır
|
||||||
|
4. **API Debouncing**: Arama input'u için debounce eklenebilir
|
||||||
|
|
||||||
|
## Erişilebilirlik
|
||||||
|
|
||||||
|
- Semantic HTML kullanımı
|
||||||
|
- Keyboard navigation desteği
|
||||||
|
- Screen reader friendly (ikonlar için aria-label)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**İlgili Dosyalar:**
|
||||||
|
- [Proje Genel Bakış](./proje-genel-bakis.md)
|
||||||
|
- [Backend Yapısı](./backend-yapisi.md)
|
||||||
|
- [Teknoloji Yığını](./teknoloji-yigini.md)
|
||||||
132
doc/proje-genel-bakis.md
Normal file
132
doc/proje-genel-bakis.md
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
# Bookibra - Proje Genel Bakış
|
||||||
|
|
||||||
|
## Proje Tanımı
|
||||||
|
|
||||||
|
**Bookibra**, Amazon'dan kitap verilerini çekip sunan, barkod tarama özelliği bulunan ve kullanıcıların kendi kitap kütüphanelerini yönetebilecekleri modern bir full-stack web uygulamasıdır.
|
||||||
|
|
||||||
|
## Ana Özellikler
|
||||||
|
|
||||||
|
### 1. Kitap Arama ve Keşfetme
|
||||||
|
- ISBN ile kitap arama
|
||||||
|
- Kitap başlığı ile arama
|
||||||
|
- Yayın tarihine göre filtreleme (örn: "Kitap Adı .2020")
|
||||||
|
- Çoklu dil desteği (Türkçe/İngiliz Amazon siteleri)
|
||||||
|
|
||||||
|
### 2. Barkod Tarama
|
||||||
|
- Cihaz kamerası ile ISBN barkod tarama
|
||||||
|
- Otomatik kitap bilgisi getirme
|
||||||
|
- Mobil uyumlu tarayıcı arayüzü
|
||||||
|
|
||||||
|
### 3. Kullanıcı Yönetimi
|
||||||
|
- Kayıt olma ve giriş yapma
|
||||||
|
- JWT tabanlı kimlik doğrulama
|
||||||
|
- Profil yönetimi
|
||||||
|
|
||||||
|
### 4. Kitap Kütüphanesi
|
||||||
|
- Kitapları kaydetme (localStorage)
|
||||||
|
- Kayıtlı kitapları görüntüleme
|
||||||
|
- Kitap detaylarını inceleme
|
||||||
|
- Kitap silme
|
||||||
|
|
||||||
|
### 5. Performans ve Önbellekleme
|
||||||
|
- Redis ile önbellekleme sistemi
|
||||||
|
- Medya (kapak resmi) önbellekleme
|
||||||
|
- Amazon API çağrılarını minimize etme
|
||||||
|
|
||||||
|
## Mimari Genel Bakış
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────────────────────────────┐
|
||||||
|
│ CLIENT │
|
||||||
|
│ (React + Vite) │
|
||||||
|
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
|
||||||
|
│ │ HomePage │ │AddBooks │ │ MyBooks │ │ Profile │ │
|
||||||
|
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
|
||||||
|
└─────────────────────────────────────────────────────────────┘
|
||||||
|
│
|
||||||
|
│ HTTP/REST
|
||||||
|
▼
|
||||||
|
┌─────────────────────────────────────────────────────────────┐
|
||||||
|
│ BACKEND API │
|
||||||
|
│ (Express + Node.js) │
|
||||||
|
│ ┌────────────┐ ┌────────────┐ ┌──────────────────────┐ │
|
||||||
|
│ │ Auth Routes│ │Book Routes │ │ Middleware │ │
|
||||||
|
│ └────────────┘ └────────────┘ │ - Auth │ │
|
||||||
|
│ │ - Error Handler │ │
|
||||||
|
│ ┌────────────┐ ┌────────────┐ │ - Request Logger │ │
|
||||||
|
│ │ Controllers│ │ Services │ └──────────────────────┘ │
|
||||||
|
│ └────────────┘ └────────────┘ │
|
||||||
|
└─────────────────────────────────────────────────────────────┘
|
||||||
|
│
|
||||||
|
┌───────────────────┼───────────────────┐
|
||||||
|
▼ ▼ ▼
|
||||||
|
┌───────────────┐ ┌────────────────┐ ┌──────────────┐
|
||||||
|
│ Redis │ │ PostgreSQL │ │ Socket.IO │
|
||||||
|
│ (Cache) │ │ (Users DB) │ │ (WebSocket) │
|
||||||
|
└───────────────┘ └────────────────┘ └──────────────┘
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
┌─────────────────────────────────────────┐
|
||||||
|
│ External Services │
|
||||||
|
│ ┌──────────────┐ ┌──────────────┐ │
|
||||||
|
│ │ Amazon │ │ Gemini AI │ │
|
||||||
|
│ │ Scraping │ │ (Optional) │ │
|
||||||
|
│ └──────────────┘ └──────────────┘ │
|
||||||
|
└─────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## Proje Yapısı
|
||||||
|
|
||||||
|
### Dizin Hiyerarşisi
|
||||||
|
|
||||||
|
```
|
||||||
|
bookibra/
|
||||||
|
├── doc/ # Dokümantasyon
|
||||||
|
├── frontend/ # React Frontend Uygulaması
|
||||||
|
│ ├── src/
|
||||||
|
│ │ ├── components/ # React Bileşenleri
|
||||||
|
│ │ ├── pages/ # Sayfa Bileşenleri
|
||||||
|
│ │ ├── context/ # React Context API
|
||||||
|
│ │ └── main.jsx # Uygulama Giriş Noktası
|
||||||
|
│ └── package.json
|
||||||
|
├── src/ # Backend Kaynak Kodları
|
||||||
|
│ ├── config/ # Yapılandırma Dosyaları
|
||||||
|
│ ├── controllers/ # İstek Kontrolcüleri
|
||||||
|
│ ├── middleware/ # Express Middleware
|
||||||
|
│ ├── routes/ # API Rotaları
|
||||||
|
│ ├── services/ # İş Mantığı Servisleri
|
||||||
|
│ ├── utils/ # Yardımcı Fonksiyonlar
|
||||||
|
│ ├── validators/ # İstek Doğrulayıcıları
|
||||||
|
│ ├── app.js # Express Uygulaması
|
||||||
|
│ └── server.js # HTTP Sunucusu
|
||||||
|
├── docker-compose.yml # Docker Orchestration
|
||||||
|
├── Dockerfile # Backend Docker Image
|
||||||
|
└── package.json
|
||||||
|
```
|
||||||
|
|
||||||
|
## Çalışma Prensibi
|
||||||
|
|
||||||
|
### Kitap Arama Akışı
|
||||||
|
|
||||||
|
1. **Kullanıcı İsteği**: Frontend'den arama parametresi gönderilir
|
||||||
|
2. **Önbellek Kontrolü**: Redis'te önceden yapılmmış arama var mı kontrol edilir
|
||||||
|
3. **Amazon Scraping**: Önbellekte yoksa Amazon'dan veri çekilir
|
||||||
|
4. **Veri İşleme**: HTML parse edilir ve kitap bilgileri çıkarılır
|
||||||
|
5. **Önbellekleme**: Sonuçlar Redis'e kaydedilir
|
||||||
|
6. **Cevap**: İşlenmiş veri frontend'e gönderilir
|
||||||
|
|
||||||
|
### Barkod Tarama Akışı
|
||||||
|
|
||||||
|
1. **Kamera Erişimi**: React-qr-barcode-scanner ile kamera açılır
|
||||||
|
2. **Barkod Algılama**: ISBN formatında barkod algılanır
|
||||||
|
3. **ISBN Arama**: Backend'e ISBN ile kitap bilgisi istenir
|
||||||
|
4. **Kitap Gösterimi**: Bulunan kitap kullanıcıya sunulur
|
||||||
|
|
||||||
|
## Deployment
|
||||||
|
|
||||||
|
Uygulama Docker Compose ile tüm servisleri (frontend, backend, redis, postgres) tek seferde başlatmayı destekler.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Son Güncelleme**: 2026-02-10
|
||||||
|
**Versiyon**: 1.0.0
|
||||||
211
doc/teknoloji-yigini.md
Normal file
211
doc/teknoloji-yigini.md
Normal file
@@ -0,0 +1,211 @@
|
|||||||
|
# Bookibra - Teknoloji Yığını
|
||||||
|
|
||||||
|
## Teknoloji Yığınına Genel Bakış
|
||||||
|
|
||||||
|
Bookibra, modern web teknolojileri ile geliştirilmiş full-stack bir uygulamadır. Aşağıda kullanılan tüm teknolojiler, neden kullanıldıkları ve projedeki rolleri detaylı olarak açıklanmıştır.
|
||||||
|
|
||||||
|
## Backend Tekolojileri
|
||||||
|
|
||||||
|
### Runtime ve Framework
|
||||||
|
|
||||||
|
| Teknoloji | Versiyon | Kullanım Amacı | Neden Seçildi? |
|
||||||
|
|-----------|----------|----------------|----------------|
|
||||||
|
| **Node.js** | LTS | JavaScript runtime | Sunucu tarafında JavaScript kullanımı, büyük ekosistem, asenkron I/O |
|
||||||
|
| **Express.js** | ^5.1.0 | Web framework | Minimal, esnek, büyük middleware ekosistemi |
|
||||||
|
|
||||||
|
### Web Scraping
|
||||||
|
|
||||||
|
| Teknoloji | Versiyon | Kullanım Amacı | Neden Seçildi? |
|
||||||
|
|-----------|----------|----------------|----------------|
|
||||||
|
| **axios** | ^1.13.2 | HTTP istekleri | Promise-based, interceptor desteği, otomatik JSON dönüşümü |
|
||||||
|
| **cheerio** | ^1.1.2 | HTML parsing | jQuery syntax, hızlı ve hafif |
|
||||||
|
| **szbk-amazon-book-search** | ^1.1.1 | Amazon scraping | Amazon'a özelleşmiş scraping kütüphanesi |
|
||||||
|
|
||||||
|
### Veritabanı ve Önbellekleme
|
||||||
|
|
||||||
|
| Teknoloji | Versiyon | Kullanım Amacı | Neden Seçildi? |
|
||||||
|
|-----------|----------|----------------|----------------|
|
||||||
|
| **PostgreSQL** | 8.16.3 (client) | İlişkisel veritabanı | ACID uyumlu, güçlü, açık kaynak |
|
||||||
|
| **ioredis** | ^5.8.2 | Redis client | Promise-based, cluster desteği |
|
||||||
|
| **Redis** | 7-alpine | Önbellekleme | In-memory store, hızlı, TTL desteği |
|
||||||
|
|
||||||
|
### Kimlik Doğrulama ve Güvenlik
|
||||||
|
|
||||||
|
| Teknoloji | Versiyon | Kullanım Amacı | Neden Seçildi? |
|
||||||
|
|-----------|----------|----------------|----------------|
|
||||||
|
| **jsonwebtoken** | ^9.0.2 | JWT token oluşturma | Stateless auth, standart, güvenli |
|
||||||
|
| **bcrypt** | ^6.0.0 | Şifre hashleme | Güçlü hash algoritması, salting |
|
||||||
|
| **express-validator** | ^7.3.0 | Input validation | Express ile entegre, decorator-based |
|
||||||
|
|
||||||
|
### Gerçek Zamanlı İletişim
|
||||||
|
|
||||||
|
| Teknoloji | Versiyon | Kullanım Amacı | Neden Seçildi? |
|
||||||
|
|-----------|----------|----------------|----------------|
|
||||||
|
| **Socket.IO** | ^4.8.1 | WebSocket server | Fall-back mekanizması, room desteği |
|
||||||
|
|
||||||
|
### Araçlar ve Yardımcılar
|
||||||
|
|
||||||
|
| Teknoloji | Versiyon | Kullanım Amacı | Neden Seçildi? |
|
||||||
|
|-----------|----------|----------------|----------------|
|
||||||
|
| **dotenv** | ^17.2.3 | Ortam değişkenleri | .env dosyası yönetimi |
|
||||||
|
| **cors** | ^2.8.5 | CORS middleware | Cross-origin resource sharing |
|
||||||
|
| **chalk** | ^4.1.2 | Terminal renklendirme | Logları okunabilir yapma |
|
||||||
|
| **uuid** | ^13.0.0 | UUID oluşturma | Benzersiz ID oluşturma |
|
||||||
|
| **nodemon** | ^3.1.10 | Otomatik restart | Development sırasında kolaylık |
|
||||||
|
|
||||||
|
## Frontend Teknolojileri
|
||||||
|
|
||||||
|
### Core Framework
|
||||||
|
|
||||||
|
| Teknoloji | Versiyon | Kullanım Amacı | Neden Seçildi? |
|
||||||
|
|-----------|----------|----------------|----------------|
|
||||||
|
| **React** | ^19.1.1 | UI framework | Component-based, büyük ekosistem, hooks |
|
||||||
|
| **Vite** | ^7.1.7 | Build tool ve dev server | Hızlı HMR, native ES modules |
|
||||||
|
|
||||||
|
### Routing
|
||||||
|
|
||||||
|
| Teknoloji | Versiyon | Kullanım Amacı | Neden Seçildi? |
|
||||||
|
|-----------|----------|----------------|----------------|
|
||||||
|
| **React Router** | ^7.9.5 | Client-side routing | Declarative routing, nested routes |
|
||||||
|
|
||||||
|
### Animasyonlar
|
||||||
|
|
||||||
|
| Teknoloji | Versiyon | Kullanım Amacı | Neden Seçildi? |
|
||||||
|
|-----------|----------|----------------|----------------|
|
||||||
|
| **Framer Motion** | ^12.23.24 | Animasyon library | Declarative API, gesture desteği |
|
||||||
|
|
||||||
|
### İkonlar ve Görseller
|
||||||
|
|
||||||
|
| Teknoloji | Versiyon | Kullanım Amacı | Neden Seçildi? |
|
||||||
|
|-----------|----------|----------------|----------------|
|
||||||
|
| **Font Awesome** | ^7.1.0 | İkon seti | Geniş ikon kütüphanesi |
|
||||||
|
| **react-image-glow** | ^1.0.6 | Resim efekti | Estetik glow efekti |
|
||||||
|
| **color-thief-react** | ^2.1.0 | Renk extract | Resimlerden ana renk alma |
|
||||||
|
|
||||||
|
### Barkod Tarama
|
||||||
|
|
||||||
|
| Teknoloji | Versiyon | Kullanım Amacı | Neden Seçildi? |
|
||||||
|
|-----------|----------|----------------|----------------|
|
||||||
|
| **react-qr-barcode-scanner** | ^2.1.18 | Barkod tarama | Hem QR hem barkod desteği |
|
||||||
|
|
||||||
|
### Development Araçları
|
||||||
|
|
||||||
|
| Teknoloji | Versiyon | Kullanım Amacı | Neden Seçildi? |
|
||||||
|
|-----------|----------|----------------|----------------|
|
||||||
|
| **ESLint** | ^9.36.0 | Linter | Kod kalitesi, tutarlılık |
|
||||||
|
| **@vitejs/plugin-react** | ^5.0.4 | React için Vite plugin | Fast refresh, JSX support |
|
||||||
|
|
||||||
|
## DevOps Teknolojileri
|
||||||
|
|
||||||
|
### Containerization
|
||||||
|
|
||||||
|
| Teknoloji | Versiyon | Kullanım Amacı | Neden Seçildi? |
|
||||||
|
|-----------|----------|----------------|----------------|
|
||||||
|
| **Docker** | Latest | Containerization | Tutarlı deployment, izolasyon |
|
||||||
|
| **Docker Compose** | Latest | Multi-container orchestration | Local development, tüm servisleri bir arada |
|
||||||
|
|
||||||
|
### Docker Hizmetleri
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
frontend: # React uygulaması
|
||||||
|
api: # Express backend
|
||||||
|
redis: # Önbellekleme
|
||||||
|
postgres: # Kullanıcı veritabanı
|
||||||
|
```
|
||||||
|
|
||||||
|
## Veri Akışı Diyagramı
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────────────────────────────┐
|
||||||
|
│ USER BROWSER │
|
||||||
|
│ (React App) │
|
||||||
|
└─────────────────────────────────────────────────────────────┘
|
||||||
|
│
|
||||||
|
│ HTTP Request
|
||||||
|
▼
|
||||||
|
┌─────────────────────────────────────────────────────────────┐
|
||||||
|
│ EXPRESS SERVER │
|
||||||
|
│ ┌──────────────────────────────────────────────────────┐ │
|
||||||
|
│ │ Request Logging → Auth → Route → Controller │ │
|
||||||
|
│ └──────────────────────────────────────────────────────┘ │
|
||||||
|
└─────────────────────────────────────────────────────────────┘
|
||||||
|
│
|
||||||
|
┌───────────────────┼───────────────────┐
|
||||||
|
▼ ▼ ▼
|
||||||
|
┌───────────────┐ ┌────────────────┐ ┌──────────────┐
|
||||||
|
│ REDIS │ │ POSTGRES │ │ AMAZON │
|
||||||
|
│ Check & │ │ User Data │ │ Scraping │
|
||||||
|
│ Store │ │ Auth │ │ Book Data │
|
||||||
|
└───────────────┘ └────────────────┘ └──────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## Paket Yönetimi
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
```bash
|
||||||
|
npm install # Development
|
||||||
|
npm run dev # Development server (nodemon)
|
||||||
|
npm start # Production server
|
||||||
|
```
|
||||||
|
|
||||||
|
### Frontend
|
||||||
|
```bash
|
||||||
|
npm install # Development
|
||||||
|
npm run dev # Development server (Vite)
|
||||||
|
npm run build # Production build
|
||||||
|
npm run preview # Production preview
|
||||||
|
```
|
||||||
|
|
||||||
|
## Versiyon Yönetimi
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"name": "bookibra",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Amazon kitap verilerini sunan Express tabanli backend"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Bağımlılık Yönetimi Stratejisi
|
||||||
|
|
||||||
|
### Semantic Versioning
|
||||||
|
- `^` (caret): Minor güncellemelere izin verir
|
||||||
|
- `~` (tilde): Patch güncellemelere izin verir
|
||||||
|
- Tam versiyon: Kilidi korur
|
||||||
|
|
||||||
|
### Güvenlik
|
||||||
|
- Düzenli `npm audit` çalıştırma
|
||||||
|
- Vulnerability takibi
|
||||||
|
- Güncel bağımlılıklar
|
||||||
|
|
||||||
|
## Performans Optimizasyonları
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
1. **Redis Önbellekleme**: 6 saat TTL ile kitap verileri önbellekte tutulur
|
||||||
|
2. **Connection Pooling**: PostgreSQL için connection pooling
|
||||||
|
3. **Lazy Connection**: Redis için lazy connect
|
||||||
|
4. **Asenkron İşlemler**: Promise.all ile parallel işlemler
|
||||||
|
|
||||||
|
### Frontend
|
||||||
|
1. **Code Splitting**: Vite ile otomatik code splitting
|
||||||
|
2. **Tree Shaking**: Kullanılmayan kod eliminasyonu
|
||||||
|
3. **Image Optimization**: Lazy loading
|
||||||
|
4. **Local Storage**: İstemci taraflı veri saklama
|
||||||
|
|
||||||
|
## Gelecek Teknoloji Eklentileri
|
||||||
|
|
||||||
|
Potansiyel iyileştirmeler:
|
||||||
|
1. **GraphQL**: REST yerine daha verimli sorgular
|
||||||
|
2. **TypeScript**: Tip güvenliği
|
||||||
|
3. **Testing Framework**: Jest, Cypress
|
||||||
|
4. **CI/CD**: GitHub Actions, GitLab CI
|
||||||
|
5. **Monitoring**: Prometheus, Grafana
|
||||||
|
6. **Load Balancer**: Nginx, HAProxy
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**İlgili Dosyalar:**
|
||||||
|
- [Proje Genel Bakış](./proje-genel-bakis.md)
|
||||||
|
- [Backend Yapısı](./backend-yapisi.md)
|
||||||
|
- [Frontend Yapısı](./frontend-yapisi.md)
|
||||||
Reference in New Issue
Block a user