# Admin Panel & Role-Based Access Control (RBAC) ## Genel Bakış Bu proje artık kapsamlı bir rol tabanlı erişim kontrol (RBAC) sistemine sahiptir. Kullanıcılar rollere atanabilir ve bu roller belirli izinler sağlar. ## Roller ### 1. **User** (Varsayılan) - Sadece kendi resimlerini yükleyebilir - Sadece kendi resimlerini görebilir - Sadece kendi resimlerini silebilir ### 2. **Moderator** - Kendi resimlerini yükleyebilir - **TÜM** kullanıcıların resimlerini görebilir - **TÜM** resimleri silebilir - Moderasyon yetkisi ### 3. **Admin** - **TÜM** moderator izinlerine sahiptir - Kullanıcıları yönetebilir (listeleme, silme) - Kullanıcı rollerini değiştirebilir - Tam sistem kontrolü ## İzinler | İzin | User | Moderator | Admin | |------|------|-----------|-------| | `IMAGE_UPLOAD` | ✅ | ✅ | ✅ | | `IMAGE_VIEW_OWN` | ✅ | ✅ | ✅ | | `IMAGE_VIEW_ANY` | ❌ | ✅ | ✅ | | `IMAGE_DELETE_OWN` | ✅ | ✅ | ✅ | | `IMAGE_DELETE_ANY` | ❌ | ✅ | ✅ | | `USER_VIEW` | ❌ | ❌ | ✅ | | `USER_DELETE` | ❌ | ❌ | ✅ | | `USER_MANAGE_ROLES` | ❌ | ❌ | ✅ | | `USER_MANAGE_PERMISSIONS` | ❌ | ❌ | ✅ | | `USER_MANAGE_API_KEYS` | ❌ | ❌ | ✅ | ## Admin Panel Admin paneline erişim: **http://localhost:3000/admin** ### Özellikler 1. **Kullanıcı Listesi** - Tüm kullanıcıları görüntüleme - Kullanıcı detayları (email, rol, doğrulama durumu, kayıt tarihi) 2. **Rol Yönetimi** - Dropdown menüden rol seçerek anında güncelleme - Kendi rolünü değiştirememe koruması 3. **Kullanıcı Silme** - Kullanıcıyı ve tüm verilerini silme - Kullanıcının resimleri ve API anahtarları da silinir - Kendi hesabını silememe koruması 4. **İstatistikler** - Toplam kullanıcı sayısı - Admin sayısı - Moderatör sayısı ## API Endpoint'leri ### Admin API #### 1. Kullanıcıları Listele ```http GET /api/v1/admin/users Authorization: Bearer ``` **Response:** ```json { "success": true, "data": { "users": [ { "id": "user-id", "name": "John Doe", "email": "john@example.com", "role": "user", "emailVerified": true, "createdAt": "2024-01-01T00:00:00.000Z" } ], "total": 1 } } ``` #### 2. Kullanıcı Rolünü Değiştir ```http PATCH /api/v1/admin/users/:id/role Authorization: Bearer Content-Type: application/json { "role": "moderator" } ``` **Response:** ```json { "success": true, "message": "Kullanıcı rolü başarıyla güncellendi", "data": { "userId": "user-id", "newRole": "moderator" } } ``` **Koşullar:** - Sadece admin yetkisi - Kendi rolünü değiştiremez - Geçerli roller: `user`, `moderator`, `admin` #### 3. Kullanıcı Sil ```http DELETE /api/v1/admin/users/:id Authorization: Bearer ``` **Response:** ```json { "success": true, "message": "Kullanıcı başarıyla silindi", "data": { "deletedUserId": "user-id", "deletedUser": "user@example.com" } } ``` **Koşullar:** - Sadece admin yetkisi - Kendi hesabını silemez - Kullanıcının tüm resimleri ve API anahtarları da silinir ### Güncellenmiş Resim API'leri #### 1. Resimleri Listele ```http GET /api/v1/images Authorization: Bearer ``` **Davranış:** - **User**: Sadece kendi resimlerini görür - **Moderator/Admin**: TÜM resimleri görür #### 2. Resim Sil ```http DELETE /api/v1/images/:id Authorization: Bearer ``` **Davranış:** - **User**: Sadece kendi resimlerini silebilir - **Moderator/Admin**: Herhangi bir resmi silebilir ## İlk Admin Oluşturma Veritabanında manuel olarak ilk admin kullanıcısını oluşturun: ```sql UPDATE "user" SET role = 'admin' WHERE email = 'your-email@example.com'; ``` Veya direkt database üzerinden: ```javascript // Drizzle Studio veya migration ile import { db } from "./db"; import { user } from "./db/schema"; import { eq } from "drizzle-orm"; await db.update(user) .set({ role: "admin" }) .where(eq(user.email, "your-email@example.com")); ``` ## Güvenlik Özellikleri 1. **Kendi Hesap Koruması** - Admin kendi rolünü değiştiremez - Admin kendi hesabını silemez 2. **Yetkilendirme Kontrolleri** - Her endpoint permission kontrolü yapar - 401 (Unauthorized): Giriş yapmamış - 403 (Forbidden): Yetkisi yok 3. **Cascade Silme** - Kullanıcı silindiğinde tüm resimleri ve API anahtarları da silinir 4. **Role Validasyonu** - Sadece geçerli roller kabul edilir - Geçersiz rol atama engellenir ## Kullanım Örnekleri ### JavaScript/TypeScript (Web) ```javascript // Admin paneline giriş (token localStorage'da saklanıyor) const token = localStorage.getItem("token"); // Kullanıcıları listele const response = await fetch("/api/v1/admin/users", { headers: { Authorization: `Bearer ${token}`, }, }); const { data } = await response.json(); console.log(data.users); // Rol değiştir await fetch("/api/v1/admin/users/user-id/role", { method: "PATCH", headers: { "Content-Type": "application/json", Authorization: `Bearer ${token}`, }, body: JSON.stringify({ role: "moderator" }), }); // Kullanıcı sil await fetch("/api/v1/admin/users/user-id", { method: "DELETE", headers: { Authorization: `Bearer ${token}`, }, }); ``` ### cURL ```bash # Kullanıcıları listele curl -H "Authorization: Bearer YOUR_ADMIN_TOKEN" \ http://localhost:3000/api/v1/admin/users # Rol değiştir curl -X PATCH \ -H "Authorization: Bearer YOUR_ADMIN_TOKEN" \ -H "Content-Type: application/json" \ -d '{"role":"moderator"}' \ http://localhost:3000/api/v1/admin/users/USER_ID/role # Kullanıcı sil curl -X DELETE \ -H "Authorization: Bearer YOUR_ADMIN_TOKEN" \ http://localhost:3000/api/v1/admin/users/USER_ID ``` ## Migration Role field'ını veritabanına eklemek için: ```bash # Schema'dan migration oluştur yarn db:generate # Migration'ı çalıştır yarn db:push ``` Veya manuel olarak SQL: ```sql ALTER TABLE "user" ADD COLUMN IF NOT EXISTS role TEXT DEFAULT 'user'; ``` ## Dosya Yapısı ``` app/ ├── lib/ │ ├── permissions.ts # RBAC sistem tanımları │ └── api-auth.ts # Auth middleware (role içerir) ├── api/ │ └── v1/ │ └── admin/ │ └── users/ │ ├── route.ts # GET (list) │ └── [id]/ │ ├── route.ts # DELETE │ └── role/ │ └── route.ts # PATCH └── admin/ └── page.tsx # Admin panel UI ``` ## Sonraki Adımlar 1. ✅ Role sistemi eklendi 2. ✅ Permission kontrolleri eklendi 3. ✅ Admin panel oluşturuldu 4. ✅ Kullanıcı yönetimi API'leri eklendi 5. ⏳ Email bildirimleri (rol değişikliği, hesap silme) 6. ⏳ Audit log sistemi (kim ne yaptı?) 7. ⏳ Gelişmiş filtreleme (role göre, tarihe göre)