# 🔧 Kullanıcı Güncelleme API Rehberi

## PUT /v1/admin/users/:id

Kullanıcı bilgilerini güncelleme endpoint'i (Sadece admin).

---

## 📋 Endpoint Detayları

```
Method: PUT
Path: /v1/admin/users/{user_id}
Auth: Required (Admin role)
Content-Type: application/json
```

---

## 🔐 Authentication

Bu endpoint admin rolü gerektirir:

```bash
Authorization: Bearer {admin_access_token}
```

---

## 📥 Request Body

Tüm alanlar **optional**'dir. Sadece güncellemek istediğiniz alanları gönderin.

```json
{
  "email": "newemail@example.com",
  "user_name": "newusername",
  "password": "NewPassword123!",
  "email_verified": true,
  "roles": ["admin", "user"]
}
```

### Field Açıklamaları

| Field | Type | Required | Açıklama |
|-------|------|----------|----------|
| `email` | string | ❌ | Yeni email adresi |
| `user_name` | string | ❌ | Yeni kullanıcı adı |
| `password` | string | ❌ | Yeni şifre (otomatik hash'lenir) |
| `email_verified` | boolean | ❌ | Email doğrulama durumu |
| `roles` | string[] | ❌ | Kullanıcı rolleri (["admin"], ["user"], ["admin","user"]) |

---

## 📤 Response

### Success (200 OK)

```json
{
  "message": "User updated successfully",
  "user": {
    "id": "54687716-1aed-41ff-aa13-bb05dd7f34e7",
    "email": "newemail@example.com",
    "username": "newusername",
    "email_verified": true,
    "created_at": "2026-02-04T00:00:00Z",
    "updated_at": "2026-02-04T02:45:00Z",
    "roles": [
      {
        "id": "role-uuid",
        "name": "user",
        "description": "Default user role"
      }
    ],
    "social_accounts": []
  }
}
```

### Error Responses

#### 400 Bad Request
```json
{
  "error": "invalid input format"
}
```

#### 401 Unauthorized
```json
{
  "error": "Unauthorized"
}
```

#### 403 Forbidden
```json
{
  "error": "Admin access required"
}
```

#### 404 Not Found
```json
{
  "error": "User not found"
}
```

#### 500 Internal Server Error
```json
{
  "error": "Failed to update user"
}
```

---

## 🧪 Kullanım Örnekleri

### 1. Sadece Email Güncelleme

```bash
curl -X PUT http://localhost:8080/v1/admin/users/54687716-1aed-41ff-aa13-bb05dd7f34e7 \
  -H "Authorization: Bearer YOUR_ADMIN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "yeni-email@example.com"
  }'
```

### 2. Sadece Username Güncelleme

```bash
curl -X PUT http://localhost:8080/v1/admin/users/54687716-1aed-41ff-aa13-bb05dd7f34e7 \
  -H "Authorization: Bearer YOUR_ADMIN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "user_name": "yenikullaniciadi"
  }'
```

### 3. Şifre Sıfırlama

```bash
curl -X PUT http://localhost:8080/v1/admin/users/54687716-1aed-41ff-aa13-bb05dd7f34e7 \
  -H "Authorization: Bearer YOUR_ADMIN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "password": "YeniGüvenliŞifre123!"
  }'
```

### 4. Email Doğrulamayı Aktif Etme

```bash
curl -X PUT http://localhost:8080/v1/admin/users/54687716-1aed-41ff-aa13-bb05dd7f34e7 \
  -H "Authorization: Bearer YOUR_ADMIN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "email_verified": true
  }'
```

### 5. Birden Fazla Alan Güncelleme

```bash
curl -X PUT http://localhost:8080/v1/admin/users/54687716-1aed-41ff-aa13-bb05dd7f34e7 \
  -H "Authorization: Bearer YOUR_ADMIN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "yeni@example.com",
    "user_name": "yeniadi",
    "password": "YeniŞifre123!",
    "email_verified": true
  }'
```

### 6. Kullanıcıyı Admin Yapma

```bash
curl -X PUT http://localhost:8080/v1/admin/users/54687716-1aed-41ff-aa13-bb05dd7f34e7 \
  -H "Authorization: Bearer YOUR_ADMIN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "roles": ["admin"]
  }'
```

### 7. Kullanıcıya Birden Fazla Rol Atama

```bash
curl -X PUT http://localhost:8080/v1/admin/users/54687716-1aed-41ff-aa13-bb05dd7f34e7 \
  -H "Authorization: Bearer YOUR_ADMIN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "roles": ["admin", "user"]
  }'
```

### 8. Tüm Bilgileri Güncelleme (Email, Username, Roles)

```bash
curl -X PUT http://localhost:8080/v1/admin/users/54687716-1aed-41ff-aa13-bb05dd7f34e7 \
  -H "Authorization: Bearer YOUR_ADMIN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "beyhan@beyhan.dev",
    "user_name": "Beyhan Oğur",
    "roles": ["admin"],
    "email_verified": true
  }'
```

---

## 💻 JavaScript/TypeScript Örneği

### Fetch API

```javascript
async function updateUser(userId, updates) {
  const token = localStorage.getItem('admin_token');
  
  const response = await fetch(`http://localhost:8080/v1/admin/users/${userId}`, {
    method: 'PUT',
    headers: {
      'Authorization': `Bearer ${token}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(updates)
  });
  
  if (!response.ok) {
    const error = await response.json();
    throw new Error(error.error);
  }
  
  return response.json();
}

// Kullanım
try {
  const result = await updateUser('54687716-1aed-41ff-aa13-bb05dd7f34e7', {
    email: 'yeni@example.com',
    user_name: 'yeniadi'
  });
  
  console.log('Güncelleme başarılı:', result.message);
  console.log('Güncellenmiş kullanıcı:', result.user);
} catch (error) {
  console.error('Güncelleme hatası:', error.message);
}
```

### Axios

```javascript
import axios from 'axios';

const api = axios.create({
  baseURL: 'http://localhost:8080/v1',
  headers: {
    'Content-Type': 'application/json'
  }
});

// Add token interceptor
api.interceptors.request.use(config => {
  const token = localStorage.getItem('admin_token');
  if (token) {
    config.headers.Authorization = `Bearer ${token}`;
  }
  return config;
});

// Update user function
async function updateUser(userId, updates) {
  try {
    const { data } = await api.put(`/admin/users/${userId}`, updates);
    return data;
  } catch (error) {
    throw error.response?.data || error;
  }
}

// Kullanım
updateUser('54687716-1aed-41ff-aa13-bb05dd7f34e7', {
  email: 'yeni@example.com',
  email_verified: true
})
.then(result => {
  console.log('Başarılı:', result.message);
  console.log('Kullanıcı:', result.user);
})
.catch(error => {
  console.error('Hata:', error.error);
});
```

---

## 🔄 Complete Flow: Admin ile Kullanıcı Güncelleme

### 1. Admin Olarak Giriş Yapın

```bash
curl -X POST http://localhost:8080/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{
    "email": "admin@gauth.local",
    "password": "Admin@123"
  }'
```

**Response:**
```json
{
  "access_token": "eyJhbGciOiJIUz...",
  "user": {
    "id": "admin-uuid",
    "email": "admin@gauth.local",
    "roles": [{"name": "admin"}]
  }
}
```

Token'ı kaydedin:
```bash
TOKEN="eyJhbGciOiJIUz..."
```

### 2. Kullanıcıyı Bulun

```bash
# ID biliyorsanız direkt kullanın
# veya arama yapın:
curl -X GET "http://localhost:8080/v1/admin/users/search?q=kullanici@example.com" \
  -H "Authorization: Bearer $TOKEN"
```

### 3. Kullanıcıyı Güncelleyin

```bash
USER_ID="54687716-1aed-41ff-aa13-bb05dd7f34e7"

curl -X PUT "http://localhost:8080/v1/admin/users/$USER_ID" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "yeni-email@example.com",
    "user_name": "yenikullanici",
    "email_verified": true
  }'
```

### 4. Güncellemeyi Doğrulayın

```bash
curl -X GET "http://localhost:8080/v1/admin/users/$USER_ID" \
  -H "Authorization: Bearer $TOKEN"
```

---

## ⚠️ Önemli Notlar

1. **Şifre Hash'leme**: Şifre otomatik olarak bcrypt ile hash'lenir, plain text göndermeniz yeterli

2. **Partial Update**: Sadece göndermek istediğiniz alanları gönderin, diğerleri değişmez

3. **Email Unique Kontrolü**: Email zaten başka bir kullanıcıda varsa hata alırsınız

4. **Kendi Hesabınız**: Kendi admin hesabınızı da güncelleyebilirsiniz (ama silemezsiniz)

5. **Güncellenen Kullanıcı**: Response'da güncellenmiş kullanıcı bilgileri döner

---

## 🐛 Sorun Giderme

### Güncelleme Yapılmıyor

**Sorun:** Response "User updated successfully" döndürüyor ama güncelleme yok.

**Çözüm:** ✅ Bu sorun düzeltildi! Şimdi:
- Kullanıcı önce database'den getiriliyor
- Updates direkt user instance'ına uygulanıyor
- Güncellenmiş kullanıcı response'da dönüyor

### Token Hatası

**Sorun:** "Unauthorized" hatası

**Çözüm:**
- Token'ın doğru olduğundan emin olun
- Token'ın expire olmadığını kontrol edin
- `Bearer` prefix'ini unutmayın

### Admin Rolü Hatası

**Sorun:** "Admin access required"

**Çözüm:**
- Kullanıcınızın admin rolü olduğundan emin olun
- Rolleri kontrol edin: `GET /v1/auth/me`

---

## 📚 İlgili Endpoint'ler

- `GET /v1/admin/users` - Tüm kullanıcıları listele
- `GET /v1/admin/users/:id` - Kullanıcı detayı
- `POST /v1/admin/users` - Yeni kullanıcı oluştur
- `DELETE /v1/admin/users/:id` - Kullanıcı sil
- `POST /v1/admin/users/:id/roles` - Rol ata

---

## ✅ Özet

**Endpoint:** `PUT /v1/admin/users/{id}`

**Ne Yapabilirsiniz:**
- ✅ Email güncelleme
- ✅ Username değiştirme
- ✅ Şifre sıfırlama
- ✅ Email doğrulama durumu değiştirme
- ✅ Birden fazla alanı aynı anda güncelleme

**Response:**
- ✅ Başarı mesajı
- ✅ Güncellenmiş kullanıcı bilgileri

**Güvenlik:**
- ✅ Admin authentication gerekli
- ✅ Şifre otomatik hash'lenir
- ✅ Partial update desteklenir

**Artık kullanıcı güncelleme tamamen çalışıyor! 🎉**
