FHIR Engine लाइब्रेरी का इस्तेमाल करके, FHIR के संसाधन मैनेज करें

1. शुरू करने से पहले

आपको क्या बनाना होगा

इस कोडलैब में, FHIR इंजन लाइब्रेरी का इस्तेमाल करके Android ऐप्लिकेशन बनाया जा सकता है. आपका ऐप्लिकेशन, एफ़एचआईआर सर्वर से एफ़एचआईआर संसाधनों को डाउनलोड करने के लिए, एफ़एचआईआर इंजन लाइब्रेरी का इस्तेमाल करेगा. इसके अलावा, डिवाइस में किए गए बदलावों को सर्वर पर अपलोड करेगा.

आप इन चीज़ों के बारे में जानेंगे

  • Docker का इस्तेमाल करके, लोकल HAPI FHIR सर्वर बनाने का तरीका
  • FHIR इंजन लाइब्रेरी को अपने Android ऐप्लिकेशन के साथ इंटिग्रेट करने का तरीका
  • एफ़एचआईआर संसाधनों को डाउनलोड और अपलोड करने के लिए, एक बार या बार-बार होने वाले जॉब सेट अप करने के लिए सिंक एपीआई का इस्तेमाल कैसे करें
  • Search API इस्तेमाल करने का तरीका
  • स्थानीय तौर पर एफ़एचआईआर संसाधनों को बनाने, पढ़ने, अपडेट करने, और मिटाने के लिए, Data Access API को इस्तेमाल करने का तरीका

आपको इनकी ज़रूरत होगी

अगर आपने पहले Android ऐप्लिकेशन नहीं बनाए हैं, तो आप अपना पहला ऐप्लिकेशन बनाकर शुरुआत कर सकते हैं.

2. टेस्ट डेटा के साथ लोकल HAPI FHIR सर्वर सेट अप करना

HAPI FHIR एक लोकप्रिय ओपन सोर्स FHIR सर्वर है. Android ऐप्लिकेशन से कनेक्ट करने के लिए, हम अपने कोडलैब में लोकल HAPI FHIR सर्वर का इस्तेमाल करते हैं.

स्थानीय HAPI FHIR सर्वर को सेट अप करें

  1. HAPI FHIR
    docker pull hapiproject/hapi:latest
    
    की सबसे नई इमेज पाने के लिए टर्मिनल में यहां दिए गए कमांड को चलाएं
    docker pull hapiproject/hapi:latest
    
  2. पिछली डाउनलोड की गई इमेज hapiproject/hapi को चलाने के लिए Docker डेस्कटॉप का इस्तेमाल करके या नीचे दिए गए निर्देश को चलाकर, HAPI FHIR कंटेनर को बनाएं
    docker run -p 8080:8080 hapiproject/hapi:latest
    
    ज़्यादा जानें.
  3. सर्वर की जांच करने के लिए, http://localhost:8080/ को ब्राउज़र में खोलें. आपको HAPI FHIR का वेब इंटरफ़ेस दिखना चाहिए.HAPI FHIR वेब इंटरफ़ेस

लोकल HAPI FHIR सर्वर को टेस्ट डेटा से भरें

अपने ऐप्लिकेशन की जांच करने के लिए, हमें सर्वर पर कुछ टेस्ट डेटा की ज़रूरत होगी. हम Synthea से जनरेट किए गए सिंथेटिक डेटा का इस्तेमाल करेंगे.

  1. सबसे पहले, हमें सिंथिया-सैंपल से डेटा का सैंपल डाउनलोड करना होगा. synthea_sample_data_fhir_r4_sep2019.zip भाषा को डाउनलोड करें और एक्सट्रैक्ट करें. अन-ज़िप किए गए सैंपल डेटा में कई .json फ़ाइलें होती हैं. हर फ़ाइल, अलग-अलग मरीज़ के लिए ट्रांज़ैक्शन बंडल के तौर पर होती है.
  2. हम तीन मरीज़ों का टेस्ट डेटा, स्थानीय एचएपीआई एफ़एचआईआर सर्वर पर अपलोड करेंगे. JSON फ़ाइलों वाली डायरेक्ट्री में, यहां दिया गया निर्देश चलाएं
    curl -X POST -H "Content-Type: application/json" -d @./Aaron697_Brekke496_2fa15bc7-8866-461a-9000-f739e425860a.json http://localhost:8080/fhir/
    curl -X POST -H "Content-Type: application/json" -d @./Aaron697_Stiedemann542_41166989-975d-4d17-b9de-17f94cb3eec1.json http://localhost:8080/fhir/
    curl -X POST -H "Content-Type: application/json" -d @./Abby752_Kuvalis369_2b083021-e93f-4991-bf49-fd4f20060ef8.json http://localhost:8080/fhir/
    
  3. सभी मरीज़ों का टेस्ट डेटा सर्वर पर अपलोड करने के लिए,
    for f in *.json; do curl -X POST -H "Content-Type: application/json" -d @$f http://localhost:8080/fhir/ ; done
    
    चलाएं हालांकि, इसे पूरा होने में ज़्यादा समय लग सकता है. साथ ही, कोडलैब के लिए यह ज़रूरी नहीं है.
  4. ब्राउज़र में http://localhost:8080/fhir/Patient/ यूआरएल खोलकर, पुष्टि करें कि टेस्ट डेटा सर्वर पर उपलब्ध है. आपको एफ़एचआईआर बंडल में मरीज़ के डेटा वाले पेज के टेक्स्ट HTTP 200 OK और Response Body को खोज के नतीजे के तौर पर total संख्यासर्वर पर डेटा की जांच करें के साथ देखना चाहिए.

3. Android ऐप्लिकेशन सेट अप करना

कोड डाउनलोड करें

इस कोडलैब का कोड डाउनलोड करने के लिए, Android FHIR SDK टूल की रिपॉज़िटरी का क्लोन बनाएं: git clone https://github.com/google/android-fhir.git

इस कोडलैब का स्टार्टर प्रोजेक्ट codelabs/engine में मौजूद है.

ऐप्लिकेशन को Android Studio में इंपोर्ट करें

सबसे पहले, हम Android Studio में स्टार्टर ऐप्लिकेशन इंपोर्ट करते हैं.

Android Studio खोलें, Import Project (Gredle, Eclipse ADT वगैरह) चुनें और पहले से डाउनलोड किए गए सोर्स कोड से codelabs/engine/ फ़ोल्डर चुनें.

Android Studio की शुरुआती स्क्रीन

अपने प्रोजेक्ट को Gradle फ़ाइलों के साथ सिंक करना

आपकी सुविधा के लिए, FHIR इंजन लाइब्रेरी डिपेंडेंसी को पहले ही प्रोजेक्ट में जोड़ा जा चुका है. इससे आपको अपने ऐप्लिकेशन में FHIR इंजन लाइब्रेरी को इंटिग्रेट करने की सुविधा मिल जाती है. अपने प्रोजेक्ट की app/build.gradle.kts फ़ाइल के आखिर में, इन लाइनों को देखें:

dependencies {
    // ...

    implementation("com.google.android.fhir:engine:0.1.0-beta05")
}

यह पक्का करने के लिए कि आपके ऐप्लिकेशन पर सभी डिपेंडेंसी उपलब्ध हों, आपको इस समय अपने प्रोजेक्ट को Gradle फ़ाइलों के साथ सिंक करना चाहिए.

Android Studio के टूलबार से, Gradle फ़ाइलों के साथ प्रोजेक्ट सिंक करें (Gradle सिंक बटन) चुनें. साथ ही, ऐप्लिकेशन को फिर से चलाकर देखें कि डिपेंडेंसी ठीक से काम कर रही है या नहीं.

स्टार्टर ऐप्लिकेशन चलाएं

अब जब आपने Android Studio में प्रोजेक्ट इंपोर्ट कर लिया है, तो अब आप इस ऐप्लिकेशन को पहली बार इस्तेमाल कर सकते हैं.

Android Studio एम्युलेटर शुरू करें. इसके बाद, Android Studio टूलबार में, 'चलाएं' ('रन' बटन) पर क्लिक करें.

Hello World ऐप्लिकेशन

4. FHIR इंजन इंस्टेंस बनाएं

अपने Android ऐप्लिकेशन में FHIR इंजन को शामिल करने के लिए, आपको FHIR इंजन लाइब्रेरी का इस्तेमाल करना होगा और FHIR इंजन का एक इंस्टेंस शुरू करना होगा. नीचे बताए गए चरणों से, आपको इस प्रोसेस को पूरा करने में मदद मिलेगी.

  1. अपनी ऐप्लिकेशन क्लास पर जाएं. इस उदाहरण में FhirApplication.kt है, जो app/src/main/java/com/google/android/fhir/codelabs/engine में मौजूद है.
  2. FHIR इंजन को शुरू करने के लिए, onCreate() तरीके में नीचे दिया गया कोड जोड़ें:
      FhirEngineProvider.init(
          FhirEngineConfiguration(
            enableEncryptionIfSupported = true,
            RECREATE_AT_OPEN,
            ServerConfiguration(
              baseUrl = "http://10.0.2.2:8080/fhir/",
              httpLogger =
                HttpLogger(
                  HttpLogger.Configuration(
                    if (BuildConfig.DEBUG) HttpLogger.Level.BODY else HttpLogger.Level.BASIC,
                  ),
                ) {
                  Log.d("App-HttpLog", it)
                },
            ),
          ),
      )
    
    ध्यान दें:
    • enableEncryptionIfSupported: अगर डिवाइस पर डेटा एन्क्रिप्ट (सुरक्षित) करने की सुविधा काम करती है, तो इसे चालू कर देता है.
    • RECREATE_AT_OPEN: इससे डेटाबेस की गड़बड़ी की रणनीति तय की जाती है. ऐसे मामले में, अगर खुलने पर कोई गड़बड़ी होती है, तो यह डेटाबेस को फिर से बनाता है.
    • ServerConfiguration में baseUrl: यह FHIR सर्वर का बेस यूआरएल है. दिया गया आईपी पता 10.0.2.2 खास तौर पर localhost के लिए रिज़र्व है. इसे Android एम्युलेटर से ऐक्सेस किया जा सकता है. ज़्यादा जानें.
  3. FhirApplication क्लास में, एफ़एचआईआर इंजन को लेज़ीली इंस्टैंशिएट करने के लिए यह लाइन जोड़ें:
      private val fhirEngine: FhirEngine by
          lazy { FhirEngineProvider.getInstance(this) }
    
    इससे यह पक्का होता है कि FhirEngine इंस्टेंस सिर्फ़ तब बनाया जाए, जब उसे पहली बार ऐक्सेस किया गया हो, न कि ऐप्लिकेशन शुरू होने पर.
  4. अपने पूरे ऐप्लिकेशन को आसानी से ऐक्सेस करने के लिए, FhirApplication क्लास में सुविधा का यह तरीका जोड़ें:
    companion object {
        fun fhirEngine(context: Context) =
            (context.applicationContext as FhirApplication).fhirEngine
    }
    
    इस स्टैटिक तरीके से, आपको कॉन्टेक्स्ट का इस्तेमाल करके ऐप्लिकेशन में कहीं से भी FHIR इंजन इंस्टेंस वापस लाने की सुविधा मिलती है.

5. FHIR सर्वर के साथ डेटा सिंक करना

  1. नई क्लास DownloadWorkManagerImpl.kt बनाएं. इस क्लास में, आपको यह तय करना होगा कि ऐप्लिकेशन, सूची में से अगले रिसॉर्स को डाउनलोड करने के लिए कैसे फ़ेच करेगा.:
      class DownloadWorkManagerImpl : DownloadWorkManager {
        private val urls = LinkedList(listOf("Patient"))
    
        override suspend fun getNextRequest(): DownloadRequest? {
          val url = urls.poll() ?: return null
          return DownloadRequest.of(url)
        }
    
        override suspend fun getSummaryRequestUrls() = mapOf<ResourceType, String>()
    
        override suspend fun processResponse(response: Resource): Collection<Resource> {
          var bundleCollection: Collection<Resource> = mutableListOf()
          if (response is Bundle && response.type == Bundle.BundleType.SEARCHSET) {
            bundleCollection = response.entry.map { it.resource }
          }
          return bundleCollection
        }
      }
    
    अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है इस क्लास के पास संसाधनों की सूची है, जिसे वह डाउनलोड करना चाहता है. यह रिस्पॉन्स को प्रोसेस करता है और लौटाए गए बंडल से रिसॉर्स निकालता है, जो लोकल डेटाबेस में सेव हो जाते हैं.
  2. नई क्लास बनाएं AppFhirSyncWorker.kt यह क्लास तय करती है कि ऐप्लिकेशन, बैकग्राउंड वर्कर का इस्तेमाल करके रिमोट FHIR सर्वर से कैसे सिंक करेगा.
    class AppFhirSyncWorker(appContext: Context, workerParams: WorkerParameters) :
      FhirSyncWorker(appContext, workerParams) {
    
      override fun getDownloadWorkManager() = DownloadWorkManagerImpl()
    
      override fun getConflictResolver() = AcceptLocalConflictResolver
    
      override fun getFhirEngine() = FhirApplication.fhirEngine(applicationContext)
    }
    
    अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है यहां, हमने बताया है कि सिंक करने के लिए किस डाउनलोड मैनेजर, कॉन्फ़्लिक्ट रिज़ॉल्वर, और FHIR इंजन इंस्टेंस का इस्तेमाल करना है.
  3. अपने ViewModel PatientListViewModel.kt में, आपको एक बार इस्तेमाल किए जाने वाले सिंक मैकेनिज़्म को सेट अप करना होगा. यह कोड ढूंढें और उसे triggerOneTimeSync() फ़ंक्शन में जोड़ें:
    viewModelScope.launch {
          Sync.oneTimeSync<AppFhirSyncWorker>(getApplication())
            .shareIn(this, SharingStarted.Eagerly, 10)
            .collect { _pollState.emit(it) }
        }
    
    यह कोरूटीन, उस AppFhirSyncWorker का इस्तेमाल करके FHIR सर्वर के साथ एक बार सिंक शुरू करता है जिसे हमने पहले बताया था. इसके बाद, वह सिंक की स्थिति के आधार पर यूज़र इंटरफ़ेस (यूआई) को अपडेट करेगा.
  4. PatientListFragment.kt फ़ाइल में, handleSyncJobStatus फ़ंक्शन का मुख्य हिस्सा अपडेट करें:
    when (syncJobStatus) {
        is SyncJobStatus.Finished -> {
            Toast.makeText(requireContext(), "Sync Finished", Toast.LENGTH_SHORT).show()
            viewModel.searchPatientsByName("")
        }
        else -> {}
    }
    
    यहां सिंक की प्रोसेस पूरी होने के बाद, उपयोगकर्ता को इसकी सूचना देने वाला एक टोस्ट मैसेज दिखेगा. इसके बाद, ऐप्लिकेशन सभी मरीज़ों के नाम को बिना किसी शब्द के खोजने के ज़रिए दिखाएगा.

सब कुछ सेट अप हो गया है. अब अपना ऐप्लिकेशन चलाएं. मेन्यू में Sync बटन पर क्लिक करें. अगर सब कुछ ठीक से काम करता है, तो आपको अपने लोकल FHIR सर्वर से मरीज़ों को ऐप्लिकेशन में डाउनलोड होते हुए देखना चाहिए.

मरीज़ की सूची

6. मरीज़ के डेटा में बदलाव करें और उसे अपलोड करें

इस सेक्शन में, हम आपको चुनिंदा शर्तों के हिसाब से मरीज़ के डेटा में बदलाव करने का तरीका बताएंगे. साथ ही, अपडेट किया गया डेटा आपके एफ़एचआईआर सर्वर पर अपलोड करने का तरीका बताएंगे. खास तौर पर, हम Wakefield और Taunton में रहने वाले मरीज़ों के शहरों के पते बदल देंगे.

पहला चरण: PatientListViewModel में बदलाव वाला लॉजिक सेट अप करना

इस सेक्शन का कोड PatientListViewModel के triggerUpdate फ़ंक्शन में जोड़ दिया गया है

  1. FHIR इंजन को ऐक्सेस करें:PatientListViewModel.kt में FHIR इंजन का रेफ़रंस लेते हुए शुरुआत करें.
    viewModelScope.launch {
       val fhirEngine = FhirApplication.fhirEngine(getApplication())
    
    अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है यह कोड, ViewModel के स्कोप में एक कोरूटीन लॉन्च करता है और एफ़एचआईआर इंजन को शुरू करता है.
  2. वेकफ़ील्ड से मरीज़ों को खोजें:Wakefield के पते वाले मरीज़ों को खोजने के लिए एफ़एचआईआर इंजन का इस्तेमाल करें.
    val patientsFromWakefield =
         fhirEngine.search<Patient> {
           filter(
             Patient.ADDRESS_CITY,
             {
               modifier =  StringFilterModifier.MATCHES_EXACTLY
               value = "Wakefield"
             }
           )
         }
    
    अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है यहां, मरीज़ों को उनके पते के शहर के हिसाब से फ़िल्टर करने के लिए, एफ़एचआईआर इंजन के search तरीके का इस्तेमाल किया जाता है. इस नतीजे में, वेकफ़ील्ड के मरीज़ों की सूची शामिल की जाएगी.
  3. टॉन्टन के मरीज़ों को खोजें:इसी तरह, ऐसे मरीज़ खोजें जिनका पता Taunton है.
    val patientsFromTaunton =
         fhirEngine.search<Patient> {
           filter(
             Patient.ADDRESS_CITY,
             {
               modifier =  StringFilterModifier.MATCHES_EXACTLY
               value = "Taunton"
             }
           )
         }
    
    अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है अब हमारे पास मरीज़ों की दो सूची हैं - एक वेकफ़ील्ड से और दूसरी टॉन्टन से.
  4. बीमारी के पते में बदलाव करें:patientsFromWakefield सूची में दिए गए हर मरीज़ के बारे में देखें, उसके शहर का नाम बदलकर Taunton करें, और एफ़एचआईआर इंजन में उसकी जानकारी अपडेट करें.
    patientsFromWakefield.forEach {
         it.resource.address.first().city = "Taunton"
         fhirEngine.update(it.resource)
    }
    
    अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है इसी तरह, patientsFromTaunton सूची में मौजूद हर मरीज़ के नाम को अपडेट करें, ताकि उसके शहर का नाम बदलकर Wakefield हो जाए.
    patientsFromTaunton.forEach {
         it.resource.address.first().city = "Wakefield"
         fhirEngine.update(it.resource)
    }
    
  5. सिंक्रोनाइज़ेशन शुरू करें:डेटा में स्थानीय तौर पर बदलाव करने के बाद, डेटा को एक बार सिंक करें. इससे यह पक्का किया जा सकेगा कि एफ़एचआईआर सर्वर पर डेटा अपडेट हो.
    triggerOneTimeSync()
    }
    
    अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है क्लोज़िंग ब्रैकेट } से यह पता चलता है कि शुरुआत में लॉन्च किए गए कोरूटीन की समयसीमा खत्म हो रही है.

दूसरा चरण: सुविधाओं की जांच करना

  1. यूज़र इंटरफ़ेस (यूआई) की जांच:अपना ऐप्लिकेशन चलाएं. मेन्यू में Update बटन पर क्लिक करें. आपको यह दिखना चाहिए कि मरीज़ Aaron697 और Abby752 की अदला-बदली करने वाले मरीज़ों का पता शहर का है.
  2. सर्वर की पुष्टि:कोई ब्राउज़र खोलें और http://localhost:8080/fhir/Patient/ पर जाएं. पुष्टि करें कि Aaron697 और Abby752 के मरीज़ों के पते की जानकारी, स्थानीय एफ़एचआईआर सर्वर पर अपडेट है.

यह तरीका अपनाकर, आपने मरीज़ों के डेटा में बदलाव करने और उन्हें अपने एफ़एचआईआर सर्वर के साथ सिंक करने का तरीका लागू कर लिया है.

7. मरीज़ों को नाम से खोजें

मरीज़ों को उनके नाम से खोजने की सुविधा, यूज़र-फ़्रेंडली तरीके से जानकारी हासिल करने में मदद कर सकती है. यहां हम आपको अपने ऐप्लिकेशन में इस सुविधा को लागू करने की प्रक्रिया के बारे में बताएंगे.

पहला चरण: फ़ंक्शन सिग्नेचर अपडेट करें

अपनी PatientListViewModel.kt फ़ाइल पर जाएं और searchPatientsByName नाम का फ़ंक्शन ढूंढें. हम इस फ़ंक्शन में कोड जोड़ेंगे.

नाम वाली क्वेरी के आधार पर नतीजों को फ़िल्टर करने और यूज़र इंटरफ़ेस (यूआई) को अपडेट करने के नतीजे भेजने के लिए, शर्तों के साथ कोड ब्लॉक करें. यह नीचे दिया गया है:

    viewModelScope.launch {
      val fhirEngine = FhirApplication.fhirEngine(getApplication())
      if (nameQuery.isNotEmpty()) {
        val searchResult = fhirEngine.search<Patient> {
          filter(
            Patient.NAME,
            {
              modifier = StringFilterModifier.CONTAINS
              value = nameQuery
            },
          )
        }
        liveSearchedPatients.value  =  searchResult.map { it.resource }
      }
    }

यहां, अगर nameQuery खाली नहीं है, तो खोज फ़ंक्शन, नतीजों को फ़िल्टर करके सिर्फ़ उन मरीज़ों को शामिल करेगा जिनके नाम में पहले से क्वेरी शामिल है.

दूसरा चरण: खोज से जुड़े नए फ़ंक्शन की जांच करना

  1. ऐप्लिकेशन को फिर से लॉन्च करें:ये बदलाव करने के बाद, अपने ऐप्लिकेशन को फिर से बनाएं और चलाएं.
  2. मरीज़ खोजें: मरीज़ की सूची वाली स्क्रीन पर, खोजने की सुविधा का इस्तेमाल करें. इसके बाद, मरीज़ों की सूची को फ़िल्टर करने के लिए कोई नाम (या नाम का कोई हिस्सा) डाला जा सकता है.

इन चरणों को पूरा करने के बाद, आपने लोगों को बेहतर तरीके से यह सुविधा दे दी है कि वे मरीज़ों को उनके नाम से खोज सकते हैं. इससे उपयोगकर्ता अनुभव और डेटा वापस पाने की क्षमता काफ़ी बेहतर हो सकती है.

8. बधाई हो!

आपने अपने ऐप्लिकेशन में FHIR के संसाधनों को मैनेज करने के लिए, FHIR इंजन लाइब्रेरी का इस्तेमाल किया है:

  • FHIR के संसाधनों को FHIR सर्वर के साथ सिंक करने के लिए, Sync API का इस्तेमाल करें
  • लोकल एफ़एचआईआर संसाधनों को बनाने, पढ़ने, अपडेट करने, और मिटाने के लिए Data Access API का इस्तेमाल करें
  • स्थानीय एफ़एचआईआर संसाधनों को खोजने के लिए, Search API का इस्तेमाल करें

हमने इन विषयों के बारे में बताया

  • लोकल HAPI FHIR सर्वर को सेट अप करने का तरीका
  • स्थानीय HAPI FHIR सर्वर पर टेस्ट डेटा कैसे अपलोड करें
  • FHIR इंजन लाइब्रेरी का इस्तेमाल करके Android ऐप्लिकेशन बनाने का तरीका
  • FHIR इंजन लाइब्रेरी में सिंक एपीआई, Data Access API, और Search API को इस्तेमाल करने का तरीका

अगले चरण

  • एफ़एचआईआर इंजन लाइब्रेरी के दस्तावेज़ देखें
  • Search API की बेहतर सुविधाओं के बारे में जानें
  • अपने Android ऐप्लिकेशन में FHIR इंजन लाइब्रेरी का इस्तेमाल करें

ज़्यादा जानें