Bu proje, elektrik dağıtım şirketi senaryosu için geliştirdiğim bir .NET 8 Web API çalışmasıdır. Temel amaç; arıza kayıtlarını güvenli, kurallı ve sürdürülebilir bir şekilde yönetmek.
Bu README’de şunları bulacaksın:
- Projeyi nasıl ayağa kaldıracağın
- Mimarinin nasıl kurgulandığı
- Hangi kütüphaneleri kullandığım
- Kodlama standartlarım ve iş kuralları
- Tüm endpointlerin açıklaması
API’nin sunduğu ana özellikler:
- JWT ile kimlik doğrulama
- Role-based yetkilendirme (
Admin,User) - Arıza kaydı CRUD operasyonları
- Durum (status) geçiş politikası
- Aynı lokasyon için 1 saat içinde tekrar kayıt engeli
- Global exception handling
- Standart API response formatı (
ApiResponse<T>) - Swagger/OpenAPI dokümantasyonu
- Serilog ile loglama
- SQL Server + EF Core
- Seed data (admin/user + örnek kayıtlar)
- Unit testler
- Rate limiting
.NET 8ASP.NET Core Web API
Entity Framework CoreMicrosoft.EntityFrameworkCore.SqlServerMicrosoft.EntityFrameworkCore.DesignMicrosoft.EntityFrameworkCore.Tools
Microsoft.AspNetCore.Authentication.JwtBearerMicrosoft.AspNetCore.Identity(password hashing için)
FluentValidationFluentValidation.AspNetCore
Swashbuckle.AspNetCore(Swagger UI)
Serilog.AspNetCoreSerilog.Sinks.Console
xUnitMoqFluentAssertionscoverlet.collector
Projede Light Clean Architecture yaklaşımı kullandım.
- Controller’lar
- Middleware
- Program.cs (DI, auth, swagger, pipeline)
- DTO’lar
- Interface’ler
- Validatörler
- Exception tipleri
- Ortak response modelleri
- Entity’ler
- Enum’lar
- Status transition policy
- EF Core DbContext
- Entity configuration’lar
- Service implementasyonları
- JWT servisleri
- Seed işlemleri
- Service, policy, validator testleri
- Controller içinde business logic yok
- Controller, DbContext’e direkt erişmiyor
- Business kurallar service/policy içinde
- Application, Infrastructure’a bağımlı değil
- Domain katmanı diğer katmanlardan bağımsız
Repository: https://github.com/Ilhanemreadak/fault-report-api
- .NET 8 SDK
- SQL Server (LocalDB / SQL Server Express / normal instance)
- (Opsiyonel) SSMS
git clone https://github.com/Ilhanemreadak/fault-report-api.git
cd fault-report-apisrc/LotusCode.Api/appsettings.json içinde:
{
"ConnectionStrings": {
"DefaultConnection": "Server=localhost;Database=LotusCodeDb;Trusted_Connection=True;TrustServerCertificate=True;"
},
"Jwt": {
"Issuer": "LotusCode",
"Audience": "LotusCode.Api",
"SecretKey": "THIS_IS_A_DEVELOPMENT_ONLY_SUPER_SECRET_KEY_12345",
"ExpirationMinutes": 60
}
}dotnet ef database update --project src/LotusCode.Infrastructure --startup-project src/LotusCode.Apidotnet run --project src/LotusCode.ApilaunchSettings.json profiline göre API şu adreslerde açılır:
http://localhost:5217https://localhost:7218
Swagger:
https://localhost:7218/swagger
Uygulama açılırken seed otomatik çalışır.
Varsayılan kullanıcılar:
- Admin →
admin@lotus.local/Admin123! - User →
user@lotus.local/User123!
Ek olarak idempotent şekilde örnek fault report kayıtları da eklenir.
Seed lokasyonları:
Bursa/Nilüfer/Mahalle-{n}formatında üretilir.
- Login endpointinden JWT alınır.
- Protected endpointlere
Authorization: Bearer {token}header’ı ile gidilir. - Tüm
fault-reportsendpointleri authorize ister. - Status değiştirme endpointi sadece
Adminrolüne açıktır.
Tüm endpointler standart bir wrapper döner:
{
"success": true,
"data": {},
"message": "...",
"errors": []
}Alanlar:
success: işlem başarılı mıdata: payloadmessage: kullanıcıya/istemciye açıklamaerrors: hata detay listesi
- Aynı normalize edilmiş lokasyon için son 1 saat içinde yeni arıza kaydı açılamaz.
- Normalizasyon:
Trim()+ToLowerInvariant().
Usersadece kendi kayıtlarını görebilir/güncelleyebilir/silebilir.Admintüm kayıtları yönetebilir.
- Status sadece ayrı endpointten değişir.
- Geçişler merkezi policy ile doğrulanır.
- Sadece
Adminstatus değiştirir. - Geçersiz geçişlerde
422döner.
- Normal update endpointi status değiştirmez.
Global middleware ile exception -> status code eşlemesi:
400 BadRequest→ ValidationException401 Unauthorized→ UnauthorizedException403 Forbidden→ ForbiddenException404 NotFound→ NotFoundException422 UnprocessableEntity→ BusinessRuleException, StatusTransitionException500 InternalServerError→ beklenmeyen hatalar
Ayrıca global rate limit:
- Aynı IP için dakikada 10 istek
- Aşımda
429 Too Many Requests
Base URL (dev): https://localhost:7218
Kullanıcıyı doğrular, JWT üretir.
Request
{
"email": "admin@lotus.local",
"password": "Admin123!"
}Response (200)
ApiResponse<LoginResponse>
Tek kayıt detayını getirir.
- Admin: her kayda erişir
- User: sadece kendi kaydı
Listeleme + filtreleme + sıralama + sayfalama.
Query parametreleri:
status(opsiyonel):New, Reviewing, Assigned, InProgress, Completed, Cancelled, FalseAlarmpriority(opsiyonel):Low, Medium, Highlocation(opsiyonel): contains filtrepage(default 1)pageSize(default 10, max 100)sortBy(createdAt|priority)sortDirection(asc|desc)
Yeni arıza kaydı oluşturur.
Request
{
"title": "Trafo arızası",
"description": "Bölgede elektrik kesintisi var.",
"location": "Bursa/Nilüfer/Özlüce",
"priority": "High"
}Not: Status sistem tarafından New olarak atanır.
Kayıt günceller (status hariç).
Request
{
"title": "Güncel başlık",
"description": "Güncel açıklama",
"location": "Bursa/Nilüfer/Beşevler",
"priority": "Medium"
}Sadece admin status değiştirir.
Request
{
"status": "InProgress"
}Kayıt siler.
- Admin: her kayıt
- User: sadece kendi kayıtları
İzinli geçişler:
New->Reviewing,CancelledReviewing->Assigned,FalseAlarm,CancelledAssigned->InProgress,CancelledInProgress->Completed,CancelledCompleted,Cancelled,FalseAlarm-> terminal (geçiş yok)
Projede takip ettiğim temel standartlar:
- Controller’lar ince tutuldu (iş kuralı içermez)
- Async/await uçtan uca kullanıldı
- DTO ile çalışma (entity doğrudan API dışına açılmadı)
- FluentValidation ile input validasyonu
- İş kuralları validator yerine service/policy katmanında
AsNoTracking()read-only sorgularda kullanıldı- Query filtre/sıralama/sayfalama SQL tarafına itildi
- Global exception middleware ile tek noktadan hata yönetimi
- XML yorumları ile Swagger dokümantasyonu iyileştirildi
Unit testleri çalıştırmak için:
dotnet testTest odakları:
FaultReportServiceAuthServiceFaultReportStatusTransitionPolicy- Validator’lar
- Login ol (
/api/auth/login) ve token al - Token ile
fault-reportsendpointlerine istek at - User rolüyle kendi kayıtlarını yönet
- Admin rolüyle status geçişlerini yönet
Bu proje Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International lisansı ile lisanslanmıştır.
| İzin Verilenler | Yasak Olanlar | Şartlar |
|---|---|---|
| Kopyalama ve Paylaşma | Ticari Kullanım (Para Kazanma) | Yazara Atıf Yapılmalı |
| Kodda Değişiklik Yapma | Lisans Değiştirme | Aynı Lisansla Paylaşma |
Important
Bu projenin herhangi bir parçası veya tamamı, önceden yazılı izin alınmaksızın ticari bir üründe, hizmette veya ücretli bir eğitimde kullanılamaz.
Ticari lisans talepleri veya iş birliği için: LinkedIn | E-posta