BerberApp API, berber randevularini yonetmek icin gelistirilmis katmanli mimariye sahip bir ASP.NET Core Web API ve React panel projesidir. Proje junior backend developer seviyesinde, okunabilir ve gelistirilebilir bir referans proje olarak hazirlanmistir.
Bu proje ile kullanicilar kayit olabilir, giris yapabilir, berberleri ve dukkanlari listeleyebilir, harita uzerinden yakin dukkanlari gorebilir, randevu olusturabilir ve berberlerle gercek zamanli mesajlasabilir. Berber hesaplari kendilerine gelen mesajlari ve kendi randevu akisini takip edebilir. Admin rolundeki kullanicilar berber CRUD islemlerini, kullanici rol yonetimini, mesajlari ve randevu durum guncellemelerini yonetebilir.
- Katmanli mimari:
API -> Business -> DataAccess -> Entities - JWT authentication ve role-based authorization
- Email/telefon dogrulama akislari
- SignalR ile gercek zamanli mesajlasma
- Harita tabanli dukkan kesfi ve yakin dukkan endpointi
- 30 dakikalik slot mantigi ile modern randevu olusturma ekrani
- Aktif randevusu olan kullanicinin yeni randevu alamamasi gibi business rule'lar
- Berberler icin bugunku randevulari saat saat gorebilecekleri takvim akisi
- Kullanici ve berber profilleri icin URL bazli fotograf destegi
| Berber kaydi | Berber listesi |
|---|---|
![]() |
![]() |
| Mesajlasma | Profil merkezi |
|---|---|
![]() |
![]() |
- C#
- ASP.NET Core Web API (.NET 8)
- Entity Framework Core
- SQL Server
- JWT Authentication
- Role-based Authorization
- SignalR
- Swagger / OpenAPI
- BCrypt.Net-Next
- React + Vite + TypeScript
Proje 4 ana katmandan olusur:
BerberApp.API: Controller, middleware, Swagger ve uygulama konfigurasyonuBerberApp.Business: DTO, service ve business kurallariBerberApp.DataAccess: EF CoreAppDbContextve migrationlarBerberApp.Entities: Entity modelleri
Akis:
API -> Business -> DataAccess -> Entities
- Kullanici kayit ve giris islemleri
- Email dogrulama akisi
- Telefon numarasi ile kayit/giris ve development SMS dogrulama akisi
- Mail onayli sifre sifirlama ve sifre degistirme
- BCrypt ile sifre hashleme
- JWT token uretimi
- Admin/User/Barber rol ayrimi
- Swagger uzerinden JWT authorize destegi
- Berber CRUD
- Berber hesabi ile kayit olma
- Dukkan/Shop CRUD ve dukkana bagli berberler
- Konuma gore yakindaki dukkanlari listeleme
- SignalR ile kullanici-berber mesajlasma
- Randevu CRUD
- Musait slot endpointi (
GET /api/appointments/available-slots) - Randevu saat cakismasi kontrolu
- Randevu kurallari:
- Gecmis tarihe randevu alinamaz
- Bugun icin gecmis saate randevu alinamaz
- Randevu saatleri 09:00-18:00 arasindadir
- Son slot 17:30'dur
- Sadece
00ve30dakikalari kabul edilir - Aktif (
PendingveyaApproved) randevusu olan kullanici yeni randevu alamaz - Kullanici sadece kendi
Pendingrandevusunu silebilir
- Randevu olusturuldugunda kullaniciya ve berbere HTML ozet maili gonderimi
- Standart API response modeli
- Global exception middleware
- DTO validation
Bu proje sadece CRUD endpointlerinden ibaret degildir. Gelistirme surecinde su alanlarda pratik yapilmis oldu:
- Authentication/authorization tasarimi
- Katmanli mimaride service sorumluluklari
- Validation ve business rule ayrimi
- SignalR ile gerçek zamanli iletisim
- Harita ve konum tabanli listeleme
- Mail ve dogrulama akislari
- Backend kurallarini destekleyen frontend UX tasarimi
- Repoyu klonlayin.
git clone <repo-url>
cd BerberApp.APIBerberApp.API/appsettings.Example.jsondosyasini referans alarakBerberApp.API/appsettings.Development.jsondosyasini olusturun.
Local development icin gercek secret'lari dosyaya yazmak yerine dotnet user-secrets kullanmaniz onerilir.
Ornek:
{
"ConnectionStrings": {
"SqlConnection": "Server=localhost;Database=BerberAppDb;User Id=sa;Password=YOUR_PASSWORD;Encrypt=False;TrustServerCertificate=True;"
},
"Jwt": {
"Key": "CHANGE_ME_TO_A_LONG_SECRET_KEY_AT_LEAST_32_CHARS",
"Issuer": "berberapi",
"Audience": "berberapi"
},
"Email": {
"UseSmtp": false,
"ShowDevelopmentTokens": true,
"Smtp": {
"Host": "smtp.gmail.com",
"Port": 587,
"EnableSsl": true,
"UserName": "YOUR_EMAIL@gmail.com",
"Password": "YOUR_APP_PASSWORD",
"FromEmail": "YOUR_EMAIL@gmail.com",
"FromName": "BerberApp"
}
},
"Sms": {
"ShowDevelopmentCodes": true
}
}Ornek user-secrets komutlari:
dotnet user-secrets --project BerberApp.API set "ConnectionStrings:SqlConnection" "Server=localhost;Database=BerberAppDb;User Id=sa;Password=YOUR_PASSWORD;Encrypt=False;TrustServerCertificate=True;"
dotnet user-secrets --project BerberApp.API set "Jwt:Key" "CHANGE_ME_TO_A_LONG_SECRET_KEY_AT_LEAST_32_CHARS"
dotnet user-secrets --project BerberApp.API set "Email:Smtp:UserName" "YOUR_EMAIL@gmail.com"
dotnet user-secrets --project BerberApp.API set "Email:Smtp:Password" "YOUR_APP_PASSWORD"
dotnet user-secrets --project BerberApp.API set "Email:Smtp:FromEmail" "YOUR_EMAIL@gmail.com"Bu yontemde appsettings.Development.json icinde placeholder degerler kalir, gercek secret'lar ise sadece makinenizde saklanir.
- Migrationlari veritabanina uygulayin.
dotnet ef database update --project BerberApp.DataAccess --startup-project BerberApp.API- API'yi calistirin.
dotnet run --project BerberApp.API- Swagger arayuzunu acin.
https://localhost:7046/swagger
veya launch profile'a gore:
http://localhost:5159/swagger
POST /api/auth/loginendpointi ile giris yapin.- Response icindeki
data.tokendegerini alin. - Swagger sag ustteki
Authorizebutonuna tiklayin. - Tokeni sadece token olarak yapistirin.
Swagger Bearer kismini otomatik ekler.
{
"success": true,
"message": "Giris basarili.",
"data": {
"token": "...",
"userId": 1,
"fullName": "Serdar Test",
"email": "serdar@example.com",
"phoneNumber": "05551234567",
"profileImageUrl": "https://example.com/avatar.jpg",
"role": "User",
"emailConfirmed": true,
"phoneNumberConfirmed": true
},
"errors": null
}POST /api/auth/registerPOST /api/auth/loginPOST /api/auth/verify-emailPOST /api/auth/resend-email-verificationPOST /api/auth/request-phone-verificationPOST /api/auth/verify-phonePOST /api/auth/forgot-passwordPOST /api/auth/reset-passwordPOST /api/auth/request-password-change- AuthenticatedPOST /api/auth/confirm-password-change- Authenticated
Development ortaminda Email:UseSmtp false ise mail icerigi console'a yazilir ve test kolayligi icin token response icindeki developmentToken alaninda doner.
Gercek mail gonderimi icin dotnet user-secrets, appsettings.Development.json veya environment variable uzerinden SMTP bilgilerini girin:
"Email": {
"UseSmtp": true,
"ShowDevelopmentTokens": false,
"Smtp": {
"Host": "smtp.gmail.com",
"Port": 587,
"EnableSsl": true,
"UserName": "yourmail@gmail.com",
"Password": "gmail-app-password",
"FromEmail": "yourmail@gmail.com",
"FromName": "BerberApp"
}
}Gmail kullanirken normal hesap sifresi degil, Google hesabindan olusturulan App Password kullanilmalidir.
SMS gonderimi ucretli servis gerektirdigi icin projede development amacli DevelopmentSmsService bulunur. Bu servis SMS'i gercekten gondermez; console'a yazar ve Sms:ShowDevelopmentCodes true ise test kodunu response icindeki developmentToken alaninda dondurur.
Bu yapi production icin ISmsService uzerinden Twilio/Firebase gibi gercek bir provider'a kolayca tasinabilir.
GET /api/users/mePUT /api/users/meGET /api/users- AdminGET /api/users/{id}- AdminPATCH /api/users/{id}/role- Admin
GET /api/barbersGET /api/barbers/{id}POST /api/barbers- AdminPUT /api/barbers/{id}- AdminDELETE /api/barbers/{id}- Admin
GET /api/shopsGET /api/shops/nearby?latitude=41.015&longitude=28.979&radiusKm=10GET /api/shops/{id}POST /api/shops- Admin, ShopAdminPUT /api/shops/{id}- Admin, ShopAdminDELETE /api/shops/{id}- Admin
GET /api/appointments- AdminGET /api/appointments/myGET /api/appointments/available-slots?barberId=1&date=2026-05-15GET /api/appointments/{id}POST /api/appointmentsPATCH /api/appointments/{id}/status- AdminDELETE /api/appointments/{id}
GET /api/conversations- AuthenticatedPOST /api/conversations- AuthenticatedGET /api/conversations/{id}/messages- AuthenticatedPOST /api/conversations/{id}/messages- AuthenticatedPATCH /api/conversations/{id}/read- Authenticated
/hubs/chat
Hub metotlari:
JoinConversation(conversationId)SendMessage(conversationId, content)
Kayit ekraninda iki hesap tipi bulunur:
User: Randevu alabilir ve berberlerle mesajlasabilir.Barber: Kendisine bagli berber profilini temsil eder ve gelen mesajlari yanitlayabilir.ShopAdmin: Kendisine bagli dukkanlari yonetebilir.
Admin rolu sistem yonetimi icindir.
Admin rolu vermek icin:
PATCH /api/users/{id}/roleBody:
{
"role": "Admin"
}Bu endpoint sadece Admin kullanicilar tarafindan cagrilabilir.
Ilk admin kullaniciyi olusturmak icin once normal register endpointi ile bir kullanici kaydedin. Sonra SQL Server uzerinden bu kullanicinin rolunu Admin yapin:
UPDATE Users
SET Role = 'Admin'
WHERE Email = 'admin@example.com';Bu islemden sonra tekrar login olun. Yeni token icinde Admin rolu yer alacaktir.
Basarili response:
{
"success": true,
"message": null,
"data": {},
"errors": null
}Hatali response:
{
"success": false,
"message": "Validation hatasi.",
"data": null,
"errors": [
"Email zorunludur."
]
}appsettings.Development.jsondosyasi.gitignoreicindedir ve GitHub'a yuklenmemelidir.- Local secret'lar icin en temiz yol
dotnet user-secrets, Docker icin ise.envkullanmaktir. - JWT key ve SQL Server sifresi gibi hassas bilgiler repoya eklenmemelidir.
- Bu proje bilincli olarak sade tutulmustur. Repository pattern, Unit of Work gibi yapilar ileride eklenebilir; ancak mevcut hali junior seviyede daha kolay okunur ve anlatilir durumdadir.
- Paylasim icin hazir ozet metin ve ekran goruntusu listesi icin
docs/LINKEDIN_POST.mdvedocs/SCREENSHOT_CHECKLIST.mddosyalarina bakabilirsiniz.
Projede API, React UI ve SQL Server icin Docker Compose yapisi bulunur.
.env.exampledosyasini kopyalayip.envolusturun.
cp .env.example .envWindows kullaniyorsaniz ayni icerigi .env adli dosyaya kopyalayabilirsiniz.
docker compose up -dBu komut uc container baslatir:
berberapp-apiberberapp-uiberberapp-sqlserver
API adresi:
http://localhost:5159/swagger
UI adresi:
http://localhost:4173
Ilk calistirmada SQL Server container'inin tamamen hazir hale gelmesi biraz zaman alabilir. Veritabani semasini olusturmak icin migration uygulanmalidir.
Docker SQL Server'a migration uygulamak icin:
dotnet ef database update --project BerberApp.DataAccess --startup-project BerberApp.API --connection "Server=localhost,1433;Database=BerberAppDb;User Id=sa;Password=Your_strong_password123!;Encrypt=False;TrustServerCertificate=True;"Containerlari durdurmak icin:
docker compose downVeritabani volume'unu da silmek isterseniz:
docker compose down -vNot: docker-compose.yml icindeki degerler .env uzerinden okunur. Gercek ortamda secret/environment variable yonetimi kullanilmalidir.
Ek not: API tarafinda CORS, Vite gelistirme portu 5173 ve Docker UI portu 4173 icin hazirdir. .env icindeki FRONTEND_BASE_URL degeri de izinli origin listesine otomatik olarak eklenir.
Bu API icin onerilen frontend yaklasimi React + Vite + TypeScripttir. Detayli ekran listesi, klasor yapisi ve gelistirme sirasi icin:
Repo icinde BerberApp.UI klasorunde basit bir React frontend taslagi bulunur.
cd BerberApp.UI
npm install
npm run devFrontend varsayilan olarak API'yi su adresten cagirir:
http://localhost:5159/api
API tarafinda Vite dev server icin CORS izni bulunur:
http://localhost:5173






