@@ -22,6 +22,7 @@ import androidx.lifecycle.MutableLiveData
22
22
import androidx.lifecycle.ViewModel
23
23
import androidx.lifecycle.viewModelScope
24
24
import dagger.hilt.android.lifecycle.HiltViewModel
25
+ import io.jsonwebtoken.Jwts
25
26
import java.net.UnknownHostException
26
27
import javax.inject.Inject
27
28
import kotlinx.coroutines.CoroutineScope
@@ -126,9 +127,9 @@ constructor(
126
127
_loginErrorState .postValue(LoginErrorState .ERROR_FETCHING_USER )
127
128
}
128
129
129
- private suspend fun fetchPractitioner (userInfo : UserInfo ? ): Result <Bundle > {
130
+ private suspend fun fetchPractitioner (keycloakUuid : String ? ): Result <Bundle > {
130
131
val endpointResult =
131
- userInfo?. keycloakUuid?.takeIf { it.isNotBlank() }?.practitionerEndpointUrl()?.runCatching {
132
+ keycloakUuid?.takeIf { it.isNotBlank() }?.practitionerEndpointUrl()?.runCatching {
132
133
fhirResourceService.getResource(url = this )
133
134
}
134
135
? : Result .failure(NullPointerException (" Keycloak user is null. Failed to fetch user." ))
@@ -194,10 +195,13 @@ constructor(
194
195
val accessTokenResult = fetchAccessToken(trimmedUsername, passwordAsCharArray)
195
196
if (accessTokenResult.isFailure) return
196
197
197
- val userInfoResult = fetchUserInfo()
198
- if (userInfoResult.isFailure) return
198
+ if (accessTokenResult.getOrNull() == null ) return
199
199
200
- val practitionerDetailsResult = fetchPractitioner(userInfoResult.getOrNull())
200
+ val jwtParser = Jwts .parser()
201
+ val jwt = accessTokenResult.getOrNull()!! .accessToken!! .substringBeforeLast(' .' ).plus(" ." )
202
+ val subClaim = jwtParser.parseClaimsJwt(jwt)
203
+ val keycloakUuid = subClaim.body[" sub" ].toString()
204
+ val practitionerDetailsResult = fetchPractitioner(keycloakUuid)
201
205
if (practitionerDetailsResult.isFailure) return
202
206
203
207
savePractitionerDetails(practitionerDetailsResult.getOrDefault(Bundle ()))
0 commit comments