- 📖 Hakkında
- ✨ Özellikler
- 🛠️ Teknoloji Stack
- 📋 Ön Hazırlık
- 🚀 Kurulum
- ⚙️ Çevre Değişkenleri
- 💾 Veritabanı Kurulumu
- 🏃 Uygulamayı Çalıştırma
- 👥 Kullanıcı Rolleri ve Yetkiler
- 🎮 Kullanım Kılavuzu
- 🔌 API Dokümantasyonu
- 🐛 Sorun Giderme
- 📸 Ekran Görüntüleri
- 🤝 Katkıda Bulunma
- 📄 Lisans
TaskFlow, takımların görevlerini ve projelerini etkili bir şekilde yönetebilmeleri için geliştirilmiş, modern web tabanlı bir görev yönetim uygulamasıdır. JWT tabanlı kimlik doğrulama, rol bazlı yetkilendirme (RBAC) ve takım odaklı veri erişim kontrolü ile güvenli ve ölçeklenebilir bir çözüm sunar.
- ✅ Takımlar arası işbirliğini kolaylaştırmak
- ✅ Proje ve görevleri merkezi bir yerden yönetmek
- ✅ Rol bazlı yetkilendirme ile güvenli ortam sağlamak
- ✅ Modern ve responsive kullanıcı deneyimi sunmak
- ✅ JWT Tabanlı Authentication - httpOnly cookies ile güvenli oturum yönetimi
- ✅ Rol Bazlı Yetkilendirme (RBAC) - Admin, Manager, Employee rolleri
- ✅ İlk Girişte Zorunlu Şifre Değiştirme - Yeni kullanıcılar için güvenlik önlemi
- ✅ Profil Yönetimi - Her kullanıcı kendi bilgilerini düzenleyebilir
- ✅ Şifre Değiştirme - Güvenli şifre güncelleme işlemi
- ✅ Takım Oluşturma - Admin ve Manager takım oluşturabilir
- ✅ Takım Silme - Admin takımları silebilir (içinde kullanıcı/proje olmamalı)
- ✅ Kullanıcı Oluşturma - Admin ve Manager kullanıcı ekleyebilir
- ✅ Kullanıcı Silme - Admin kullanıcı silebilir (kendini silemez)
- ✅ Kullanıcı Atama - Kullanıcıları takımlara atama
- ✅ Takım Bazlı Veri Erişimi - Manager/Employee sadece kendi takımının verilerini görür
- ✅ Proje Oluşturma - Admin için takım seçimi, Manager için otomatik atama
- ✅ Proje Düzenleme - Proje adını güncelleme
- ✅ Proje Silme - Admin/Manager projeleri silebilir (içinde görev olmamalı)
- ✅ Proje Listesi - Tüm projeleri görüntüleme
- ✅ Görev Sayısı - Her projedeki görev sayısını gösterme
- ✅ Görev Oluşturma - Başlık, açıklama, atama, tahmini süre
- ✅ Görev Düzenleme - Tüm görev bilgilerini güncelleme
- ✅ Görev Silme - Görevleri silme (yetki kontrolü ile)
- ✅ Durum Takibi - Yapılacak → Sürüyor → Tamamlandı
- ✅ Kullanıcı Atama - Görevleri kullanıcılara atama
- ✅ Tahmini Süre - Saat, Gün, Hafta cinsinden tahmin
- ✅ Gelişmiş Filtreleme - Durum, proje, atanan kişi, arama
- ✅ Sayfalama - 20'erli görev listesi
- ✅ Sıralama - Oluşturulma tarihine göre sıralama
- ✅ Overview Paneli - Toplam görev, proje, kullanıcı istatistikleri
- ✅ Durum Dağılımı - Yapılacak, Sürüyor, Tamamlandı görev sayıları
- ✅ KPI Kartları - Önemli metriklerin görsel gösterimi
- ✅ Responsive Tasarım - Mobil, tablet, desktop uyumlu
- ✅ Modern UI - Tailwind CSS ile şık ve temiz tasarım
- ✅ Modal Formlar - Oluşturma ve düzenleme işlemleri için
- ✅ Onay Dialog'ları - Silme işlemleri için güvenlik
- ✅ Loading States - Yüklenme göstergeleri
- ✅ Hata Mesajları - Kullanıcı dostu hata bildirimleri
- ✅ Dark Mode Ready - Gelecekte dark mode desteği için hazır
- Next.js 15.5.9 - React framework (App Router)
- React 19 - UI kütüphanesi
- TypeScript 5.x - Tip güvenliği
- Tailwind CSS 3.x - Styling
- Lucide React - İkonlar
- Next.js API Routes - Server-side API
- Prisma 6.19.2 - ORM
- PostgreSQL - Veritabanı (Neon hosting)
- JWT (jsonwebtoken) - Token tabanlı auth
- bcryptjs - Şifre hashleme
- httpOnly Cookies - Güvenli oturum yönetimi
- Zod - Input validation
- ESLint - Code linting
- Prettier - Code formatting
- Git - Version control
Kurulumdan önce aşağıdaki araçların bilgisayarınızda yüklü olduğundan emin olun:
-
Node.js (v18.x veya üzeri)
node --version # v18.x.x veya üzeri olmalı -
npm (Node.js ile birlikte gelir)
npm --version
-
Git
git --version
-
PostgreSQL Veritabanı (Neon kullanacağız, ücretsiz)
git clone https://github.com/birhatmf/to-do-app.git
cd to-do-appnpm installBu işlem aşağıdaki paketleri kuracaktır:
nextreact@prisma/clientbcryptjsjsonwebtokenzodlucide-react- Ve diğer tüm bağımlılıklar...
- Neon'a üye olun (ücretsiz)
- Yeni bir proje oluşturun
- Connection string'i kopyalayın (şu formatta olmalı):
postgresql://username:password@hostname/database
.env.example dosyasını .env olarak kopyalayın:
cp .env.example .env.env dosyasını düzenleyin:
# Veritabanı Connection String (Neon'dan aldığınız)
DATABASE_URL="postgresql://username:password@hostname/database?sslmode=require"
# JWT Secret Token (Güçlü bir şifre oluşturun)
JWT_SECRET="your-super-secret-jwt-key-change-this-in-production-min-32-chars"JWT_SECRET değerini production'da kesinlikle değiştirin!
# Prisma Client'i oluşturun
npx prisma generate
# Veritabanı şemasını senkronize edin
npx prisma db push
# İsteğe bağlı: Seed data ile örnek veri yükleyin
npm run db:seednpm run devTarayıcınızda açın: http://localhost:3002
| Değişken | Açıklama | Zorunlu | Örnek |
|---|---|---|---|
DATABASE_URL |
PostgreSQL connection string | Evet | postgresql://user:pass@host/db |
JWT_SECRET |
JWT imzalama anahtarı | Evet | min-32-karakter-güvenli-anahtar |
NODE_ENV |
Ortam (development/production) | Hayır | development (varsayılan) |
Güvenli bir JWT secret oluşturmak için:
# Linux/Mac
openssl rand -base64 32
# Veya Node.js kullanarak
node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"┌─────────────────────────────────────────────────────────────┐
│ DATABASE │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Team │──────<│ User │──────<│ Task │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │ │ │
│ v v │
│ ┌──────────┐ │
│ │ Project │ │
│ └──────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
id- Benzersiz tanımlayıcıname- Takım adı (unique)users[]- Takımdaki kullanıcılarprojects[]- Takımdaki projelercreatedAt- Oluşturulma tarihi
id- Benzersiz tanımlayıcıname- İsimemail- Email (unique)password- Hashlenmiş şifrerole- ADMIN, MANAGER, EMPLOYEEteamId- Takım ID (foreign key)mustChangePassword- İlk girişte şifre değiştirme zorunluluğucreatedTasks[]- Oluşturduğu görevlerassignedTasks[]- Kendisine atanan görevlercreatedAt,updatedAt- Tarih bilgileri
id- Benzersiz tanımlayıcıname- Proje adıteamId- Takım ID (foreign key)tasks[]- Proje görevlericreatedAt- Oluşturulma tarihi- Unique constraint:
(teamId, name)
id- Benzersiz tanımlayıcıprojectId- Proje ID (foreign key)title- Görev başlığıdescription- Görev açıklaması (opsiyonel)status- TODO, IN_PROGRESS, DONEestimateValue- Tahmini süre değeriestimateUnit- HOUR, DAY, WEEKcreatedById- Oluşturan kullanıcıassigneeId- Atanan kullanıcı (opsiyonel)createdAt,updatedAt- Tarih bilgileri
Seed script'i şu verileri oluşturur:
2 Takım:
- Pazarlama Ekibi
- Yazılım Ekibi
6 Kullanıcı:
- 1 Admin (admin@taskflow.com)
- 2 Manager (ahmet@taskflow.com, mehmet@taskflow.com)
- 3 Employee (ayse@taskflow.com, fatma@taskflow.com, ali@taskflow.com)
4 Proje:
- Her takım için 2 proje
8 Görev:
- Farklı durumlarda görevler
npm run devUygulama http://localhost:3002 adresinde çalışır.
Hot reload aktiftir - dosya değişiklikleri otomatik olarak yansır.
# Build al
npm run build
# Production'da çalıştır
npm start# Lint kontrolü
npm run lint
# Veritabanını seed et (örnek veri yükle)
npm run db:seed
# Prisma Studio (veritabanı görsel arayüzü)
npx prisma studioPM2, Node.js uygulamalarını production'da yönetmek için güçlü bir process manager'dır. Uygulamanızı sürekli çalışır durumda tutar, otomatik yeniden başlatır ve cluster mode ile performansı artırır.
# PM2 global olarak kurun (önerilen)
npm install -g pm2
# Veya projeye dahil edin (zaten package.json'da mevcut)
npm install pm2# Build al ve PM2 ile başlat
npm run pm2:start
# Veya manuel olarak
npm run build
pm2 start ecosystem.config.js# Uygulamayı başlat
npm run pm2:start
# Uygulamayı durdur
npm run pm2:stop
# Uygulamayı yeniden başlat
npm run pm2:restart
# Uygulamayı sil (durdur ve PM2'den kaldır)
npm run pm2:delete
# Logları görüntüle
npm run pm2:logs
# Real-time monitoring
npm run pm2:monit
# Diğer PM2 komutları
pm2 list # Tüm uygulamaları listele
pm2 show taskflow # Uygulama detaylarını göster
pm2 flush # Tüm logları temizle
pm2 reload taskflow # Sıfır downtime ile yeniden yükle
pm2 startup # Sunucu restartında otomatik başlatmaecosystem.config.js dosyası PM2 ayarlarını içerir:
module.exports = {
apps: [
{
name: 'taskflow', // Uygulama adı
script: 'node_modules/next/dist/bin/next',
args: 'start -p 3002', // Port 3002
instances: 1, // Cluster mode (CPU sayısına göre artırılabilir)
exec_mode: 'cluster', // Cluster mode
autorestart: true, // Otomatik yeniden başlatma
max_memory_restart: '1G', // Bellek limiti
env: {
NODE_ENV: 'production',
PORT: 3002,
},
error_file: './logs/err.log', // Hata logları
out_file: './logs/out.log', // Çıktı logları
log_file: './logs/combined.log',
time: true, // Loglara zaman damgası
},
],
};Cluster Mode (Çoklu CPU Kullanımı):
// ecosystem.config.js
instances: 'max', // veya CPU sayısı (örn: 4)
exec_mode: 'cluster',Port Değiştirme:
// ecosystem.config.js
args: 'start -p 8080', // Port 8080Environment Değişkenleri:
// ecosystem.config.js
env: {
NODE_ENV: 'production',
PORT: 3000,
DATABASE_URL: 'postgresql://...',
JWT_SECRET: 'your-secret-key',
}# Logları görüntüle (son 100 satır)
pm2 logs taskflow --lines 100
# Logları temizle
pm2 flush taskflow
# Log dosyaları
./logs/err.log # Hata logları
./logs/out.log # Standart çıktı
./logs/combined.log # Birleştirilmiş loglarSunucu yeniden başlatıldığında uygulamanın otomatik başlaması için:
# Startup script oluştur
pm2 startup
# Çıktıdaki komutu çalıştır (sudo ile)
# Örnek: sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u your-user --hp /home/your-user
# Mevcut uygulamaları kaydet
pm2 save# Web-based monitoring (açık kaynak)
pm2 plus
# Keymetrics monitoring (ücretsiz plan mevcut)
pm2 link <secret_key> <public_key>
# Terminal'de real-time monitoring
pm2 monit# 1. Son değişiklikleri çekin
git pull origin main
# 2. Bağımlılıkleri yükleyin
npm install
# 3. Veritabanını güncelleyin (gerekirse)
npx prisma db push
# 4. Build alın
npm run build
# 5. PM2 ile yeniden başlatın
pm2 restart taskflow
# Veya zero-downtime reload
pm2 reload taskflowSoru: Uygulama başlamıyor
# Detaylı hata mesajları için
pm2 logs taskflow --err
# Yapılandırmayı kontrol edin
pm2 show taskflow
# Uygulamayı silip yeniden başlatın
pm2 delete taskflow
npm run pm2:startSoru: Yüksek CPU/RAM kullanımı
# Kaynak kullanımını görüntüleyin
pm2 monit
# Bellek limitini düşürün
max_memory_restart: '512M',
# Instance sayısını azaltın
instances: 1,Soru: Loglar çok yer kaplıyor
# Log rotation (pm2-logrotate modülü kurun)
pm2 install pm2-logrotate
# Log rotation ayarları
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress trueTam yetkiye sahip, tüm sistemi yönetebilir.
✅ Yapabilir:
- Tüm takımları görüntüleme
- Takım oluşturma, silme
- Tüm kullanıcıları görüntüleme
- Kullanıcı oluşturma (herhangi bir role), silme
- Herhangi bir takıma proje oluşturma
- Tüm projeleri görüntüleme, düzenleme, silme
- Tüm görevleri görüntüleme, düzenleme, silme
- Kendi profilini düzenleme
❌ Yapamaz:
- Kendini silme
Takım yöneticisi, sadece kendi takımını yönetebilir.
✅ Yapabilir:
- Sadece kendi takımını görüntüleme
- Takım oluşturabilir (var olan takıma eklenir)
- Sadece kendi takımındaki kullanıcıları görüntüleme
- Sadece Employee rolünde kullanıcı oluşturma
- Kendi takımına proje oluşturma
- Sadece kendi takımının projelerini görüntüleme, düzenleme, silme
- Sadece kendi takımının görevlerini görüntüleme
- Kendi takımındaki görevleri düzenleme, silme
- Tüm görevleri görüntüleme (filtreleme ile)
- Kendi profilini düzenleme
❌ Yapamaz:
- Takım silme
- Manager veya Admin rolünde kullanıcı oluşturma
- Kullanıcı silme
- Başka takımların projelerini düzenleme/silme
Takım üyesi, atanan görevleri yerine getirir.
✅ Yapabilir:
- Sadece kendi takımını görüntüleme
- Sadece kendi takımındaki kullanıcıları görüntüleme
- Kendi takımının projelerini görüntüleme
- Tüm görevleri görüntüleme (filtreleme ile)
- Kendi oluşturduğu görevleri düzenleme, silme
- Kendine atanan görevleri güncelleme (durum değiştirme)
- Kendi profilini düzenleme, şifre değiştirme
❌ Yapamaz:
- Takım oluşturma, silme
- Kullanıcı oluşturma, silme
- Proje oluşturma, düzenleme, silme
- Başka kullanıcıların görevlerini düzenleme/silme
| İşlem | Admin | Manager | Employee |
|---|---|---|---|
| Takım Oluşturma | ✅ | ✅ | ❌ |
| Takım Silme | ✅ | ❌ | ❌ |
| Kullanıcı Oluşturma | ✅ | ✅ (sadece Employee) | ❌ |
| Kullanıcı Silme | ✅ | ❌ | ❌ |
| Proje Oluşturma | ✅ | ✅ | ❌ |
| Proje Düzenleme | ✅ | ✅ (kendi takımı) | ❌ |
| Proje Silme | ✅ | ✅ (kendi takımı) | ❌ |
| Görev Oluşturma | ✅ | ✅ | ✅ |
| Görev Düzenleme | ✅ | ✅ (kendi takımı) | ✅ (sadece kendi) |
| Görev Silme | ✅ | ✅ (kendi takımı) | ✅ (sadece kendi) |
| Profil Düzenleme | ✅ | ✅ | ✅ |
| Rol | Şifre | |
|---|---|---|
| Admin | admin@taskflow.com | password123 |
| Manager | ahmet@taskflow.com | password123 |
| Employee | ayse@taskflow.com | password123 |
-
Login Sayfası
- Email ve şifrenizi girin
- "Giriş Yap" butonuna tıklayın
- İlk girişinizse şifre değiştirme sayfasına yönlendirileceksiniz
-
Şifre Değiştirme (İlk Giriş)
- Mevcut şifrenizi girin
- Yeni şifrenizi belirleyin (min. 6 karakter)
- Yeni şifreyi tekrar girin
- "Değiştir" butonuna tıklayın
-
Dashboard
- Özet istatistikleri görüntüleyin
- Güncel görevlerinizi kontrol edin
- Görevler sayfasına gidin
- "+ Yeni Görev" butonuna tıklayın
- Formu doldurun:
- Proje - Proje seçin (zorunlu)
- Başlık - Görev başlığı (zorunlu)
- Açıklama - Detaylı açıklama (opsiyonel)
- Atanan Kişi - Kullanıcı seçin (opsiyonel)
- Tahmini Süre - Sayı ve birim girin (opsiyonel)
- Durum - Yapılacak/Sürüyor/Tamamlandı seçin
- "Oluştur" butonuna tıklayın
- Görev listesinde "Düzenle" butonuna tıklayın
- Bilgileri güncelleyin
- "Güncelle" butonuna tıklayın
- Görev listesinde "Sil" butonuna tıklayın
- Onay dialog'unda "Tamam" diyerek onaylayın
- Görev listesinde durum dropdown'ına tıklayın
- Yeni durumu seçin:
- Yapılacak (TODO) - Henüz başlanmadı
- Sürüyor (IN_PROGRESS) - Çalışılıyor
- Tamamlandı (DONE) - Bitti
- Değişiklik otomatik kaydedilir
- Projeler sayfasına gidin
- "+ Yeni Proje" butonuna tıklayın
- Formu doldurun:
- Proje Adı - Proje ismi (zorunlu)
- Takım - Admin için takım seçimi zorunlu
- "Oluştur" butonuna tıklayın
- Proje kartındaki ✏️ butonuna tıklayın
- Proje adını güncelleyin
- "Güncelle" butonuna tıklayın
- Proje kartındaki "Sil" butonuna tıklayın
- Onaylayın
- Ekip Üyeleri sayfasına gidin
- "+ Yeni Ekip Üyesi" butonuna tıklayın
- Formu doldurun:
- İsim - Kullanıcı adı (zorunlu)
- Email - Benzersiz email (zorunlu)
- Şifre - Başlangıç şifresi (zorunlu, min. 6 karakter)
- Rol - Admin/Manager/Employee seçin (Admin için)
- Takım - Takım atayın (Admin için)
- "Oluştur" butonuna tıklayın
- Takımlar sayfasına gidin
- İlgili takım kartındaki "+" butonuna tıklayın
- Kullanıcı seçin
- "Ekle" butonuna tıklayın
- Ekip Üyeleri sayfasına gidin
- Kullanıcının yanındaki "Sil" butonuna tıklayın
- Onaylayın
- Takımlar sayfasına gidin
- "+ Yeni Takım" butonuna tıklayın
- Takım adını girin
- "Oluştur" butonuna tıklayın
- Takım kartındaki "Sil" butonuna tıklayın
- Onaylayın
Görevler sayfasında şu filtreleri kullanabilirsiniz:
- Durum - Yapılacak, Sürüyor, Tamamlandı
- Proje - Spesifik proje seçimi
- Atanan Kişi - Kullanıcıya göre filtreleme
- Arama - Başlıkta metin araması
Temizle butonu tüm filtreleri sıfırlar.
- Profil sayfasına gidin (sidebar'dan)
- "Düzenle" butonuna tıklayın
- İsim ve/veya email'i güncelleyin
- "Güncelle" butonuna tıklayın
- Profil sayfasına gidin
- "Şifre Değiştir" butonuna tıklayın
- Formu doldurun:
- Mevcut Şifre - Şu anki şifreniz
- Yeni Şifre - Yeni şifreniz (min. 6 karakter)
- Yeni Şifre (Tekrar) - Onay için
- "Değiştir" butonuna tıklayın
Tüm API endpoint'leri JWT token gerektirir. Token httpOnly cookie üzerinden gönderilir.
Cookie: auth_token=<your-jwt-token>
Kullanıcı girişi yapar.
Request Body:
{
"email": "admin@taskflow.com",
"password": "password123"
}Response (200):
{
"success": true,
"data": {
"id": "clxxxxxx",
"name": "Admin User",
"email": "admin@taskflow.com",
"role": "ADMIN",
"teamId": null,
"mustChangePassword": false
}
}Response (401):
{
"success": false,
"error": "Email veya şifre hatalı"
}Kullanıcı çıkışı yapar.
Response (200):
{
"success": true,
"message": "Çıkış başarılı"
}Mevcut kullanıcı bilgisini döner.
Response (200):
{
"success": true,
"data": {
"id": "clxxxxxx",
"name": "Admin User",
"email": "admin@taskflow.com",
"role": "ADMIN",
"teamId": null,
"mustChangePassword": false
}
}Tüm projeleri listeler (rol bazlı filtreleme ile).
Query Params:
teamId(opsiyonel) - Takım ID'si
Response (200):
{
"success": true,
"data": [
{
"id": "clxxxxxx",
"name": "E-Ticaret Platformu",
"teamId": "clxxxxxx",
"createdAt": "2026-01-15T10:00:00.000Z",
"team": {
"id": "clxxxxxx",
"name": "Yazılım Ekibi"
},
"_count": {
"tasks": 5
}
}
]
}Yeni proje oluşturur.
Request Body:
{
"name": "E-Ticaret Platformu",
"teamId": "clxxxxxx"
}Response (201):
{
"success": true,
"data": {
"id": "clxxxxxx",
"name": "E-Ticaret Platformu",
"teamId": "clxxxxxx",
"createdAt": "2026-01-15T10:00:00.000Z",
"team": {
"id": "clxxxxxx",
"name": "Yazılım Ekibi"
}
}
}Proje günceller.
Request Body:
{
"name": "Yeni Proje Adı"
}Response (200):
{
"success": true,
"data": {
"id": "clxxxxxx",
"name": "Yeni Proje Adı",
"teamId": "clxxxxxx",
"createdAt": "2026-01-15T10:00:00.000Z",
"team": {
"id": "clxxxxxx",
"name": "Yazılım Ekibi"
}
}
}Proje siler.
Response (200):
{
"success": true,
"message": "Proje silindi"
}Response (400):
{
"success": false,
"error": "Proje içinde görevler olduğu için silinemez"
}Görevleri listeler (filtreleme ve sayfalama ile).
Query Params:
status(opsiyonel) - TODO, IN_PROGRESS, DONEassigneeId(opsiyonel) - Kullanıcı IDprojectId(opsiyonel) - Proje IDq(opsiyonel) - Arama metnipage(opsiyonel, varsayılan: 1) - Sayfa numarasıpageSize(opsiyonel, varsayılan: 20) - Sayfa başı öğe sayısısort(opsiyonel) - createdAt_asc, createdAt_desc
Response (200):
{
"success": true,
"data": {
"items": [
{
"id": "clxxxxxx",
"projectId": "clxxxxxx",
"title": "Kullanıcı girişi ekranı",
"description": "Login formu tasarlanacak",
"status": "TODO",
"estimateValue": 2,
"estimateUnit": "DAY",
"createdById": "clxxxxxx",
"assigneeId": "clxxxxxx",
"createdAt": "2026-01-15T10:00:00.000Z",
"updatedAt": "2026-01-15T10:00:00.000Z",
"project": {
"id": "clxxxxxx",
"name": "E-Ticaret Platformu",
"teamId": "clxxxxxx"
},
"createdBy": {
"id": "clxxxxxx",
"name": "Admin User",
"email": "admin@taskflow.com"
},
"assignee": {
"id": "clxxxxxx",
"name": "Ahmet Yılmaz",
"email": "ahmet@taskflow.com"
}
}
],
"total": 25,
"page": 1,
"pageSize": 20,
"totalPages": 2
}
}Yeni görev oluşturur.
Request Body:
{
"projectId": "clxxxxxx",
"title": "Kullanıcı girişi ekranı",
"description": "Login formu tasarlanacak",
"assigneeId": "clxxxxxx",
"estimateValue": 2,
"estimateUnit": "DAY",
"status": "TODO"
}Response (201):
{
"success": true,
"data": {
"id": "clxxxxxx",
"projectId": "clxxxxxx",
"title": "Kullanıcı girişi ekranı",
"description": "Login formu tasarlanacak",
"status": "TODO",
"estimateValue": 2,
"estimateUnit": "DAY",
"createdById": "clxxxxxx",
"assigneeId": "clxxxxxx",
"createdAt": "2026-01-15T10:00:00.000Z",
"updatedAt": "2026-01-15T10:00:00.000Z"
}
}Görev günceller.
Request Body:
{
"title": "Güncellenmiş başlık",
"description": "Güncellenmiş açıklama",
"assigneeId": "clxxxxxx",
"status": "IN_PROGRESS",
"estimateValue": 3,
"estimateUnit": "DAY"
}Response (200):
{
"success": true,
"data": {
"id": "clxxxxxx",
"title": "Güncellenmiş başlık",
"status": "IN_PROGRESS",
...
}
}Görev durumunu günceller.
Request Body:
{
"status": "DONE"
}Response (200):
{
"success": true,
"data": {
"id": "clxxxxxx",
"status": "DONE",
...
}
}Görev siler.
Response (200):
{
"success": true,
"message": "Görev silindi"
}Kullanıcıları listeler (rol bazlı filtreleme ile).
Response (200):
{
"success": true,
"data": [
{
"id": "clxxxxxx",
"name": "Ahmet Yılmaz",
"email": "ahmet@taskflow.com",
"role": "MANAGER",
"teamId": "clxxxxxx",
"team": {
"id": "clxxxxxx",
"name": "Yazılım Ekibi"
},
"createdAt": "2026-01-15T10:00:00.000Z"
}
]
}Yeni kullanıcı oluşturur.
Request Body:
{
"name": "Ayşe Demir",
"email": "ayse@taskflow.com",
"password": "password123",
"role": "EMPLOYEE",
"teamId": "clxxxxxx"
}Response (201):
{
"success": true,
"data": {
"id": "clxxxxxx",
"name": "Ayşe Demir",
"email": "ayse@taskflow.com",
"role": "EMPLOYEE",
"teamId": "clxxxxxx",
"team": {
"id": "clxxxxxx",
"name": "Yazılım Ekibi"
},
"createdAt": "2026-01-15T10:00:00.000Z"
}
}Kullanıcı siler (Admin only).
Response (200):
{
"success": true,
"message": "Kullanıcı silindi"
}Kullanıcıyı takıma atar.
Request Body:
{
"teamId": "clxxxxxx"
}Response (200):
{
"success": true,
"message": "Kullanıcı takıma atandı"
}Tüm takımları listeler.
Response (200):
{
"success": true,
"data": [
{
"id": "clxxxxxx",
"name": "Yazılım Ekibi",
"createdAt": "2026-01-15T10:00:00.000Z",
"_count": {
"users": 5,
"projects": 3
}
}
]
}Yeni takım oluşturur.
Request Body:
{
"name": "Pazarlama Ekibi"
}Response (201):
{
"success": true,
"data": {
"id": "clxxxxxx",
"name": "Pazarlama Ekibi",
"createdAt": "2026-01-15T10:00:00.000Z"
}
}Takım siler (Admin only).
Response (200):
{
"success": true,
"message": "Takım silindi"
}Response (400):
{
"success": false,
"error": "Takımda kullanıcılar veya projeler olduğu için silinemez"
}Mevcut kullanıcının profilini günceller.
Request Body:
{
"name": "Yeni İsim",
"email": "yeni@email.com"
}Response (200):
{
"success": true,
"data": {
"id": "clxxxxxx",
"name": "Yeni İsim",
"email": "yeni@email.com",
"role": "ADMIN",
"teamId": null,
"mustChangePassword": false
},
"message": "Profil güncellendi"
}Mevcut kullanıcının şifresini değiştirir.
Request Body:
{
"currentPassword": "eski-sifre",
"newPassword": "yeni-sifre"
}Response (200):
{
"success": true,
"message": "Şifre değiştirildi"
}Response (400):
{
"success": false,
"error": "Mevcut şifre hatalı"
}| Kod | Açıklama |
|---|---|
| 200 | BAŞARILI |
| 201 | OLUŞTURULDU |
| 400 | HATALI İSTEK |
| 401 | YETKİSİZ |
| 403 | YASAK |
| 404 | BULUNAMADI |
| 500 | SUNUCU HATASI |
Çözüm:
# Node.js sürümünü kontrol edin
node --version # v18.x.x olmalı
# Eski node_modules'i silin
rm -rf node_modules package-lock.json
# Yeniden yükleyin
npm installÇözüm:
# .env dosyasını kontrol edin
cat .env | grep DATABASE_URL
# Connection string formatı doğru olmalı:
# postgresql://username:password@hostname/database?sslmode=require
# Neon'da projenin aktif olduğunu kontrol edin
# "Branches" sekmesinden active branch'i kontrol edinÇözüm:
# Prisma CLI'yi yükleyin
npm install -D prisma
# Veya npx kullanın
npx prisma db push
npx prisma generateÇözüm:
# 1. Browser'da cookie'leri temizleyin
# 2. .env dosyasında JWT_SECRET tanımlı olduğundan emin olun
# 3. Prisma schema'yı güncelleyin
npx prisma db push
# 4. Uygulamayı yeniden başlatın
npm run devÇözüm:
# Veritabanında mustChangePassword alanını kontrol edin
npx prisma studio
# Eğer alan yoksa schema güncelleyin
npx prisma db push
# Seed data'yı yeniden yükleyin
npm run db:seedÇözüm:
# Admin için takım ID'si gereklidir
# Takımlar sayfasından bir takım oluşturun
# Veya seed data yükleyin:
npm run db:seedÇözüm:
# Bağımlılıkları yeniden yükleyin
rm -rf node_modules package-lock.json
npm install
# Prisma'yı yeniden oluşturun
npx prisma generateÇözüm:
# Mac/Linux
lsof -ti:3000 | xargs kill -9
# Windows
netstat -ano | findstr :3000
taskkill /PID <PID> /F
# Veya farklı port kullanın
PORT=3001 npm run dev- Temiz ve modern giriş arayüzü
- Demo hesap bilgileri
- Hata mesajları
- KPI kartları
- Görev istatistikleri
- Proje ve kullanıcı özeti
- Tablo görünümü
- Filtreleme paneli
- Durum değiştirme
- Düzenleme ve silme butonları
- Kart görünümü
- Proje oluşturma modalı
- Düzenleme ve silme işlemleri
- Kullanıcı bilgileri
- Şifre değiştirme
- Profil güncelleme
Katkılarınızı bekliyoruz! Lütfen aşağıdaki adımları takip edin:
- Repo'yu fork edin
- Lokalinize klonlayın:
git clone https://github.com/your-username/to-do-app.git cd to-do-app
git checkout -b feature/ozellik-adiniz
# veya
git checkout -b fix/hata-adiniz- Kodunuzu yazın
- Test edin
- Commit edin:
git add . git commit -m "Anlaşılır commit mesajı"
git push origin feature/ozellik-adinizGitHub'da Pull Request oluşturun.
- ✅ TypeScript kullanın
- ✅ Kodunuza comment ekleyin
- ✅ Component'leri küçük tutun
- ✅ Okunabilir değişken isimleri kullanın
- ✅ Hata yönetimi ekleyin
- ✅ Test edin
Bu proje MIT lisansı altındadır.
MIT License
Copyright (c) 2026 TaskFlow
İzni verilir, bu yazılımın ve ilgili dokümantasyon dosyalarının
"kopyalarının" herhangi bir kişiye bedelsiz verilmesine, kısıtlama
olmaksızın, dahil ancak bununla sınırlı olmamak üzere kullanma,
kopyalama, değiştirme, birleştirme, yayınlama, dağıtma, alt lisanslama
ve/veya kopyalarının satılması işlemlerine tabi tutulmasına,
yukarıdaki telif hakkı bildirimi ve bu izin bildiriminin tüm
kopyalarda veya önemli bölümlerde bulunması koşuluyla.
Sorularınız için:
- GitHub Issues: https://github.com/birhatmf/to-do-app/issues
- Email: birhatmf@example.com
Bu projeyi geliştirmek için kullanılan açık kaynak projelere teşekkürler:
⭐ Eğer bu projeyi beğendiyseniz, yıldız vermeyi unutmayın!
Made with ❤️ by birhatmf