Monorepo: pnpm workspaces + Turborepo. Backend FastAPI (feature-based), web React+Vite (FSD), mobile Expo (sadeleştirilmiş FSD).
| Klasör | Amaç |
|---|---|
backend/ |
FastAPI API — vertical slice (feature) mimari, SQLModel, Alembic, JWT |
web/ |
Personel / yönetim paneli — React + Vite + TypeScript, Feature-Sliced Design |
mobile/ |
Hasta odaklı mobil uygulama — React Native (Expo Router) |
packages/shared-types/ |
Backend OpenAPI şemasından üretilen paylaşılan TypeScript tipleri |
- Node.js 20+
- pnpm 9+
- Python 3.12+
- Docker Desktop (PostgreSQL + backend için)
pnpm installBackend için ayrı Python ortamı:
cd backend
python -m venv .venv
# Windows:
.venv\Scripts\activate
# macOS/Linux:
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .envdocker compose up -d- PostgreSQL: Docker yayın portu = kök
.enviçindePOSTGRES_PUBLISH_PORT(varsayılan 55432; yerel PG 5432/5433 ile çakışmayı önler) - Backend API:
http://localhost:8000 - Health check:
http://localhost:8000/health - OpenAPI docs:
http://localhost:8000/docs
Backend konteyneri dev-entrypoint.sh ile açılışta alembic upgrade head çalıştırır. Elle:
cd backend
alembic upgrade head
python -m app.core.seed_cliHost’tan Alembic için backend/.env içindeki DATABASE_URL, Docker’daki yayınlanan Postgres portuna işaret etmeli (POSTGRES_PUBLISH_PORT ile aynı; örn. 55432).
Docker içinden (host portu önemli değil):
docker compose exec backend /opt/venv/bin/alembic upgrade headpnpm --filter web devTarayıcı: http://localhost:5173
pnpm --filter mobile dev
# LAN IP / Expo Go adresi:
pnpm --filter mobile lan-ipExpo LAN + port 8081 ile açılır. dev start öncesi eski Metro artıklarını (8081/8082) temizler ve LAN IP’yi REACT_NATIVE_PACKAGER_HOSTNAME olarak yazar. Aynı ağdaki telefonda Expo Go: QR veya exp://<LAN>:8081.
Not: Windows’ta “Expo Metro” firewall kuralı genelde yalnızca 8081’i açar; farklı port kullanırsanız telefonda loading’de kalır (PC’den erişim çalışsa bile). Geliştirmede API Metro proxy: http://<LAN>:8081/hbys-api.
Hasta girişi OTP ile yapılır (e-posta/şifre yok). Demo: TC 34917047162, telefon 05551234567 — doğrulama kodu backend SMS stub / konsol çıktısında görünür. İsteğe bağlı doğrudan API: mobile/.env.example → EXPO_PUBLIC_API_URL (Android emülatör: http://10.0.2.2:8000).
Backend ayaktayken:
cd packages/shared-types
npx openapi-typescript http://localhost:8000/openapi.json -o src/index.tsBackend: Her feature kendi models / schemas / service / router dosyalarını taşır. Feature’lar birbirinin service fonksiyonunu import edebilir; router’lar birbirini çağırmaz. Yetkilendirme core/security.py içindeki require_permission(...) ile yapılır (izinler IZIN_MATRISI kod matrisinden gelir).
Web (FSD): Bağımlılık yönü yalnızca app → pages → widgets → features → entities → shared. Her feature/entity public API için index.ts dışa aktarır.
Mobile: Sadece hasta rolü + OTP oturumu (oturum_tipi=hasta); sadeleştirilmiş FSD (entities / features / shared) + Expo Router + SecureStore.
Yetkilendirme kod tabanlıdır:
| Parça | Dosya |
|---|---|
| Roller | app/core/enums.py → Rol |
| İzin matrisi + kapsam | app/core/permissions.py → IZIN_MATRISI, Kapsam |
| Guard | app/core/security.py → require_permission / require_role |
| Query filtre | app/core/scope.py |
| Lookup | app/core/lookups.py |
| Model registry | app/core/models_registry.py |
Kullanici.roltek birincil roldür.require_permission("randevu:goruntule")→request.state.kapsam(GLOBAL/KENDI_KAYDIM/DEPARTMANIM).- Belge:
docs/rbac-yetki-matrisi.md
cd backend
alembic upgrade head
python -m app.core.seed_cliDemo şifre: Test1234! — web giriş: kullanıcı adı admin, doktor, hemsire… veya e-posta (admin@hastane.example.com, doktor@hastane.example.com, …); sicil ADM-001, D-001, H-001 seed sonrası geçerlidir. Seed: docker compose exec backend /opt/venv/bin/python -m app.core.seed_cli
| Senaryo | Rol | Adımlar |
|---|---|---|
| Randevu → muayene → tetkik | doktor |
Randevularım → Muayene kaydı (bildirim bayrakları) → Tetkik iste |
| Laborant kuyruk | laborant |
Bekleyen tetkikler → Sonuç girişi |
| Mock entegrasyon | bashekim |
Entegrasyonlar → outbox listesi / yeniden dene |
| Zorunlu bildirim | bashekim |
Zorunlu bildirimler → Mock gönder → Outbox’ta BBY_MOCK |
| Yönetim analitik | bashekim |
Dashboard → Analitik sekmesi (grafikler) |
| Hasta PHR | Mobil OTP | Özet → Aşı takvimim / Aktif ilaçlarım |
Shared types: packages/shared-types/README.md · Production: docs/PRODUCTION.md