import kotlinx.coroutines.*
getCOCreditBureauDetails(restDecisionRequest: DecisionRequest) {
runCatching {
logger.info("Check Offer Credit decision")
// Create a coroutine scope with a thread pool of size 4
val scope = CoroutineScope(Dispatchers.IO.limitedParallelism(4))
scope.launch {
supervisorScope {
var tuResponse: TuGrpcResponse? = null
var lnResponse: LnGrpcResponse? = null
val tuDeferred = async {
if (loanOrchestratorUtil.isFFEnabled(
restDecisionRequest.decisionControls,
ENABLE_TRANSUNION_SERVICE_FEATURE_FLAG_CO
)
) {
transunionGrpcService.softPull(
restDecisionRequest.toGrpcTuRequest(),
transUnionGrpcRetry
)
} else {
null
}
}
val lnDeferred = async {
if (loanOrchestratorUtil.isFFEnabled(
restDecisionRequest.decisionControls,
ENABLE_LEXISNEXIS_FEATURE_FLAG
)
) {
lexisNexisGrpcService.getLoanstackingDetails(
restDecisionRequest.toGrpcLexisNexisRequest(),
lexisNexisGrpcRetry
)
} else {
null
}
}
lnResponse = lnDeferred.await()
tuResponse = tuDeferred.await()
if (lnResponse != null) {
restDecisionRequest.addVendorResponse(
VendorIds.LN_OLN.toString(),
lnResponse!!.rawResponse, lnResponse!!.rawRequest,
lnResponse!!.performanceList
)
}
if (tuResponse != null) {
restDecisionRequest.addVendorResponse(
VendorIds.TU.toString(),
tuResponse!!.response, tuResponse!!.rawRequest,
tuResponse!!.performanceList
)
}
}
}.join() // Wait for the coroutine to complete
}.getOrElse {
logger.error("Error occurred during Credit data Pull", it)
}
}