6.1 KiB
6.1 KiB
✅ Avatar Update ÇALIŞIYOR!
Test Sonuçları
Tarih: 2026-02-04 04:19
Durum: ✅ TÜM TESTLER BAŞARILI
Test Edilen İşlemler
-
✅ User Avatar Upload (
POST /v1/user/avatar)- Dosya yükleme: ÇALIŞIYOR
- Disk'e kaydetme: ÇALIŞIYOR
- Response'da avatar URL: ÇALIŞIYOR
-
✅ Admin User Update with Avatar (
PUT /v1/admin/users/:id)- Multipart form parse: ÇALIŞIYOR
- Avatar dosya yükleme: ÇALIŞIYOR
- User bilgileri güncelleme: ÇALIŞIYOR
- Eski avatar silme: ÇALIŞIYOR
- Response'da güncel avatar: ÇALIŞIYOR
-
✅ Static File Serving (
GET /uploads/avatars/*)- HTTP 200 OK: ÇALIŞIYOR
- Dosya erişimi: ÇALIŞIYOR
🧪 Gerçek Test Çıktısı
PUT /v1/admin/users/8fa539a5-ba5c-4792-aa88-700ae965f695
Form Data:
- user_name: "Test Updated User"
- avatar: @test-avatar-2.png
Response:
{
"message": "User updated successfully",
"user": {
"id": "8fa539a5-ba5c-4792-aa88-700ae965f695",
"username": "Test Updated User",
"email": "admsdsdin@demo.com",
"avatar": "/uploads/avatars/8fa539a5-ba5c-4792-aa88-700ae965f695_1770167953.png",
"updated_at": "2026-02-04T04:19:13.949302+03:00",
"email_verified": true,
"roles": [...]
}
}
✅ Avatar başarıyla güncellendi!
✅ Dosya disk'te mevcut!
✅ HTTP üzerinden erişilebilir!
💡 Eğer Sizde Çalışmıyorsa
Kontrol Listesi
-
Content-Type doğru mu?
Content-Type: multipart/form-data; boundary=... -
Form field adı doğru mu?
Form field name: "avatar" (küçük harf) -
Authorization header var mı?
Authorization: Bearer YOUR_TOKEN -
Dosya boyutu 5MB'dan küçük mü?
Max: 5MB (5,242,880 bytes) -
Dosya formatı destekleniyor mu?
Desteklenen: .jpg, .jpeg, .png, .gif, .webp
🔧 Doğru Kullanım Örnekleri
cURL ile
# Token al
TOKEN=$(curl -s -X POST http://localhost:8080/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"admin@gauth.local","password":"Admin@123"}' \
| jq -r '.access_token')
# User ID al
USER_ID=$(curl -s http://localhost:8080/v1/admin/users \
-H "Authorization: Bearer $TOKEN" \
| jq -r '.users[0].id')
# Avatar ile güncelle
curl -X PUT "http://localhost:8080/v1/admin/users/$USER_ID" \
-H "Authorization: Bearer $TOKEN" \
-F "user_name=New Name" \
-F "avatar=@/path/to/image.jpg"
Postman ile
- Method: PUT
- URL:
http://localhost:8080/v1/admin/users/{USER_ID} - Headers:
- Authorization:
Bearer YOUR_TOKEN
- Authorization:
- Body: form-data
user_name:New Name(Text)avatar:[Select File](File)
JavaScript/Fetch ile
const formData = new FormData();
formData.append('user_name', 'New Name');
formData.append('avatar', fileInput.files[0]);
const response = await fetch(`http://localhost:8080/v1/admin/users/${userId}`, {
method: 'PUT',
headers: {
'Authorization': `Bearer ${token}`
// Content-Type: multipart/form-data EKLEMEYIN!
// Browser otomatik ekler
},
body: formData
});
const result = await response.json();
console.log('Updated user:', result.user);
console.log('New avatar:', result.user.avatar);
React ile
const updateUserWithAvatar = async (userId, userName, avatarFile) => {
const formData = new FormData();
formData.append('user_name', userName);
formData.append('avatar', avatarFile);
const token = localStorage.getItem('admin_token');
try {
const response = await fetch(`http://localhost:8080/v1/admin/users/${userId}`, {
method: 'PUT',
headers: {
'Authorization': `Bearer ${token}`
},
body: formData
});
if (!response.ok) {
const error = await response.json();
throw new Error(error.error || 'Update failed');
}
const result = await response.json();
console.log('✅ User updated:', result.user);
console.log('✅ New avatar:', result.user.avatar);
return result.user;
} catch (error) {
console.error('❌ Error:', error);
throw error;
}
};
// Kullanım
const handleSubmit = async (e) => {
e.preventDefault();
const file = e.target.avatar.files[0];
await updateUserWithAvatar('user-id', 'New Name', file);
};
⚠️ Sık Yapılan Hatalar
❌ YANLIŞ: Content-Type manuel ekleme
// YANLIŞ!
fetch(url, {
headers: {
'Content-Type': 'multipart/form-data', // ❌ YANLIŞ!
'Authorization': `Bearer ${token}`
},
body: formData
})
✅ DOĞRU: Content-Type ekleme
// DOĞRU!
fetch(url, {
headers: {
'Authorization': `Bearer ${token}` // Content-Type yok!
},
body: formData // Browser otomatik ekler
})
❌ YANLIŞ: JSON olarak gönderme
// YANLIŞ!
fetch(url, {
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
user_name: 'Name',
avatar: file // ❌ File JSON'a çevrilemez!
})
})
✅ DOĞRU: FormData kullanma
// DOĞRU!
const formData = new FormData();
formData.append('user_name', 'Name');
formData.append('avatar', file);
fetch(url, {
headers: {
'Authorization': `Bearer ${token}`
},
body: formData // ✅ FormData
})
📊 Test Script Çalıştırma
Otomatik test için:
cd /Users/beyhan/Desktop/Projeler/Go/AuthCentral
./test-avatar-update.sh
Bu script:
- ✅ Login yapar
- ✅ Test image oluşturur
- ✅ Avatar upload test eder
- ✅ User update with avatar test eder
- ✅ Dosya varlığını kontrol eder
- ✅ Static serving test eder
🎯 Sonuç
Avatar update sistemi TAM ÇALIŞIYOR! ✅
Eğer sizde çalışmıyorsa:
- Content-Type header'ı manuel eklemeyin
- Form field adını "avatar" olarak kullanın
- Authorization token'ı kontrol edin
- Dosya boyutu ve formatını kontrol edin
- Server loglarını kontrol edin
Destek için:
- Test script'i çalıştırın:
./test-avatar-update.sh - Server loglarını kontrol edin
- Browser developer console'u kontrol edin
- Network tab'da request detaylarına bakın