# 🚀 GAuth-Central Kurulum Rehberi

## Hızlı Başlangıç

### Option 1: Standalone Mode (Mevcut Sunucular ile)

Eğer zaten çalışan PostgreSQL ve Redis sunucularınız varsa:

```bash
# 1. .env dosyasını kontrol edin ve sunucu bilgilerini girin
# DB_URL="host=YOUR_HOST user=YOUR_USER password=YOUR_PASS dbname=YOUR_DB..."
# REDIS_URL=redis://user:pass@YOUR_HOST:6379/0

# 2. Uygulamayı başlatın
./start.sh
```

Script şunları yapacaktır:
- ✅ .env dosyasını kontrol eder
- ✅ PostgreSQL bağlantısını test eder
- ✅ Redis bağlantısını test eder
- ✅ Uygulamayı derler ve başlatır

### Option 2: Docker ile (Yeni Kurulum)

```bash
# 1. Start-with-docker scriptini çalıştırın
./start-with-docker.sh

# 2. Logları izleyin
docker-compose logs -f app
```

### Option 2: Docker ile (Yeni Kurulum)

```bash
# 1. Start-with-docker scriptini çalıştırın
./start-with-docker.sh

# 2. Logları izleyin
docker-compose logs -f app
```

### Option 3: Manuel Kurulum (Sadece Uygulama)

**Not:** Bu option mevcut PostgreSQL ve Redis sunucularınızla çalışmak için kullanılır.

#### 1. Bağımlılıkları Yükleyin

```bash
go mod download
```

#### 2. .env Dosyasını Yapılandırın

```bash
# .env dosyasını düzenleyin
nano .env
```

Gerekli ayarlar:
```env
PORT=8080

# Mevcut PostgreSQL sunucunuz
DB_URL="host=10.80.80.70 user=cloud password=xxx dbname=go_gauth port=5432 sslmode=disable TimeZone=Europe/Istanbul"

# Mevcut Redis sunucunuz
REDIS_URL=redis://default:xxx@10.80.80.70:6379/0

# JWT Secret
JWT_SECRET=your_super_secret_key

# OAuth credentials (opsiyonel)
GOOGLE_CLIENT_ID=...
GOOGLE_CLIENT_SECRET=...
GITHUB_CLIENT_ID=...
GITHUB_CLIENT_SECRET=...
CLIENT_CALLBACK_URL=http://localhost:8080/v1/auth
```

#### 3. Uygulamayı Çalıştırın

```bash
# Quick start script ile
./start.sh

# veya manuel
go build -o main .
./main

# veya doğrudan
go run main.go
```

### Option 4: Docker ile Sadece Veritabanları

### Option 4: Docker ile Sadece Veritabanları

Eğer uygulamayı local'de çalıştırıp sadece veritabanlarını Docker'da tutmak isterseniz:

#### 1. PostgreSQL'i Başlatın

```bash
docker run -d \
  --name gauth_postgres \
  -e POSTGRES_USER=postgres \
  -e POSTGRES_PASSWORD=yourpassword \
  -e POSTGRES_DB=gauth \
  -p 5432:5432 \
  postgres:17-alpine
```

#### 2. Redis'i Başlatın

```bash
# Docker ile
docker run -d \
  --name gauth_redis \
  -p 6379:6379 \
  redis:7-alpine
```

#### 4. .env Dosyasını Yapılandırın

```bash
cp .env.example .env
# .env dosyasını düzenleyin
```

Örnek .env:
```env
PORT=8080
DB_URL="host=localhost user=postgres password=yourpassword dbname=gauth port=5432 sslmode=disable TimeZone=Europe/Istanbul"
REDIS_URL=redis://localhost:6379/0
JWT_SECRET=your_super_secret_key
```

#### 5. Uygulamayı Çalıştırın

```bash
# Geliştirme modu
go run main.go

# Veya derleyip çalıştırın
go build -o main .
./main
```

## 🔧 Yapılandırma Detayları

### PostgreSQL Bağlantısı

Uygulamanız PostgreSQL veritabanına bağlanacak ve otomatik olarak:
- Tabloları oluşturacak (migration)
- Seed data ekleyecek (roles, permissions)
- Email doğrulama sütununu güncelleyecek

### Redis Cache

Redis aşağıdaki amaçlarla kullanılır:

1. **Session Yönetimi**: Token-based session storage
2. **Rate Limiting**: API çağrılarını sınırlandırma
3. **Cache**: Kullanıcı verileri ve sık erişilen datalar
4. **Token Blacklist**: Logout işlemlerinde token iptal
5. **Email Verification**: Email doğrulama token'ları
6. **Password Reset**: Şifre sıfırlama token'ları

### CORS Yapılandırması

Varsayılan olarak `http://localhost:3000` origin'ine izin verilir. Değiştirmek için `main.go` dosyasını düzenleyin:

```go
AllowOrigins: []string{"http://localhost:3000", "https://yourdomain.com"},
```

## 🧪 Test Etme

### 1. Sağlık Kontrolü

```bash
curl http://localhost:8080/
```

### 2. Swagger UI

Tarayıcınızda: `http://localhost:8080/docs/index.html`

### 3. Kullanıcı Kaydı

```bash
curl -X POST http://localhost:8080/v1/auth/register \
  -H "Content-Type: application/json" \
  -d '{
    "email": "test@example.com",
    "password": "SecurePass123!",
    "user_name": "testuser"
  }'
```

### 4. Giriş

```bash
curl -X POST http://localhost:8080/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{
    "email": "test@example.com",
    "password": "SecurePass123!"
  }'
```

### 5. Redis Bağlantı Kontrolü

```bash
# Redis CLI ile
docker exec -it gauth_redis redis-cli

# Redis içinde
> PING
PONG

> KEYS *
(Redis'teki tüm key'leri gösterir)

> GET user:UUID_HERE
(Kullanıcı cache verisi)
```

### 6. PostgreSQL Bağlantı Kontrolü

```bash
# PostgreSQL CLI ile
docker exec -it gauth_postgres psql -U postgres -d gauth

# PostgreSQL içinde
\dt  -- Tabloları listele
\d users  -- Users tablosu yapısını göster
SELECT * FROM roles;  -- Rolleri listele
```

## 📊 Rate Limiting Yapılandırması

Varsayılan limitler:

- **Login**: 5 deneme / dakika
- **Register**: 3 deneme / 5 dakika
- **Genel API**: 100 istek / dakika

Değiştirmek için `api/middlewares/rate_limit_middleware.go` dosyasını düzenleyin.

## 🔐 OAuth Yapılandırması

### Google OAuth

1. [Google Cloud Console](https://console.cloud.google.com/) → API & Services → Credentials
2. OAuth 2.0 Client ID oluşturun
3. Authorized redirect URIs: `http://localhost:8080/v1/auth/google/callback`
4. Client ID ve Secret'ı `.env` dosyasına ekleyin

### GitHub OAuth

1. [GitHub Developer Settings](https://github.com/settings/developers) → OAuth Apps → New
2. Authorization callback URL: `http://localhost:8080/v1/auth/github/callback`
3. Client ID ve Secret'ı `.env` dosyasına ekleyin

## 🐛 Sorun Giderme

### Redis bağlanamıyor

```bash
# Redis durumunu kontrol et
docker ps | grep redis

# Redis loglarını kontrol et
docker logs gauth_redis

# Redis'i yeniden başlat
docker restart gauth_redis
```

### PostgreSQL bağlanamıyor

```bash
# PostgreSQL durumunu kontrol et
docker ps | grep postgres

# PostgreSQL loglarını kontrol et
docker logs gauth_postgres

# Bağlantıyı test et
docker exec -it gauth_postgres pg_isready -U postgres
```

### CORS hatası alıyorum

`main.go` dosyasında `AllowOrigins` değerini kontrol edin ve frontend URL'inizi ekleyin.

### Rate limit çok düşük

`api/middlewares/rate_limit_middleware.go` dosyasında limit değerlerini artırın.

## 📝 Notlar

- Üretim ortamında `JWT_SECRET` değerini güçlü bir değerle değiştirin
- Redis şifre koruması için production'da Redis AUTH kullanın
- PostgreSQL için SSL bağlantısı kullanın (sslmode=require)
- Log seviyelerini production'da ayarlayın
- CORS origin'lerini production domain'lerinizle güncelleyin

## 🔄 Güncellemeler

Swagger dokümantasyonunu güncellemek için:

```bash
swag init -g main.go
```

Migration eklemek için:

`internal/database/db.go` dosyasındaki `Migrate()` fonksiyonunu güncelleyin.

## 📚 Daha Fazla Bilgi

- [Gin Web Framework](https://gin-gonic.com/)
- [GORM ORM](https://gorm.io/)
- [Redis Go Client](https://redis.uptrace.dev/)
- [JWT Go](https://github.com/golang-jwt/jwt)
