Skip to content

Commit

Permalink
Temp
Browse files Browse the repository at this point in the history
  • Loading branch information
FikriMilano committed Aug 12, 2022
1 parent fe026b8 commit 2cdf1a6
Show file tree
Hide file tree
Showing 24 changed files with 162 additions and 407 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ import android.os.Bundle
import android.os.Handler
import android.os.Looper
import androidx.core.os.bundleOf
import ca.uhn.fhir.parser.IParser
import dagger.hilt.android.qualifiers.ApplicationContext
import java.util.Locale
import javax.inject.Inject
Expand All @@ -41,12 +40,8 @@ import org.smartregister.fhircore.engine.data.remote.auth.OAuthService
import org.smartregister.fhircore.engine.data.remote.fhir.resource.FhirResourceService
import org.smartregister.fhircore.engine.data.remote.model.response.OAuthResponse
import org.smartregister.fhircore.engine.ui.login.LoginActivity
import org.smartregister.fhircore.engine.util.DispatcherProvider
import org.smartregister.fhircore.engine.util.FhirContextUtil
import org.smartregister.fhircore.engine.util.SecureSharedPreference
import org.smartregister.fhircore.engine.util.SharedPreferencesHelper
import org.smartregister.fhircore.engine.util.*
import org.smartregister.fhircore.engine.util.extension.showToast
import org.smartregister.fhircore.engine.util.toSha1
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
Expand Down Expand Up @@ -176,18 +171,6 @@ constructor(

fun getUserInfo(): Call<ResponseBody> = oAuthService.userInfo()

// TODO move to some external file
suspend fun getPractitionerDetails(keycloak_uuid: String): org.hl7.fhir.r4.model.Bundle {

val iParser: IParser = FhirContextUtil.getPractitionerDetailParser()

val qJson =
context.assets.open("sample_practitionar_payload.json").bufferedReader().use { it.readText() }

return iParser.parseResource(qJson) as org.hl7.fhir.r4.model.Bundle
}
// fhirResourceService.getResource("practitioner-details/$keycloak_uuid")

fun refreshToken(refreshToken: String): OAuthResponse? {
val data = buildOAuthPayload(REFRESH_TOKEN)
data[REFRESH_TOKEN] = refreshToken
Expand All @@ -199,6 +182,18 @@ constructor(
}
}

suspend fun getPractitionerDetailsFromAssets(): org.hl7.fhir.r4.model.Bundle {
val json =
context.assets.open("sample_practitionar_payload.json").bufferedReader().use { it.readText() }
return PractitionerDetailsUtil.getCustomJsonParser().parseResource(json) as org.hl7.fhir.r4.model.Bundle
}

suspend fun getPractitionerDetails(keycloakUuid: String): org.hl7.fhir.r4.model.Bundle {
return fhirResourceService.getResource(
url = PractitionerDetailsUtil.getUrl(keycloakUuid)
)
}

@Throws(NetworkErrorException::class)
fun fetchToken(username: String, password: CharArray): Call<OAuthResponse> {
val data = buildOAuthPayload(PASSWORD)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ import org.hl7.fhir.r4.model.Composition
import org.hl7.fhir.r4.model.ResourceType
import org.smartregister.fhircore.engine.data.local.DefaultRepository
import org.smartregister.fhircore.engine.data.remote.fhir.resource.FhirResourceDataSource
import org.smartregister.fhircore.engine.util.APP_ID_KEY
import org.smartregister.fhircore.engine.util.DispatcherProvider
import org.smartregister.fhircore.engine.util.SharedPreferenceKey
import org.smartregister.fhircore.engine.util.SharedPreferencesHelper
import org.smartregister.fhircore.engine.util.extension.camelCase
import org.smartregister.fhircore.engine.util.extension.decodeJson
Expand Down Expand Up @@ -276,7 +276,7 @@ constructor(
// TODO load these type of configs from assets too
CoroutineScope(dispatcherProvider.io()).launch {
try {
sharedPreferencesHelper.read(APP_ID_KEY, null)?.let { appId: String ->
sharedPreferencesHelper.read(SharedPreferenceKey.APP_ID.name, null)?.let { appId: String ->
repository.searchCompositionByIdentifier(appId)?.let { composition ->
composition
.retrieveCompositionSections()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import org.smartregister.fhircore.engine.data.remote.auth.OAuthService
import org.smartregister.fhircore.engine.data.remote.fhir.resource.FhirConverterFactory
import org.smartregister.fhircore.engine.data.remote.fhir.resource.FhirResourceService
import org.smartregister.fhircore.engine.data.remote.shared.interceptor.OAuthInterceptor
import org.smartregister.fhircore.engine.util.PractitionerDetailsUtil
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory

Expand Down Expand Up @@ -73,7 +74,8 @@ class NetworkModule {
.build()
.create(OAuthService::class.java)

@Provides fun provideParser(): IParser = FhirContext.forR4Cached().newJsonParser()
// @Provides fun provideParser(): IParser = FhirContext.forR4Cached().newJsonParser()
@Provides fun provideParser(): IParser = PractitionerDetailsUtil.getCustomJsonParser()

@Provides
fun provideFhirResourceService(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,7 @@ import kotlinx.coroutines.launch
import org.smartregister.fhircore.engine.configuration.ConfigurationRegistry
import org.smartregister.fhircore.engine.configuration.app.ConfigService
import org.smartregister.fhircore.engine.data.remote.model.response.UserInfo
import org.smartregister.fhircore.engine.util.DefaultDispatcherProvider
import org.smartregister.fhircore.engine.util.DispatcherProvider
import org.smartregister.fhircore.engine.util.SharedPreferencesHelper
import org.smartregister.fhircore.engine.util.USER_INFO_SHARED_PREFERENCE_KEY
import org.smartregister.fhircore.engine.util.*
import org.smartregister.fhircore.engine.util.extension.decodeJson
import timber.log.Timber

Expand Down Expand Up @@ -60,7 +57,7 @@ class SyncBroadcaster(
.loadRegistrySyncParams(
configurationRegistry,
sharedPreferencesHelper
.read(USER_INFO_SHARED_PREFERENCE_KEY, null)
.read(SharedPreferenceKey.USER_INFO.name, null)
?.decodeJson<UserInfo>()
)
.toMap()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@ import org.smartregister.fhircore.engine.configuration.ConfigurationRegistry
import org.smartregister.fhircore.engine.ui.login.LoginActivity
import org.smartregister.fhircore.engine.ui.login.LoginService
import org.smartregister.fhircore.engine.ui.theme.AppTheme
import org.smartregister.fhircore.engine.util.APP_ID_KEY
import org.smartregister.fhircore.engine.util.DispatcherProvider
import org.smartregister.fhircore.engine.util.SharedPreferenceKey
import org.smartregister.fhircore.engine.util.SharedPreferencesHelper
import org.smartregister.fhircore.engine.util.extension.showToast

Expand Down Expand Up @@ -73,7 +73,7 @@ class AppSettingActivity : AppCompatActivity() {
configurationRegistry.loadConfigurations(context = appSettingActivity, appId = appId) {
loadSuccessful: Boolean ->
if (loadSuccessful) {
sharedPreferencesHelper.write(APP_ID_KEY, appId)
sharedPreferencesHelper.write(SharedPreferenceKey.APP_ID.name, appId)
if (!isLoggedIn) {
accountAuthenticator.launchScreen(LoginActivity::class.java)
} else {
Expand All @@ -95,7 +95,7 @@ class AppSettingActivity : AppCompatActivity() {
configurationRegistry.loadConfigurations(context = appSettingActivity, appId = appId) {
loadSuccessful: Boolean ->
if (loadSuccessful) {
sharedPreferencesHelper.write(APP_ID_KEY, appId)
sharedPreferencesHelper.write(SharedPreferenceKey.APP_ID.name, appId)
accountAuthenticator.launchScreen(LoginActivity::class.java)
finish()
} else {
Expand Down Expand Up @@ -130,7 +130,7 @@ class AppSettingActivity : AppCompatActivity() {
}
}

val lastAppId = sharedPreferencesHelper.read(APP_ID_KEY, null)?.trimEnd()
val lastAppId = sharedPreferencesHelper.read(SharedPreferenceKey.APP_ID.name, null)?.trimEnd()
lastAppId?.let {
with(appSettingViewModel) {
onApplicationIdChanged(it)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,35 +28,29 @@ import androidx.lifecycle.viewModelScope
import com.google.android.fhir.FhirEngine
import com.google.android.fhir.sync.State
import com.google.android.fhir.sync.SyncJob
import com.google.gson.Gson
import dagger.hilt.android.lifecycle.HiltViewModel
import java.io.IOException
import java.net.UnknownHostException
import javax.inject.Inject
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.launch
import okhttp3.ResponseBody
import org.hl7.fhir.r4.model.Practitioner
import org.hl7.fhir.r4.model.ResourceType
import org.jetbrains.annotations.TestOnly
import org.smartregister.fhircore.engine.auth.AccountAuthenticator
import org.smartregister.fhircore.engine.configuration.ConfigType
import org.smartregister.fhircore.engine.configuration.ConfigurationRegistry
import org.smartregister.fhircore.engine.configuration.app.ApplicationConfiguration
import org.smartregister.fhircore.engine.data.remote.fhir.resource.FhirResourceDataSource
//import org.smartregister.fhircore.engine.configuration.view.LoginViewConfiguration
//import org.smartregister.fhircore.engine.configuration.view.loginViewConfigurationOf
import org.smartregister.fhircore.engine.data.remote.model.response.OAuthResponse
import org.smartregister.fhircore.engine.data.remote.model.response.UserInfo
import org.smartregister.fhircore.engine.data.remote.shared.ResponseCallback
import org.smartregister.fhircore.engine.data.remote.shared.ResponseHandler
import org.smartregister.fhircore.engine.util.DispatcherProvider
import org.smartregister.fhircore.engine.util.LOGGED_IN_PRACTITIONER
import org.smartregister.fhircore.engine.util.PractitionerDetailsUtils
import org.smartregister.fhircore.engine.util.SharedPreferenceKey
import org.smartregister.fhircore.engine.util.SharedPreferencesHelper
import org.smartregister.fhircore.engine.util.USER_INFO_SHARED_PREFERENCE_KEY
import org.smartregister.fhircore.engine.util.extension.decodeJson
import org.smartregister.fhircore.engine.util.extension.encodeJson
import org.smartregister.fhircore.engine.util.extension.encodeResourceToString
import org.smartregister.fhircore.engine.util.extension.valueToString
import org.smartregister.model.practitioner.PractitionerDetails
import retrofit2.Call
import retrofit2.Response
Expand All @@ -72,8 +66,8 @@ constructor(
val configurationRegistry: ConfigurationRegistry,
val accountAuthenticator: AccountAuthenticator,
val dispatcher: DispatcherProvider,
val practitionerDetailsUtils: PractitionerDetailsUtils,
val sharedPreferences: SharedPreferencesHelper,
val gson: Gson
) : ViewModel(), AccountManagerCallback<Bundle> {

private val _launchDialPad: MutableLiveData<String?> = MutableLiveData(null)
Expand All @@ -90,23 +84,33 @@ constructor(
val responseBodyHandler =
object : ResponseHandler<ResponseBody> {
override fun handleResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
if (response.isSuccessful) {
response.body()?.let {
Timber.d(it.string())
with(it.string().decodeJson<UserInfo>()) {
storeUserPreferences(this)
viewModelScope.launch(dispatcher.io()) {
callPractitionerDetails(this@with)
}
fetchLoggedInPractitioner(this)
// _showProgressBar.postValue(false)
// _navigateToHome.postValue(true)
}
}
} else {
if (!response.isSuccessful) {
handleFailure(call, IOException("Network call failed with $response"))
Timber.i(response.errorBody()?.toString())
return
}

val jsonResponseBody = response.body()!!.string()
Timber.d("FIKRI: $jsonResponseBody")

this@LoginViewModel.runCatching {
viewModelScope.launch(dispatcher.io()) {
val bundle = accountAuthenticator.getPractitionerDetails(
keycloakUuid = jsonResponseBody.decodeJson<UserInfo>().keycloakUuid!!
)
savePractitionerDetails(bundle)
Timber.d("FIKRI2: ${bundle.valueToString()}")
}
}
.onSuccess {
_showProgressBar.postValue(false)
_navigateToHome.postValue(true)
}
.onFailure { throwable ->
Timber.e("Error fetching practitioner details", throwable)
handleErrorMessage(throwable)
_showProgressBar.postValue(false)
}
Timber.i(response.errorBody()?.toString() ?: "No error")
}

override fun handleFailure(call: Call<ResponseBody>, throwable: Throwable) {
Expand All @@ -116,36 +120,23 @@ constructor(
}
}

private fun storeUserPreferences(userInfo: UserInfo) {
sharedPreferences.write(USER_INFO_SHARED_PREFERENCE_KEY, userInfo.encodeJson())
}
suspend fun savePractitionerDetails(bundle: org.hl7.fhir.r4.model.Bundle) {
if (!bundle.hasEntry()) return

suspend fun callPractitionerDetails(userResponse: UserInfo) {
val bundle = accountAuthenticator.getPractitionerDetails(userResponse.keyclockuuid!!)
if (bundle.hasEntry()) {
val practitionerDetails = bundle.entry[0].resource as PractitionerDetails
val careTeamList = practitionerDetails.fhirPractitionerDetails.careTeams
val organizationList = practitionerDetails.fhirPractitionerDetails.organizations
val locationList = practitionerDetails.fhirPractitionerDetails.locations
practitionerDetailsUtils.updateUserDetailsFromPractitionerDetails(
practitionerDetails,
userResponse
)
practitionerDetailsUtils.storeKeyClockInfo(practitionerDetails)

practitionerDetailsUtils.saveParameter(
practitionerId = practitionerDetails.userDetail.id,
careTeamList = careTeamList,
organizationList = organizationList,
locationList = locationList
)

locationList.forEach { fhirEngine.save(it) }

organizationList.forEach { fhirEngine.save(it) }

careTeamList.forEach { fhirEngine.save(it) }
}
val practitionerDetails = bundle.entry.first().resource as PractitionerDetails

val careTeams = practitionerDetails.fhirPractitionerDetails.careTeams
val organizations = practitionerDetails.fhirPractitionerDetails.organizations
val locations = practitionerDetails.fhirPractitionerDetails.locations

val careTeamIds = fhirEngine.create(*careTeams.toTypedArray())
val organizationIds = fhirEngine.create(*organizations.toTypedArray())
val locationIds = fhirEngine.create(*locations.toTypedArray())

sharedPreferences.write(SharedPreferenceKey.PRACTITIONER_DETAILS_USER_DETAIL.name, practitionerDetails.userDetail)
sharedPreferences.write(SharedPreferenceKey.PRACTITIONER_DETAILS_CARE_TEAM_IDS.name, gson.toJson(careTeamIds))
sharedPreferences.write(SharedPreferenceKey.PRACTITIONER_DETAILS_ORGANIZATION_IDS.name, gson.toJson(organizationIds))
sharedPreferences.write(SharedPreferenceKey.PRACTITIONER_DETAILS_LOCATION_IDS.name, gson.toJson(locationIds))
}

private val userInfoResponseCallback: ResponseCallback<ResponseBody> by lazy {
Expand Down Expand Up @@ -217,37 +208,6 @@ constructor(
configurationRegistry.retrieveConfiguration(ConfigType.Application)
}

fun fetchLoggedInPractitioner(userInfo: UserInfo) {
if (!userInfo.keycloakUuid.isNullOrEmpty() &&
sharedPreferences.read(LOGGED_IN_PRACTITIONER, null) == null
) {
viewModelScope.launch(dispatcher.io()) {
try {
fhirResourceDataSource.search(
ResourceType.Practitioner.name,
mapOf(IDENTIFIER to userInfo.keycloakUuid!!)
)
.run {
if (!this.entry.isNullOrEmpty()) {
sharedPreferences.write(
LOGGED_IN_PRACTITIONER,
(this.entryFirstRep.resource as Practitioner).encodeResourceToString()
)
}
}
} catch (throwable: Throwable) {
Timber.e("Error fetching practitioner details", throwable)
} finally {
_showProgressBar.postValue(false)
_navigateToHome.postValue(true)
}
}
} else {
_showProgressBar.postValue(false)
_navigateToHome.postValue(true)
}
}

fun attemptLocalLogin(): Boolean {
return accountAuthenticator.validLocalCredentials(
username.value!!.trim(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,7 @@ import org.smartregister.fhircore.engine.configuration.ConfigType
import org.smartregister.fhircore.engine.configuration.ConfigurationRegistry
import org.smartregister.fhircore.engine.configuration.app.ApplicationConfiguration
import org.smartregister.fhircore.engine.ui.components.PIN_INPUT_MAX_THRESHOLD
import org.smartregister.fhircore.engine.util.APP_ID_KEY
import org.smartregister.fhircore.engine.util.DispatcherProvider
import org.smartregister.fhircore.engine.util.SecureSharedPreference
import org.smartregister.fhircore.engine.util.SharedPreferencesHelper
import org.smartregister.fhircore.engine.util.*

@HiltViewModel
class PinViewModel
Expand Down Expand Up @@ -83,7 +80,7 @@ constructor(
val username = secureSharedPreference.retrieveSessionUsername()
pinUiState.value =
PinUiState(
appId = sharedPreferences.read(APP_ID_KEY, "")!!,
appId = sharedPreferences.read(SharedPreferenceKey.APP_ID.name, "")!!,
appName = applicationConfiguration.appTitle,
savedPin = secureSharedPreference.retrieveSessionPin() ?: "",
isSetupPage = isSetup,
Expand Down Expand Up @@ -129,7 +126,7 @@ constructor(
}

fun onMenuSettingClicked() {
sharedPreferences.remove(APP_ID_KEY)
sharedPreferences.remove(SharedPreferenceKey.APP_ID.name)
_navigateToSettings.value = true
}
}
Loading

0 comments on commit 2cdf1a6

Please sign in to comment.