first commit
This commit is contained in:
313
ADMIN_PANEL.md
Normal file
313
ADMIN_PANEL.md
Normal file
@@ -0,0 +1,313 @@
|
||||
# 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 <admin_jwt_token>
|
||||
```
|
||||
|
||||
**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 <admin_jwt_token>
|
||||
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 <admin_jwt_token>
|
||||
```
|
||||
|
||||
**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 <jwt_token>
|
||||
```
|
||||
|
||||
**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 <jwt_token>
|
||||
```
|
||||
|
||||
**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)
|
||||
Reference in New Issue
Block a user