Skip to content

Instantly share code, notes, and snippets.

@erkantaylan
Last active February 13, 2026 13:33
Show Gist options
  • Select an option

  • Save erkantaylan/2212c5c1bca154bb607c3f7aafc997fb to your computer and use it in GitHub Desktop.

Select an option

Save erkantaylan/2212c5c1bca154bb607c3f7aafc997fb to your computer and use it in GitHub Desktop.

Mobil - İlaçTarif Entegrasyonu (Tasarım Dokümanı)

Mercury ekosisteminde Mobile (React Native) ve İlaçTarif (WPF/.NET masaüstü) uygulamaları arasında planlananan teknik mimari ve iletişim tasarımı.


Teknoloji Yığını

Mobile (Alternet.Mercury.Mobile)

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

İlaçTarif (MedicineFullSystem.sln)

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)

Yazılım Mimarisi

Mobile Uygulama Yapısı

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 Uygulama Yapısı

İ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

İletişim Mimarisi

Genel Akış

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
Loading

API Yol Haritası

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
Loading

Planlanan API Endpoint'leri

1. Kimlik Doğrulama (/patient/login/)

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

2. Reçete İşlemleri (/patient/prescription/)

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)

3. Cihaz Yönetimi (/mobile/device/)

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

4. İlaç Sorgulama (/mobile/drug/)

Metod Endpoint Açıklama
GET /mobile/drug/by-barcode/{barcode}?deviceId={id} Barkodla ilaç bilgisi sorgulanacak

5. Hesap İşlemleri

Metod Endpoint Açıklama
DELETE /mobile/account/delete Hesap silinecek (telefon + cihaz doğrulaması gerekecek)

Şifreleme Modeli

Mobile ve İlaçTarif arasında hibrit RSA + AES şifreleme kullanılacaktır:

Şifreleme Akışı

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
Loading

İlgili Dosyalar

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

Veri Modelleri

Reçete (Prescription)

Prescription {
  Id: UUID
  Date: ISO8601
  HospitalName: string         // Hastane adı
  ClinicName: string            // Klinik adı
  Drugs: Drug[]                 // İlaç listesi
  IsArchived: boolean           // Arşivlenmiş mi
}

İlaç (Drug)

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
}

Cihaz (Device)

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
}

Reçete Tutarı (PrescriptionAmount) — İlaçTarif Tarafı

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
}

Kimlik Doğrulama Akışı

İlk Giriş (Mobile)

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
Loading

Otomatik Giriş (Sonraki Açılışlar)

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
Loading

Cihaz Kayıt Akışı

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[])
Loading

Bildirim Sistemi (Mobile)

Yerel Bildirimler

  • 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)

Alarm Yapılandırma

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
Loading

Arka Plan İşlemleri

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
Loading
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment