10 KiB
10 KiB
✅ Avatar Artık Tüm Endpoint'lerde Dönüyor!
🎯 Sorun Çözüldü
Avatar field'ı login, register ve me endpoint'lerinde dönmüyordu. Şimdi tüm authentication endpoint'lerinde avatar döndürülüyor.
📋 Güncellenen Endpoint'ler
1. POST /v1/auth/register ✅
Response (201):
{
"message": "User created. Please verify your email.",
"user_id": "uuid",
"username": "john_doe",
"email": "john@example.com",
"avatar": "",
"roles": [],
"email_verified": false,
"verification_token": "token123"
}
Not: Register'da OAuth olmadığı için avatar başlangıçta boş olacak. Daha sonra admin tarafından güncellenebilir.
2. POST /v1/auth/login ✅
Response (200):
{
"user_id": "uuid",
"username": "john_doe",
"email": "john@example.com",
"avatar": "https://lh3.googleusercontent.com/a/...",
"roles": [
{
"id": "role-uuid",
"name": "user",
"description": "Default user role"
}
],
"access_token": "eyJhbGci...",
"refresh_token": "eyJhbGci..."
}
Not: Eğer kullanıcı daha önce OAuth ile giriş yaptıysa, avatar URL'si döner.
3. GET /v1/auth/me ✅
Response (200):
{
"id": "uuid",
"username": "john_doe",
"email": "john@example.com",
"avatar": "https://lh3.googleusercontent.com/a/...",
"email_verified": true,
"created_at": "2026-02-04T00:00:00Z",
"updated_at": "2026-02-04T00:00:00Z",
"roles": [
{
"id": "role-uuid",
"name": "user"
}
],
"social_accounts": [
{
"provider": "google",
"name": "John Doe",
"avatar_url": "https://lh3.googleusercontent.com/a/..."
}
]
}
Not: Me endpoint'i zaten user objesini döndürüyordu, bu yüzden avatar otomatik olarak eklendi.
4. GET /v1/auth/:provider/callback ✅ YENİ!
Response (200):
{
"access_token": "eyJhbGci...",
"refresh_token": "eyJhbGci...",
"user": {
"id": "uuid",
"username": "John Doe",
"email": "john@gmail.com",
"avatar": "https://lh3.googleusercontent.com/a/...",
"email_verified": true,
"roles": [
{
"id": "role-uuid",
"name": "user"
}
],
"social_accounts": [
{
"id": "social-uuid",
"provider": "google",
"provider_id": "1234567890",
"email": "john@gmail.com",
"name": "John Doe",
"avatar_url": "https://lh3.googleusercontent.com/a/...",
"created_at": "2026-02-04T00:00:00Z"
}
]
}
}
Not: OAuth callback artık user bilgilerini de döndürüyor, avatar dahil!
🔄 Değişiklikler
1. Auth Handler - Register
c.JSON(http.StatusCreated, gin.H{
"message": "User created. Please verify your email.",
"user_id": user.ID,
"username": user.UserName,
"email": user.Email,
"avatar": user.Avatar, // ✅ Eklendi
"roles": roles,
"email_verified": false,
"verification_token": verifyToken,
})
2. Auth Handler - Login
c.JSON(http.StatusOK, gin.H{
"user_id": user.ID,
"username": user.UserName,
"email": user.Email,
"avatar": user.Avatar, // ✅ Eklendi
"roles": roles,
"access_token": accessToken,
"refresh_token": refreshToken,
})
3. Auth Service - FindOrCreateSocialUser
// Return type değişti
func FindOrCreateSocialUser(gothUser goth.User, provider string) (*models.User, string, string, error)
// User objesini de döndürüyor
return &user, accessToken, refreshToken, nil
4. Auth Handler - OAuth Callback
c.JSON(http.StatusOK, gin.H{
"access_token": accessToken,
"refresh_token": refreshToken,
"user": gin.H{ // ✅ User bilgileri eklendi
"id": user.ID,
"username": user.UserName,
"email": user.Email,
"avatar": user.Avatar, // ✅ Avatar dahil
"email_verified": user.EmailVerified,
"roles": roles,
"social_accounts": user.SocialAccounts,
},
})
🧪 Test Senaryoları
Test 1: Email/Password ile Register
curl -X POST http://localhost:8080/v1/auth/register \
-H "Content-Type: application/json" \
-d '{
"username": "testuser",
"email": "test@example.com",
"password": "Test123!"
}'
Response:
{
"message": "User created. Please verify your email.",
"username": "testuser",
"email": "test@example.com",
"avatar": "", // ✅ Boş string
"email_verified": false
}
Test 2: Email/Password ile Login
curl -X POST http://localhost:8080/v1/auth/login \
-H "Content-Type: application/json" \
-d '{
"email": "test@example.com",
"password": "Test123!"
}'
Response:
{
"username": "testuser",
"email": "test@example.com",
"avatar": "", // ✅ Eğer OAuth kullanmadıysa boş
"access_token": "...",
"refresh_token": "..."
}
Test 3: Google OAuth ile Giriş
# 1. OAuth başlat
open http://localhost:8080/v1/auth/google
# 2. Google'da izin ver
# 3. Callback response
Response:
{
"access_token": "...",
"refresh_token": "...",
"user": {
"username": "John Doe",
"email": "john@gmail.com",
"avatar": "https://lh3.googleusercontent.com/a/...", // ✅ Google avatar
"email_verified": true,
"social_accounts": [
{
"provider": "google",
"name": "John Doe",
"avatar_url": "https://lh3.googleusercontent.com/a/..."
}
]
}
}
Test 4: /me Endpoint
curl -X GET http://localhost:8080/v1/auth/me \
-H "Authorization: Bearer YOUR_TOKEN"
Response:
{
"id": "uuid",
"username": "John Doe",
"email": "john@gmail.com",
"avatar": "https://lh3.googleusercontent.com/a/...", // ✅ Avatar var
"email_verified": true
}
💻 Frontend Kullanımı
Login Sonrası
async function login(email, password) {
const response = await fetch('http://localhost:8080/v1/auth/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email, password })
});
const data = await response.json();
// Avatar artık login response'unda!
console.log('Avatar:', data.avatar);
// Token'ları sakla
localStorage.setItem('access_token', data.access_token);
localStorage.setItem('refresh_token', data.refresh_token);
// User bilgilerini sakla
localStorage.setItem('user', JSON.stringify({
id: data.user_id,
username: data.username,
email: data.email,
avatar: data.avatar // ✅ Avatar
}));
return data;
}
OAuth Callback Sonrası
// OAuth callback sayfasında
async function handleOAuthCallback() {
// URL'den token ve user bilgilerini al
const urlParams = new URLSearchParams(window.location.search);
// veya callback API'sinden direkt response gelir
const response = await fetch(callbackUrl);
const data = await response.json();
// Avatar ve tüm user bilgileri var!
console.log('User:', data.user);
console.log('Avatar:', data.user.avatar);
console.log('Social Accounts:', data.user.social_accounts);
// Token'ları sakla
localStorage.setItem('access_token', data.access_token);
localStorage.setItem('user', JSON.stringify(data.user));
// Ana sayfaya yönlendir
window.location.href = '/dashboard';
}
Me Endpoint ile Avatar Göster
async function getCurrentUser() {
const token = localStorage.getItem('access_token');
const response = await fetch('http://localhost:8080/v1/auth/me', {
headers: { 'Authorization': `Bearer ${token}` }
});
const user = await response.json();
// Avatar göster
const avatarEl = document.querySelector('#user-avatar');
avatarEl.src = user.avatar || `https://ui-avatars.com/api/?name=${user.username}`;
return user;
}
React Component
function UserProfile() {
const [user, setUser] = useState(null);
useEffect(() => {
// Login sonrası user bilgileri localStorage'dan
const userData = JSON.parse(localStorage.getItem('user'));
setUser(userData);
}, []);
if (!user) return null;
return (
<div className="flex items-center gap-2">
<img
src={user.avatar || `https://ui-avatars.com/api/?name=${user.username}`}
alt={user.username}
className="w-10 h-10 rounded-full"
/>
<span>{user.username}</span>
</div>
);
}
📊 Avatar Field Durumları
| Senaryo | Avatar Değeri |
|---|---|
| Email/Password Register | "" (boş string) |
| Email/Password Login (OAuth yok) | "" (boş string) |
| Google OAuth ile giriş | https://lh3.googleusercontent.com/a/... |
| GitHub OAuth ile giriş | https://avatars.githubusercontent.com/u/... |
| Admin tarafından manuel set | Custom URL |
| Avatar hiç set edilmemişse | null veya "" |
✅ Özet
Güncellenen Endpoint'ler
- ✅ POST /v1/auth/register - Avatar field eklendi
- ✅ POST /v1/auth/login - Avatar field eklendi
- ✅ GET /v1/auth/me - Avatar zaten vardı (model değişikliği ile)
- ✅ GET /v1/auth/:provider/callback - User bilgileri ve avatar eklendi
Değişiklikler
- ✅
auth_handler.go- Register response'a avatar eklendi - ✅
auth_handler.go- Login response'a avatar eklendi - ✅
auth_handler.go- OAuth callback'e user bilgileri eklendi - ✅
auth_service.go- FindOrCreateSocialUser user döndürüyor
Avatar Kaynakları
- ✅ Google OAuth → Google profil fotoğrafı
- ✅ GitHub OAuth → GitHub profil fotoğrafı
- ✅ Manuel upload → Custom URL (gelecekte)
- ✅ Fallback → UI Avatars API
Build
✅ go build -o main .
✅ No errors
🚀 Hemen Test Edin
# 1. Uygulamayı başlat
./main
# 2. Register test
curl -X POST http://localhost:8080/v1/auth/register \
-H "Content-Type: application/json" \
-d '{"username":"test","email":"test@test.com","password":"Test123!"}'
# Response'da "avatar": "" göreceksiniz ✅
# 3. Login test
curl -X POST http://localhost:8080/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"test@test.com","password":"Test123!"}'
# Response'da "avatar": "" göreceksiniz ✅
# 4. Google OAuth test
open http://localhost:8080/v1/auth/google
# Callback'te avatar ve tüm user bilgileri olacak ✅
Avatar artık tüm endpoint'lerde dönüyor! 🎉