SourceDev; geliştiricilerin blog yazıları yayınlayıp etkileşim kurabildiği, GitHub OAuth destekli, Next.js + .NET 9.0 tabanlı uçtan uca bir içerik platformudur. Bu döküman projeyi GitHub’da yayınlarken ihtiyaç duyacağınız teknik özet, mimari kararlar, ortam değişkenleri ve API yüzeyini bir arada sunar.
- Amaç: Topluluk yazıları, etiketler, yorumlar ve reaksiyonlar etrafında sosyal bir deneyim sağlamak.
- Katmanlar: Next.js 16 App Router ile SSR/ISR ön yüz, ASP.NET Core 9.0 ile REST API, SQL Server veri katmanı.
- Güvenlik: ASP.NET Identity + JWT kimlik doğrulama, token blacklist, role-based admin uçları, dinamik CORS.
- Üretkenlik: AutoMapper, FluentValidation, Repository + Unit of Work, özel logging/exception middleware’leri.
| Katman | Teknolojiler |
|---|---|
| Frontend | Next.js 16 (App Router), React 19, Tailwind CSS 4, Axios |
| Backend | ASP.NET Core 9.0, Entity Framework Core 9, ASP.NET Identity, AutoMapper, FluentValidation |
| Veri | SQL Server, EF Core Code First + migration’lar (Migrations/) |
| DevOps | DotNetEnv ile .env, OpenAPI (development’ta /swagger), JWT tabanlı auth |
SourceDev/
├─ backend/SourceDev.API/ # ASP.NET Core REST API
│ ├─ Controllers/ # Auth, Post, Comment, Reaction, Tag, Follow, Admin, Users
│ ├─ Services/, Repositories/ # Domain servisleri + Unit of Work
│ ├─ DTOs/, Validators/ # Taşıyıcı modeller + FluentValidation kuralları
│ ├─ Middlewares/ # Logging, Exception, Dynamic CORS
│ └─ Migrations/ # EF Core migration dosyaları
└─ frontend/ # Next.js uygulaması
├─ app/ # App Router sayfaları (dashboard, latest, tag/[slug], vb.)
├─ components/ # Bölünmüş UI parçaları
└─ utils/api/ # Axios tabanlı API istemcileri
- .NET 9 SDK
- Node.js 20+ (Next.js 16 için)
- SQL Server örneği (lokal ya da uzak)
Backend (backend/SourceDev.API/env.example.txt):
CONNECTION_STRING=Server=localhost;Database=SourceDev;User Id=...;
JWT_SECRET_KEY=super-secret
JWT_ISSUER=SourceDev
JWT_AUDIENCE=SourceDevAudience
JWT_EXPIRATION_MINUTES=60
ALLOWED_ORIGINS=http://localhost:3000
ASPNETCORE_ENVIRONMENT=Development
Frontend (frontend/env.example.txt):
NEXT_PUBLIC_API_URL=http://localhost:5000/api
GITHUB_CLIENT_ID=...
GITHUB_CLIENT_SECRET=...
GITHUB_OAUTH_REDIRECT=http://localhost:3000/api/oauth/github/callback
GITHUB_OAUTH_PEPPER=random-string
Örnek dosyaları kopyalayıp değerleri doldurun:
cp backend/SourceDev.API/env.example.txt backend/SourceDev.API/.env
cp frontend/env.example.txt frontend/.env.localcd backend/SourceDev.API
dotnet ef database update # ilk kurulumda
dotnet run # API varsayılan olarak http://localhost:5000- EF Core
AppDbContextSQL Server’a bağlanır, globalNoTrackingve 60 sn komut timeout’u aktiftir. MiddlewareExtensionsüzerinden logging, hata ve dinamik CORS sırasıyla devreye alınır.
cd frontend
npm install
npm run dev # http://localhost:3000NEXT_PUBLIC_API_URLmutlaka backend taban URL’sine işaret etmeli.- GitHub OAuth akışı
app/api/oauth/githubroute’ları üzerinden yürütülür.
Tüm uçlar api/<controller> kalıbıyla versiyonlanmamış REST uçlarıdır. JWT gerektiren uçlarda Authorization: Bearer <token> zorunludur. Seçilmiş uçlar:
| HTTP | Route | Açıklama |
|---|---|---|
| POST | /register |
Yeni kullanıcı kaydı (RegisterDto) |
| POST | /login |
E-posta/kullanıcı adı + parola ile giriş |
| POST | /change-password |
Mevcut parolayı değiştirir (auth) |
| POST | /validate-token |
Raw JWT doğrulaması |
| POST | /logout |
Token’ı blacklist’e ekler |
| GET | /profile |
Token’dan gelen temel profil verisi |
| PUT | /profile |
Profil bilgilerini günceller |
| HTTP | Route | Açıklama |
|---|---|---|
| GET | /{id} / /slug/{slug} |
Post detayları (anonim) |
| GET | /latest, /top, /relevant |
Listeleme/paging uçları |
| GET | /user/{userId}, /tag/{tagSlug} |
Kullanıcı veya etikete göre filtre |
| GET | /drafts, /bookmarks |
Auth kullanıcının taslakları/kayıtlıları |
| POST | / |
CreatePostDto ile yeni post |
| PUT | /{id} |
Post güncelleme; ayrıca /publish, /unpublish |
| DELETE | /{id} |
Post silme |
| POST | /{id}/like, /{id}/save |
Like/bookmark toggle |
| POST | /{id}/tags |
Post’a etiket ekleme |
| DELETE | /{id}/tags/{tagId} |
Etiket kaldırma |
| GET | /search?query= |
Tam metin arama, sayfalama limitleri var |
| HTTP | Route | Açıklama |
|---|---|---|
| GET | /post/{postId} |
Yorum listesi, sayfalama |
| GET | /post/{postId}/count |
Toplam yorum |
| POST | /post/{postId} |
Yeni yorum / yanıt (auth) |
| DELETE | /{commentId} |
Sahiplik kontrolüyle silme |
| GET | /search?query= |
İçerik araması |
| HTTP | Route | Açıklama |
|---|---|---|
| POST | /post/{postId} |
Reaction toggle (reactionType body) |
| DELETE | /post/{postId}?reactionType= |
Belirli reaksiyonu kaldırma |
| GET | /post/{postId}/summary |
Reaksiyon toplamları |
| HTTP | Route | Açıklama |
|---|---|---|
| POST | /{userId} |
Kullanıcıyı takip et |
| DELETE | /{userId} |
Takibi bırak |
| GET | /check/{userId} |
Auth kullanıcısı takip ediyor mu |
| GET | /followers-count/{userId} |
Toplam takipçi |
| GET | /following-count/{userId} |
Toplam takip edilen |
| HTTP | Route | Açıklama |
|---|---|---|
| GET | / |
Tüm etiketler |
| GET | /popular?limit= |
En popüler etiketler |
| GET | /search?query= |
İsim araması |
| GET | /{id} / /name/{name} |
Etiket detayı |
| HTTP | Route | Açıklama |
|---|---|---|
| GET | / |
Tüm kullanıcılar |
| GET | /active |
Aktif kullanıcılar |
| GET | /search?query= |
Kullanıcı araması |
| GET | /{id} |
Kullanıcı profili DTO |
| Route | Açıklama |
|---|---|
/ |
Feed (latest/relevant) |
/latest, /top, /reading-list, /drafts |
Hazır liste sayfaları |
/post/[id or slug] |
Post detay |
/tag/[tagname], /search, /discussions, /user/[username] |
Topluluk keşfi |
/dashboard, /create-post, /settings |
Auth gerektiren alanlar |
/login, /register, /forgot-password, /change-password |
Auth akışı |
/api/oauth/github/* |
GitHub OAuth callback ve proxy uçları |
App Router yapısı sayesinde route segmentleri server component olarak render edilir; utils/api/apiClient.js dosyası Axios instance’ını NEXT_PUBLIC_API_URL üzerinden yapılandırır.