Skip to content

Instantly share code, notes, and snippets.

@erkantaylan
Created February 13, 2026 13:41
Show Gist options
  • Select an option

  • Save erkantaylan/2d67ce4a73d661938663b93c3003c7a3 to your computer and use it in GitHub Desktop.

Select an option

Save erkantaylan/2d67ce4a73d661938663b93c3003c7a3 to your computer and use it in GitHub Desktop.
Mobil - İlaçTarif Entegrasyonu Tasarım Dokümanı

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ı.

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.


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