Mercury ekosisteminde Mobile (React Native) ve İlaçTarif (WPF/.NET masaüstü) uygulamaları arasında planlananan teknik mimari ve iletişim tasarımı.
Bu doküman henüz geliştirme aşamasına geçilmemiş bir tasarım dokümanıdır. Aşağıdaki yapılar ve akışlar, projenin uygulanması sırasında referans olarak kullanılacaktır.
| Katman | Teknoloji |
|---|---|
| Framework | React Native 0.75.4 |
| Dil | JavaScript + TypeScript |
| Durum Yönetimi | Redux Toolkit + Redux Persist + Zustand |
| Navigasyon | React Navigation 7 (Drawer, Bottom Tabs, Stack) |
| HTTP İstemci | Axios 1.8.4 |
| Şifreleme | RSA-2048 (react-native-rsa-native) + AES-256-CBC (react-native-aes-crypto) |
| Anahtar Deposu | React Native Keychain |
| Bildirimler | Notifee 9.1.2 |
| Barkod Tarama | React Native Vision Camera 4.7.3 |
| Çoklu Dil | i18next (TR / EN) |
| Tema | Açık / Koyu mod desteği |
| Katman | Teknoloji |
|---|---|
| Framework | .NET Framework 4.8 (SDK-style) |
| UI | WPF + MahApps.Metro 2.4.9 |
| Mimari | Prism.DryIoc 7.2 (modüler MVVM) |
| HTTP İstemci | RestSharp 112.1.0 |
| Şifreleme | BouncyCastle (RSA/AES) |
| JSON | Newtonsoft.Json 13.0.3 + System.Text.Json 9.0.5 |
| Test | xUnit + MockupApiServer (ASP.NET Core 8.0) |
Mobil uygulama aşağıdaki dizin yapısında geliştirilecektir:
src/
├── api/ # API katmanı (domain bazlı)
│ ├── auth/ # Kimlik doğrulama (4 endpoint)
│ ├── prescriptions/ # Reçete API'leri (2 endpoint)
│ ├── device/ # Cihaz kaydı/bilgisi (4 endpoint)
│ └── medicine/ # İlaç sorgulama (1 endpoint)
├── features/ # Redux slice'ları
│ ├── userData/ # Kullanıcı oturum bilgisi
│ ├── profileData/ # Profil (doğum tarihi, boy, kilo, kan grubu)
│ ├── alarmV9Data/ # Alarm & ilaç & reçete durumu
│ ├── deviceData/ # Cihaz kayıt durumu
│ ├── themeData/ # Tema tercihi
│ └── languageData/ # Dil tercihi
├── screens/ # Ekranlar
│ ├── login/ # Giriş (SMS doğrulama)
│ ├── landing/ # Karşılama
│ ├── onboarding/ # İlk kurulum
│ ├── drugs/ # İlaç yönetimi
│ ├── alarms/ # Alarm/takipçi
│ ├── prescriptions/ # Reçete görüntüleme
│ ├── addDrug/ # Manuel ilaç ekleme
│ ├── medicineQr/ # QR ile ilaç tarama
│ └── settings/ # Ayarlar
├── navigation/ # Navigasyon yapısı
│ ├── DrawerNavigator
│ └── BottomTabNavigatorV2
├── hooks/ # Özel hook'lar
├── services/ # İş mantığı servisleri
├── utils/ # Yardımcı araçlar
│ ├── baseApi.js # Axios yapılandırması
│ └── decryptData.js # RSA+AES çözümleme
└── locales/ # Dil dosyaları (TR, EN)
İlaçTarif, 60+ proje içeren modüler bir WPF masaüstü uygulaması olarak yapılandırılacaktır:
MedicineFullSystem.sln
├── Medicine/ # Ana WPF uygulaması
├── Common/ # Ortak kütüphaneler
│ ├── Common.Core # Temel sınıflar ve arayüzler
│ ├── Common.Infrastructure # HTTP istemcileri, altyapı
│ └── Common.Logging # Loglama
├── Medicine.Models/ # Veri modelleri, DTO'lar
├── Medicine.Requests/ # HTTP istemci kütüphanesi
├── Modules/ # Prism modülleri (20+)
│ ├── Modules.PrescriptionModule # Reçete işlemleri
│ ├── Modules.MobileModule # Mobil uygulama iletişimi
│ ├── Modules.MobileDevicesModule# Mobil cihaz yönetimi
│ ├── Modules.CargoModule # Kargo yönetimi
│ ├── Modules.ShortSaleModule # Kısa satış
│ ├── Modules.Shelf2Module # Raf/stok yönetimi
│ ├── Modules.CrossSaleModule # Çapraz satış önerileri
│ └── ... # Diğer modüller
├── Extensions/ # Eklentiler
│ ├── BarcodeListener # Barkod okuyucu entegrasyonu
│ └── PrescriptionCore # Reçete iş mantığı
└── Tests/ # Test projeleri
Mobil uygulama ile İlaçTarif masaüstü uygulaması arasındaki tüm iletişim bir API Gateway üzerinden sağlanacaktır.
graph LR
A["📱 Mobile<br/>(React Native)"] <-->|"HTTPS<br/>RSA+AES şifreli<br/>JSON payloadlar"| B["🌐 API Gateway"]
B <-->|"HTTPS"| C["💊 İlaçTarif<br/>(WPF/.NET)"]
style A fill:#61dafb,stroke:#333,color:#000
style B fill:#f5a623,stroke:#333,color:#000
style C fill:#512bd4,stroke:#333,color:#fff
Gateway üzerinden sunulacak endpoint grupları:
graph TD
GW["🌐 API Gateway"] --> V1["/api/v1/"]
GW --> V2["/api/v2/"]
GW --> MOB["/mobile/"]
GW --> PAT["/patient/"]
V1 --> V1A["Reçete işlemleri"]
V1 --> V1B["Cihaz yönetimi"]
V1 --> V1C["Kimlik doğrulama"]
V2 --> V2A["Çapraz satış önerileri"]
MOB --> MOBA["Cihaz ve ilaç endpoint'leri"]
PAT --> PATA["Hasta işlemleri"]
style GW fill:#f5a623,stroke:#333,color:#000
style V1 fill:#4a90d9,stroke:#333,color:#fff
style V2 fill:#4a90d9,stroke:#333,color:#fff
style MOB fill:#4a90d9,stroke:#333,color:#fff
style PAT fill:#4a90d9,stroke:#333,color:#fff
| Metod | Endpoint | Açıklama |
|---|---|---|
| POST | /patient/login/request-sms |
SMS kodu gönderecek |
| POST | /patient/login/withPhoneNumber |
Telefon + SMS ile giriş yapılacak |
| POST | /patient/login/withPublicKey |
RSA public key ile otomatik giriş sağlanacak |
| GET | /patient/prescription/public-key?phoneNumber={tel} |
Şifreleme anahtarı getirilecek |
| Metod | Endpoint | Açıklama |
|---|---|---|
| GET | /patient/prescription/{patientId} |
Hastanın tüm reçeteleri getirilecek |
| GET | /patient/prescription/{patientId}/{prescriptionId} |
Belirli reçete detayı döndürülecek |
| POST | /patient/prescription/prescription |
Şifreli reçete gönderilecek (İlaçTarif → Mobile) |
| Metod | Endpoint | Açıklama |
|---|---|---|
| POST | /mobile/device/register |
Yeni cihaz kaydı yapılacak, DeviceId dönecek |
| PUT | /mobile/device/info |
Cihaz bilgileri güncellenecek |
| GET | /mobile/device/{deviceId}/authorized-modules |
Yetkili modüller kontrol edilecek |
| PUT | /mobile/device/link |
Cihaz eczacıya bağlanacak |
| GET | /mobile/device/pharmacist/{id} |
Eczacının cihazları listelenecek |
| DELETE | /mobile/device/pharmacist/{id}/device/{deviceId} |
Cihaz bağlantısı kaldırılacak |
| Metod | Endpoint | Açıklama |
|---|---|---|
| GET | /mobile/drug/by-barcode/{barcode}?deviceId={id} |
Barkodla ilaç bilgisi sorgulanacak |
| Metod | Endpoint | Açıklama |
|---|---|---|
| DELETE | /mobile/account/delete |
Hesap silinecek (telefon + cihaz doğrulaması gerekecek) |
Mobile ve İlaçTarif arasında hibrit RSA + AES şifreleme kullanılacaktır:
sequenceDiagram
participant M as 📱 Mobile
participant K as 🔐 Keychain
participant S as 🌐 Sunucu (İlaçTarif)
Note over M,S: Anahtar Üretimi (İlk Giriş)
M->>M: 2048-bit RSA anahtar çifti üretilecek
M->>K: Özel anahtar güvenli depolanacak
M->>S: Açık anahtar gönderilecek (publicKey)
Note over M,S: Veri Şifreleme (Sunucu → Mobile)
S->>S: Rastgele AES-256 anahtarı üretilecek
S->>S: Reçete verisi AES-256-CBC ile şifrelenecek
S->>S: AES anahtarı RSA public key ile şifrelenecek
S->>M: Payload: [RSA(AES_KEY)] [IV] [AES(veri)]
Note over M,K: Veri Çözümleme (Mobile)
M->>K: Özel anahtar alınacak
K->>M: RSA private key
M->>M: RSA ile AES anahtarı çözülecek
M->>M: AES-CBC ile veri çözülecek
M->>M: JSON olarak parse edilecek
Geliştirme sırasında aşağıdaki dosyalar oluşturulacaktır:
| Taraf | Dosya | İşlev |
|---|---|---|
| Mobile | src/screens/login/utils/generateKeys.js |
RSA anahtar üretimi ve depolama |
| Mobile | src/utils/decryptData.js |
Hibrit RSA+AES çözümleme |
| İlaçTarif | MobileEncrypter.cs |
Hibrit RSA/AES şifreleme |
| İlaçTarif | Mobile2PostPrescriptionRequest.cs |
Şifreli reçete gönderimi |
| İlaçTarif | Mobile2GetPublicKeyRequest.cs |
Açık anahtar sorgulama |
Prescription {
Id: UUID
Date: ISO8601
HospitalName: string // Hastane adı
ClinicName: string // Klinik adı
Drugs: Drug[] // İlaç listesi
IsArchived: boolean // Arşivlenmiş mi
}
Drug {
Id: UUID
DrugName: string // İlaç adı
DisplayName: string // Görünen ad (özelleştirilebilir)
Barcode: string // Barkod
Dosage1: int // İlk doz bilgisi
Dosage2: float // İkinci doz bilgisi
Period1: int // Kullanım periyodu 1
Period2: string // Kullanım periyodu 2 ("Günde", "Haftada")
UsagePurpose: string // Kullanım amacı
Description: string // Açıklama
Warning: string // Uyarı
BoxCount: number // Kutu adedi
PharmacistNote: string // Eczacı notu
CreationDate: ISO8601
ExpiredAt: ISO8601 | null // Son kullanma tarihi
ShouldExpire: boolean
}
Device {
DeviceId: UUID // Sunucu tarafından atanacak
DeviceName: string
Model: string
SystemName: "Android" | "iOS"
SystemVersion: string
AppVersion: string
BuildNumber: string
Manufacturer: string
IsTablet: boolean
BundleId: string
}
PrescriptionAmount {
PrescriptionContribution_Hand: float // Reçete katkı payı (elden)
PrescriptionContribution_Salary: float // Reçete katkı payı (maaştan)
ExaminationContribution_Hand: float // Muayene katkı payı (elden)
PharmacyDiscountAmount: float // Eczane indirim tutarı
DrugContribution: float // İlaç katkı payı tutarı
PriceDifference: float // Fiyat farkı
Tax8: float // %8 KDV
Tax18: float // %18 KDV
TotalPrice: float // Toplam fiyat
TotalAmountDueToPharmacy: float // Hastanın eczaneye ödemesi gereken tutar
RetirementStatus: boolean // Emeklilik durumu
}
sequenceDiagram
participant U as 👤 Kullanıcı
participant M as 📱 Mobile
participant S as 🌐 Sunucu
U->>M: Telefon numarasını girecek
M->>S: POST /patient/login/request-sms
S->>U: SMS kodu gönderilecek
U->>M: SMS kodunu girecek
M->>M: RSA anahtar çifti üretilecek
M->>M: Özel anahtar Keychain'e kaydedilecek
M->>S: POST /patient/login/withPhoneNumber<br/>(telefon + kod + publicKey)
S->>M: patientId + kimlik bilgileri
M->>M: Redux'a kaydedilecek (phoneNumber, patientId, publicKey)
M->>U: Onboarding veya Ana Ekran
flowchart TD
A["Uygulama açılacak"] --> B["Redux AsyncStorage'dan rehydrate"]
B --> C{phoneNumber var mı?}
C -->|Evet| D["Giriş atlanacak"]
C -->|Hayır| E["Login ekranına yönlendirilecek"]
D --> F["POST /patient/login/withPublicKey"]
F --> G["GET /mobile/device/authorized-modules"]
G --> H["Ana Ekran"]
style A fill:#61dafb,stroke:#333,color:#000
style H fill:#27ae60,stroke:#333,color:#fff
sequenceDiagram
participant M as 📱 Mobile
participant R as 📦 Redux
participant S as 🌐 Sunucu
M->>R: DeviceId var mı?
alt DeviceId yok
M->>S: POST /mobile/device/register
S->>M: DeviceId dönecek
M->>M: react-native-device-info ile bilgi toplanacak
M->>S: PUT /mobile/device/info
M->>R: DeviceId kaydedilecek
end
M->>S: GET /mobile/device/{id}/authorized-modules
S->>M: Yetkili modüller (isPharmacist, modules[])
- Notifee kütüphanesi ile yönetilecek
- Alarm kanalları üzerinden ilaç hatırlatmaları gönderilecek
- Aksiyonlar: "İlacı Aldım" (taken), "5 dk Hatırlat" (erteleme)
graph TD
A["Alarm Tipleri"] --> P["⏰ Periodic<br/>Günde 1 kez, Günde 3 kez"]
A --> W["📅 Weekly<br/>Pazartesi, Çarşamba, Cuma"]
A --> AL["🔄 Alternate<br/>Gün aşırı"]
P --> D["Her doz için"]
W --> D
AL --> D
D --> T["Saat ve dakika belirlenecek"]
T --> N["Bildirim tetiklenecek"]
N --> R{"Kullanıcı yanıtı"}
R -->|"✅"| TAKEN["Aldı"]
R -->|"❌"| MISSED["Kaçırdı"]
R -->|"⏳"| TBD["Beklemede"]
style A fill:#f5a623,stroke:#333,color:#000
style TAKEN fill:#27ae60,stroke:#333,color:#fff
style MISSED fill:#e74c3c,stroke:#333,color:#fff
style TBD fill:#95a5a6,stroke:#333,color:#fff
flowchart LR
A["📱 Cihaz yeniden başlayacak"] --> B["HeadlessJS tetiklenecek"]
B --> C["Alarmlar yeniden kurulacak"]
D["Arka plan bildirimi"] --> E["Redux thunk çalışacak"]
E --> F["Durum güncellenecek"]
G["Redux Persist"] --> H["Tüm veriler çevrimdışı saklanacak"]
H --> I["AsyncStorage"]
style A fill:#e74c3c,stroke:#333,color:#fff
style G fill:#3498db,stroke:#333,color:#fff