# Soft Delete Kullanıcı Yönetimi ## Genel Bakış AuthCentral'da silinen kullanıcılar soft delete ile yönetilir. Bu, kullanıcıların veritabanından silinmeden sadece işaretlenerek pasif hale getirilmesi anlamına gelir. ## Yeni Endpoint'ler ### 1. Silinen Kullanıcıları Listele ```bash GET /v1/admin/users/deleted ``` **Query Parameters:** - `page` (int, optional) - Sayfa numarası (default: 1) - `limit` (int, optional) - Sayfa başına kayıt (default: 10, max: 100) **Örnek:** ```bash 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') curl -X GET "http://localhost:8080/v1/admin/users/deleted?page=1&limit=10" \ -H "Authorization: Bearer $TOKEN" ``` **Yanıt:** ```json { "users": [ { "id": "ca567947-ef2a-49ad-b955-bf0ef6bbf136", "username": "Delete Me", "email": "deleteme@test.com", "avatar": "", "email_verified": true, "created_at": "2026-02-05T00:03:08.360433+03:00", "updated_at": "2026-02-05T00:03:08.38027+03:00", "deleted_at": "2026-02-05T00:03:25.549299+03:00", "roles": [ { "id": 2, "name": "user", "description": "Default user role" } ], "social_accounts": [] } ], "pagination": { "page": 1, "limit": 10, "total": 12, "totalPages": 2 } } ``` **Özellikler:** - ✅ `deleted_at` field'ı görünür (normal endpoint'lerde gizli) - ✅ Pagination desteği - ✅ Sadece soft delete edilmiş kullanıcılar gösterilir - ✅ En son silinen kullanıcılar önce gelir (deleted_at DESC) ### 2. Kullanıcıyı Geri Yükle (Restore) ```bash POST /v1/admin/users/{id}/restore ``` **Path Parameters:** - `id` (uuid, required) - Kullanıcı ID **Örnek:** ```bash 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="ca567947-ef2a-49ad-b955-bf0ef6bbf136" curl -X POST "http://localhost:8080/v1/admin/users/$USER_ID/restore" \ -H "Authorization: Bearer $TOKEN" ``` **Başarılı Yanıt:** ```json { "message": "User restored successfully" } ``` **Hata Yanıtları:** ```json { "error": "deleted user not found" } ``` ## Kullanım Senaryoları ### Senaryo 1: Silinen Kullanıcıları İnceleme ```bash #!/bin/bash # Admin login 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') # Tüm silinen kullanıcıları listele echo "=== Deleted Users ===" curl -s -X GET "http://localhost:8080/v1/admin/users/deleted" \ -H "Authorization: Bearer $TOKEN" | jq '.users[] | {id, email, username, deleted_at}' ``` ### Senaryo 2: Kullanıcıyı Soft Delete ve Restore ```bash #!/bin/bash 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="abc-123-def-456" # 1. Kullanıcıyı soft delete yap echo "Step 1: Soft delete user" curl -s -X DELETE "http://localhost:8080/v1/admin/users/$USER_ID" \ -H "Authorization: Bearer $TOKEN" | jq '.' # 2. Silinen kullanıcılar listesinde kontrol et echo -e "\nStep 2: Check deleted users" curl -s -X GET "http://localhost:8080/v1/admin/users/deleted" \ -H "Authorization: Bearer $TOKEN" | jq ".users[] | select(.id==\"$USER_ID\")" # 3. Kullanıcıyı geri yükle echo -e "\nStep 3: Restore user" curl -s -X POST "http://localhost:8080/v1/admin/users/$USER_ID/restore" \ -H "Authorization: Bearer $TOKEN" | jq '.' # 4. Normal kullanıcı listesinde kontrol et echo -e "\nStep 4: Verify user is restored" curl -s -X GET "http://localhost:8080/v1/admin/users/$USER_ID" \ -H "Authorization: Bearer $TOKEN" | jq '{id, email, username}' ``` ### Senaryo 3: Frontend İçin Silinen Kullanıcılar Yönetimi **Frontend JavaScript Örneği:** ```javascript // API Client class AdminAPI { constructor(baseURL, token) { this.baseURL = baseURL; this.token = token; } async getDeletedUsers(page = 1, limit = 10) { const response = await fetch( `${this.baseURL}/v1/admin/users/deleted?page=${page}&limit=${limit}`, { headers: { 'Authorization': `Bearer ${this.token}` } } ); return response.json(); } async restoreUser(userId) { const response = await fetch( `${this.baseURL}/v1/admin/users/${userId}/restore`, { method: 'POST', headers: { 'Authorization': `Bearer ${this.token}` } } ); return response.json(); } async softDeleteUser(userId) { const response = await fetch( `${this.baseURL}/v1/admin/users/${userId}`, { method: 'DELETE', headers: { 'Authorization': `Bearer ${this.token}` } } ); return response.json(); } async hardDeleteUser(userId) { const response = await fetch( `${this.baseURL}/v1/admin/users/${userId}?hard=true`, { method: 'DELETE', headers: { 'Authorization': `Bearer ${this.token}` } } ); return response.json(); } } // Kullanım const admin = new AdminAPI('http://localhost:8080', YOUR_TOKEN); // Silinen kullanıcıları getir const deletedUsers = await admin.getDeletedUsers(1, 10); console.log(deletedUsers); // Kullanıcıyı geri yükle const result = await admin.restoreUser('user-uuid-here'); console.log(result); ``` ## API Endpoint'leri Özeti | Endpoint | Method | Açıklama | Query/Body | |----------|--------|----------|------------| | `/v1/admin/users` | GET | Aktif kullanıcılar | `?page=1&limit=10` | | `/v1/admin/users/deleted` | GET | **Silinen kullanıcılar** | `?page=1&limit=10` | | `/v1/admin/users/{id}` | DELETE | Soft delete | - | | `/v1/admin/users/{id}?hard=true` | DELETE | Hard delete (kalıcı) | `?hard=true` | | `/v1/admin/users/{id}/restore` | POST | **Kullanıcıyı geri yükle** | - | ## Soft Delete vs Hard Delete | Özellik | Soft Delete | Hard Delete | |---------|-------------|-------------| | **Veritabanı** | `deleted_at` timestamp set edilir | Tamamen silinir | | **Görünürlük** | `/deleted` endpoint'inde görünür | Hiçbir yerde görünmez | | **Geri Getirme** | ✅ `/restore` ile mümkün | ❌ İmkansız | | **İlişkiler** | Korunur | Silinir | | **Kullanım** | Varsayılan, güvenli | Dikkatli kullanılmalı | | **Komut** | `DELETE /users/{id}` | `DELETE /users/{id}?hard=true` | ## Frontend Entegrasyonu ### React Örneği ```jsx import React, { useState, useEffect } from 'react'; function DeletedUsersManager() { const [deletedUsers, setDeletedUsers] = useState([]); const [loading, setLoading] = useState(false); const [page, setPage] = useState(1); const fetchDeletedUsers = async () => { setLoading(true); try { const response = await fetch( `http://localhost:8080/v1/admin/users/deleted?page=${page}&limit=10`, { headers: { 'Authorization': `Bearer ${localStorage.getItem('token')}` } } ); const data = await response.json(); setDeletedUsers(data.users); } catch (error) { console.error('Error fetching deleted users:', error); } finally { setLoading(false); } }; const restoreUser = async (userId) => { if (!confirm('Bu kullanıcıyı geri yüklemek istediğinize emin misiniz?')) { return; } try { const response = await fetch( `http://localhost:8080/v1/admin/users/${userId}/restore`, { method: 'POST', headers: { 'Authorization': `Bearer ${localStorage.getItem('token')}` } } ); if (response.ok) { alert('Kullanıcı başarıyla geri yüklendi!'); fetchDeletedUsers(); // Listeyi yenile } } catch (error) { console.error('Error restoring user:', error); } }; useEffect(() => { fetchDeletedUsers(); }, [page]); return (

Silinen Kullanıcılar

{loading ? (

Yükleniyor...

) : ( {deletedUsers.map(user => ( ))}
Email Kullanıcı Adı Silinme Tarihi İşlemler
{user.email} {user.username} {new Date(user.deleted_at).toLocaleString('tr-TR')}
)}
Sayfa {page}
); } export default DeletedUsersManager; ``` ## Güvenlik Notları ✅ **İyi Pratikler:** - Silinen kullanıcıları düzenli olarak gözden geçirin - Restore işleminden önce kullanıcıyı doğrulayın - Hard delete yapmadan önce soft delete kullanın - Kritik kullanıcılar için restore geçmişi tutun ⚠️ **Dikkat Edilmesi Gerekenler:** - Sadece admin rolündeki kullanıcılar bu endpoint'lere erişebilir - Restore edilen kullanıcı önceki tüm rolleri ve ayarları ile geri gelir - Soft delete edilmiş kullanıcılar login yapamaz - Hard delete geri alınamaz, dikkatli kullanın ## Test Komutları ```bash # 1. Kullanıcı oluştur 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') curl -X POST http://localhost:8080/v1/admin/users \ -H "Authorization: Bearer $TOKEN" \ -F "email=test@example.com" \ -F "password=test123" \ -F "user_name=Test User" \ -F "roles=user" # 2. Kullanıcıyı soft delete yap curl -X DELETE "http://localhost:8080/v1/admin/users/USER_ID" \ -H "Authorization: Bearer $TOKEN" # 3. Silinen kullanıcıları listele curl -X GET "http://localhost:8080/v1/admin/users/deleted" \ -H "Authorization: Bearer $TOKEN" | jq '.' # 4. Kullanıcıyı geri yükle curl -X POST "http://localhost:8080/v1/admin/users/USER_ID/restore" \ -H "Authorization: Bearer $TOKEN" ``` ## Özet 🎯 **Yeni Özellikler:** - ✅ Silinen kullanıcıları listeleme - ✅ Kullanıcıyı geri yükleme (restore) - ✅ `deleted_at` field'ı görünürlüğü - ✅ Pagination desteği - ✅ Frontend entegrasyonu için hazır 📊 **Kullanım:** - Soft delete varsayılan silme yöntemi - Hard delete sadece kalıcı silme için - Restore ile yanlışlıkla silinen kullanıcılar kurtarılabilir - Frontend'de silinen kullanıcılar yönetilebilir