Files
atahango/belgeler/ROLE_UPDATE_FIX.md
Beyhan Oğur bbbf76b184 first commit
2026-04-26 21:35:24 +03:00

387 lines
8.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ✅ Rol Güncelleme Sorunu Çözüldü!
## 🐛 Sorun
```bash
PUT /v1/admin/users/54687716-1aed-41ff-aa13-bb05dd7f34e7
Request:
{
"email": "beyhan@beyhan.dev",
"user_name": "Beyhan Oğur",
"roles": ["admin"],
"email_verified": true
}
Sonuç:
✅ Email güncellendi
✅ Username güncellendi
✅ email_verified güncellendi
❌ Roles güncellenmedi
```
---
## 🔍 Kök Neden
`UpdateUser` handler'ında `roles` field'ı input struct'ında yoktu:
```go
// ❌ Önce
var input struct {
Email *string `json:"email"`
Password *string `json:"password"`
UserName *string `json:"user_name"`
EmailVerified *bool `json:"email_verified"`
// roles yok!
}
```
Gelen JSON'daki `roles` field'ı parse edilmiyordu.
---
## ✅ Çözüm
### 1. Input Struct'ına Roles Eklendi
```go
// ✅ Sonra
var input struct {
Email *string `json:"email"`
Password *string `json:"password"`
UserName *string `json:"user_name"`
EmailVerified *bool `json:"email_verified"`
Roles []string `json:"roles"` // ✅ Eklendi
}
```
### 2. Rol Güncelleme Mantığı Eklendi
```go
// Update basic user fields
if err := h.userService.UpdateUser(userID, updates); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to update user"})
return
}
// ✅ Update roles if provided
if input.Roles != nil && len(input.Roles) > 0 {
if err := h.userService.AssignRoles(userID, input.Roles); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to update roles: " + err.Error()})
return
}
}
// Get updated user to return (with roles)
user, err := h.userService.GetUserByID(userID)
// ...
```
---
## 🎯 Şimdi Nasıl Çalışıyor
### 1. Sadece Rol Güncelleme
```bash
curl -X PUT http://localhost:8080/v1/admin/users/54687716-1aed-41ff-aa13-bb05dd7f34e7 \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"roles": ["admin"]
}'
```
**Response:**
```json
{
"message": "User updated successfully",
"user": {
"id": "54687716-1aed-41ff-aa13-bb05dd7f34e7",
"email": "beyhan@beyhan.dev",
"username": "Beyhan Oğur",
"roles": [
{
"id": "role-uuid",
"name": "admin",
"description": "Default admin role"
}
]
}
}
```
### 2. Email + Username + Rol Birlikte
```bash
curl -X PUT http://localhost:8080/v1/admin/users/54687716-1aed-41ff-aa13-bb05dd7f34e7 \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"email": "beyhan@beyhan.dev",
"user_name": "Beyhan Oğur",
"roles": ["admin"],
"email_verified": true
}'
```
**Artık Tümü Güncelleniyor:**
- ✅ Email
- ✅ Username
- ✅ Roles (admin)
- ✅ Email verified
### 3. Birden Fazla Rol
```bash
curl -X PUT http://localhost:8080/v1/admin/users/54687716-1aed-41ff-aa13-bb05dd7f34e7 \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"roles": ["admin", "user"]
}'
```
---
## 📊 Özellikler
### ✅ Tüm Alanlar Tek İstekle Güncellenebilir
| Field | Type | Örnek |
|-------|------|-------|
| `email` | string | "beyhan@beyhan.dev" |
| `user_name` | string | "Beyhan Oğur" |
| `password` | string | "NewPass123!" |
| `email_verified` | boolean | true |
| `roles` | string[] | ["admin"] veya ["admin", "user"] |
### ✅ Partial Update Destekleniyor
```bash
# Sadece rol
{"roles": ["admin"]}
# Sadece email
{"email": "new@example.com"}
# Rol + Email
{"email": "new@example.com", "roles": ["admin"]}
# Hepsi
{
"email": "new@example.com",
"user_name": "newname",
"roles": ["admin"],
"email_verified": true
}
```
### ✅ Rol Değiştirme
```bash
# User'dan Admin'e
{"roles": ["admin"]}
# Admin'den User'a
{"roles": ["user"]}
# Her ikisi de
{"roles": ["admin", "user"]}
# Rolü kaldırma (boş liste)
{"roles": []}
```
---
## 🧪 Test Senaryoları
### Test 1: Normal Kullanıcıyı Admin Yap
```bash
# 1. Kullanıcıyı bul
curl -X GET "http://localhost:8080/v1/admin/users/search?q=user@example.com" \
-H "Authorization: Bearer $TOKEN"
# 2. Kullanıcıyı admin yap
USER_ID="user-uuid-here"
curl -X PUT "http://localhost:8080/v1/admin/users/$USER_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"roles": ["admin"]
}'
# 3. Doğrula
curl -X GET "http://localhost:8080/v1/admin/users/$USER_ID" \
-H "Authorization: Bearer $TOKEN"
```
### Test 2: Admin'i Normal Kullanıcı Yap
```bash
curl -X PUT "http://localhost:8080/v1/admin/users/$USER_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"roles": ["user"]
}'
```
### Test 3: Tüm Bilgileri Birlikte Güncelle
```bash
curl -X PUT "http://localhost:8080/v1/admin/users/$USER_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"email": "tamamen-yeni@example.com",
"user_name": "Yeni İsim",
"password": "YeniSifre123!",
"roles": ["admin"],
"email_verified": true
}'
```
---
## 💻 JavaScript Örneği
```javascript
async function updateUserWithRoles(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)
});
const result = await response.json();
if (response.ok) {
console.log('✅ Güncelleme başarılı:', result.message);
console.log('📊 Güncellenmiş kullanıcı:', result.user);
console.log('🎭 Yeni roller:', result.user.roles);
return result.user;
} else {
console.error('❌ Hata:', result.error);
throw new Error(result.error);
}
}
// Kullanım Örnekleri
// 1. Kullanıcıyı admin yap
await updateUserWithRoles('54687716-1aed-41ff-aa13-bb05dd7f34e7', {
roles: ['admin']
});
// 2. Email + rol güncelle
await updateUserWithRoles('54687716-1aed-41ff-aa13-bb05dd7f34e7', {
email: 'beyhan@beyhan.dev',
user_name: 'Beyhan Oğur',
roles: ['admin'],
email_verified: true
});
// 3. Birden fazla rol ata
await updateUserWithRoles('54687716-1aed-41ff-aa13-bb05dd7f34e7', {
roles: ['admin', 'user']
});
```
---
## 📁 Güncellenen Dosyalar
1.`api/handlers/user_management_handler.go`
- Input struct'a `Roles []string` eklendi
- Rol güncelleme mantığı eklendi
- `AssignRoles` service çağrısı eklendi
2.`USER_UPDATE_GUIDE.md`
- Roles field dokümante edildi
- Yeni örnekler eklendi
3.`USER_MANAGEMENT_API.md`
- PUT endpoint güncellendi
- Rol güncelleme örnekleri eklendi
---
## 🎊 Artık Çalışıyor!
### Önce
```bash
PUT /v1/admin/users/:id
{
"email": "new@example.com",
"roles": ["admin"] # ❌ Güncellenmiyordu
}
```
### Şimdi
```bash
PUT /v1/admin/users/:id
{
"email": "new@example.com",
"roles": ["admin"] # ✅ Güncelleniyor!
}
Response:
{
"message": "User updated successfully",
"user": {
"email": "new@example.com",
"roles": [{"name": "admin"}] # ✅ Güncellenmiş!
}
}
```
---
## 🚀 Hemen Deneyin
```bash
# 1. Admin giriş
curl -X POST http://localhost:8080/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"admin@gauth.local","password":"Admin@123"}'
# Token'ı kaydet
TOKEN="your-token-here"
# 2. Kullanıcı güncelle (rol dahil)
curl -X PUT http://localhost:8080/v1/admin/users/54687716-1aed-41ff-aa13-bb05dd7f34e7 \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"email": "beyhan@beyhan.dev",
"user_name": "Beyhan Oğur",
"roles": ["admin"],
"email_verified": true
}'
# 3. Response'da tüm güncellemeleri göreceksiniz! ✅
```
---
## ✅ Sorun Tamamen Çözüldü!
**Artık tek bir PUT isteği ile:**
- ✅ Email güncelleyebilirsiniz
- ✅ Username değiştirebilirsiniz
- ✅ Şifre sıfırlayabilirsiniz
- ✅ Email doğrulaması aktif edebilirsiniz
-**Rolleri güncelleyebilirsiniz** 🎉
**Roller artık tam çalışıyor! 🎊**