Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/OY-227__henkiloviitetiedon_hakem…
Browse files Browse the repository at this point in the history
…isen_tehostaminen'
  • Loading branch information
timorantalaiho committed Sep 3, 2018
2 parents 2bca075 + cdd135b commit 6376160
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 49 deletions.
3 changes: 1 addition & 2 deletions src/main/resources/omatsivut-oph.properties
Expand Up @@ -32,6 +32,5 @@ ataru.applications.modify=${url-oppija}/hakemus?modify=$1

url-oppijanumerorekisteri-service=${url-virkailija}/oppijanumerorekisteri-service
oppijanumerorekisteri-service.henkiloByOid=${url-oppijanumerorekisteri-service}/henkilo/$1
oppijanumerorekisteri-service.henkilo-slaves=${url-oppijanumerorekisteri-service}/henkilo/$1/slaves
oppijanumerorekisteri-service.henkilo-master=${url-oppijanumerorekisteri-service}/henkilo/$1/master
oppijanumerorekisteri-service.duplicatesByPersonOids=${url-oppijanumerorekisteri-service}/s2s/duplicateHenkilos
oppijanumerorekisteri-service.henkiloByHetu=${url-oppijanumerorekisteri-service}/henkilo/hetu=$1
Expand Up @@ -2,22 +2,24 @@ package fi.vm.sade.hakemuseditori.oppijanumerorekisteri

import java.util.concurrent.TimeUnit

import fi.vm.sade.groupemailer.Json4sHttp4s
import fi.vm.sade.hakemuseditori.json.JsonFormats
import fi.vm.sade.omatsivut.OphUrlProperties
import fi.vm.sade.omatsivut.config.AppConfig.AppConfig
import fi.vm.sade.utils.cas.{CasAuthenticatingClient, CasClient, CasParams}
import fi.vm.sade.utils.slf4j.Logging
import org.http4s.MediaType.`application/json`
import org.http4s.Method.GET
import org.http4s._
import org.http4s.client.blaze
import org.http4s.{Header, Headers, Request, Uri}
import org.http4s.headers.Accept
import org.json4s
import org.json4s._
import org.json4s.JsonAST.{JNull, JObject, JString, JValue}
import org.json4s.jackson.JsonMethods
import org.json4s.{DefaultFormats, Reader, Writer}
import org.json4s.{DefaultFormats, Reader, Writer, _}
import scalaz.concurrent.Task

import scala.concurrent.duration.Duration
import scalaz.concurrent.Task

case class Henkilo(oid: String, hetu: Option[String])

Expand All @@ -43,19 +45,19 @@ object Henkilo {

trait OppijanumerorekisteriService {
def henkilo(personOid: String): Henkilo
def fetchAllDuplicateOids(pOid: String): List[String]
def fetchAllDuplicateOids(oppijanumero: String): Set[String]
}

trait OppijanumerorekisteriComponent {
val oppijanumerorekisteriService: OppijanumerorekisteriService

class StubbedOppijanumerorekisteriService extends OppijanumerorekisteriService {
override def henkilo(personOid: String): Henkilo = ???
override def fetchAllDuplicateOids(pOid: String): List[String] = List(pOid)

override def fetchAllDuplicateOids(oppijanumero: String): Set[String] = Set(oppijanumero)
}

class RemoteOppijanumerorekisteriService(config: AppConfig) extends OppijanumerorekisteriService with JsonFormats with Logging {
import org.json4s.jackson.JsonMethods._
private val blazeHttpClient = blaze.defaultClient
private val casClient = new CasClient(config.settings.securitySettings.casUrl, blazeHttpClient)
private val casParams = CasParams(
Expand Down Expand Up @@ -91,42 +93,40 @@ trait OppijanumerorekisteriComponent {
httpClient.fetch(request)(r => r.as[String].map(body => decoder(r.status.code, body, request)))
}

override def fetchAllDuplicateOids(pOid: String): List[String] = {
implicit val formats = DefaultFormats
val timeout = 1000*30L

val masterRequest: Request = Request(
uri = uriFromString(OphUrlProperties.url("oppijanumerorekisteri-service.henkilo-master", pOid)),
headers = Headers(callerIdHeader))

val masterOid: String = runHttp[Option[String]](masterRequest) {
case (200, resultString, _) =>
val f: json4s.JValue = parse(resultString).asInstanceOf[JObject]
val oid = f \ "oidHenkilo"
Some(oid.extract[String])
case (code, responseString, _) =>
logger.error("Failed to fetch master oid for user oid {}, response was {}, {}", pOid, Integer.toString(code), responseString)
None
}.runFor(timeoutInMillis = timeout).getOrElse(pOid)

val slaveRequest: Request = Request(
uri = uriFromString(OphUrlProperties.url("oppijanumerorekisteri-service.henkilo-slaves", masterOid)),
headers = Headers(callerIdHeader))

val allOids: List[String] = runHttp(slaveRequest) {
case (200, resultString, _) =>
val slaveOids: Seq[String] = parse(resultString).extract[List[JObject]]
.map(obj => {
val oidObj = obj \ "oidHenkilo"
oidObj.extract[String]
})
List(masterOid) ++ slaveOids
case (code, responseString, _) =>
logger.error("Failed to fetch slave OIDs for user oid {}, response was {}, {}", masterOid, Integer.toString(code), responseString)
List(masterOid)
}.runFor(timeoutInMillis = timeout)

return allOids
override def fetchAllDuplicateOids(oppijanumero: String): Set[String] = {
val timeout = Duration(30, TimeUnit.SECONDS)

val body: json4s.JValue = Extraction.decompose(Map("henkiloOids" -> List(oppijanumero)))
val duplicateHenkilosRequest = Request(
method = Method.POST,
uri = uriFromString(OphUrlProperties.url("oppijanumerorekisteri-service.duplicatesByPersonOids")),
headers = Headers(callerIdHeader, `Accept`(`application/json`))
).withBody(body)(Json4sHttp4s.json4sEncoderOf)

val henkiloviitteet: Seq[Henkiloviite] = httpClient.fetch(duplicateHenkilosRequest)((r: Response) =>
if (r.status == Status.Ok) {
r.as[String].map(parseHenkiloviiteResponse(_, oppijanumero))
} else {
logger.error("Failed to fetch henkiloviite data for user oid {}, response was {}, {}", oppijanumero, r.status, r.body)
Task.now(Nil)
}).runFor(timeout)
val allHenkiloOids: Set[String] = henkiloviitteet.flatMap(viite => Set(viite.henkiloOid, viite.masterOid)).++(Seq(oppijanumero)).toSet
if (allHenkiloOids.size > 1) {
logger.info(s"Got ${allHenkiloOids.size} in total for oppijanumero $oppijanumero : $allHenkiloOids")
}
allHenkiloOids
}

private def parseHenkiloviiteResponse(responseBody: String, oppijanumero: String): Seq[Henkiloviite] = {
try {
JsonMethods.parse(responseBody).extract[Seq[Henkiloviite]]
} catch {
case e: Exception =>
logger.error(s"Problem when parsing Henkiloviite list for $oppijanumero from response '$responseBody'", e)
throw e
}
}
}
}

case class Henkiloviite(henkiloOid: String, masterOid: String)
Expand Up @@ -63,9 +63,9 @@ trait ApplicationsServletContainer {
get("/") {
implicit val formats = DefaultFormats
val timeout = 1000*30L
val pOid: String = personOid()
val oppijanumero: String = personOid()

val allOids: List[String] = oppijanumerorekisteriService.fetchAllDuplicateOids(pOid)
val allOids: Iterable[String] = oppijanumerorekisteriService.fetchAllDuplicateOids(oppijanumero)

var allSuccess = true
val allHakemukset = allOids.flatMap(oid => {
Expand Down
4 changes: 2 additions & 2 deletions src/test/scala/fi/vm/sade/omatsivut/TestProfile.scala
Expand Up @@ -4,9 +4,9 @@ import fi.vm.sade.omatsivut.config.{ComponentRegistry, AppConfig}

object SharedAppConfig {
lazy final val appConfig = new AppConfig.IT
lazy val componentRegistry = {
lazy val componentRegistry: ComponentRegistry = {
val registry = new ComponentRegistry(appConfig)
registry.start
registry.start()
registry
}
}
Expand Down

0 comments on commit 6376160

Please sign in to comment.