Skip to content

Commit

Permalink
Use Java-CAS in ValintaPerusteetService
Browse files Browse the repository at this point in the history
This doesn't have tests, either, so needs to be tested by hand.
  • Loading branch information
pkalliok committed Feb 2, 2024
1 parent 3ef2016 commit 7a53886
Showing 1 changed file with 72 additions and 125 deletions.
Original file line number Diff line number Diff line change
@@ -1,62 +1,66 @@
package fi.vm.sade.valintatulosservice.valintaperusteet

import fi.vm.sade.utils.cas.{CasAuthenticatingClient, CasParams}
import fi.vm.sade.javautils.nio.cas.{CasClient, CasClientBuilder}
import fi.vm.sade.security.ScalaCasConfig
import fi.vm.sade.utils.slf4j.Logging
import fi.vm.sade.valintatulosservice.config.VtsAppConfig.VtsAppConfig
import fi.vm.sade.valintatulosservice.tarjonta.{Haku, HakuFixtures}
import fi.vm.sade.valintatulosservice.valintarekisteri.domain.{HakukohdeOid, NotFoundException, ValintatapajonoOid}
import org.http4s._
import org.http4s.client.blaze.SimpleHttp1Client
import org.http4s.json4s.native.jsonOf
import scalaz.concurrent.Task
import org.asynchttpclient.{RequestBuilder, Response}
import org.json4s.native.JsonMethods.parse
import org.json4s.native.Serialization.write
import org.json4s.DefaultFormats

import scalaz.concurrent.Task
import java.util.concurrent.TimeUnit
import scala.concurrent.duration.Duration
import scala.compat.java8.FutureConverters.toScala
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Await

trait ValintaPerusteetService {
def getKaytetaanValintalaskentaaFromValintatapajono(valintatapajonoOid: ValintatapajonoOid, haku: Haku, hakukohdeOid: HakukohdeOid): Either[Throwable, Boolean]
}

class ValintaPerusteetServiceImpl(appConfig: VtsAppConfig) extends ValintaPerusteetService with Logging {
private val params = CasParams(
"/valintaperusteet-service",
private val client = CasClientBuilder.build(ScalaCasConfig(
appConfig.settings.securitySettings.casUsername,
appConfig.settings.securitySettings.casPassword
)
private val client = CasAuthenticatingClient(
casClient = appConfig.securityContext.casClient,
casParams = params,
serviceClient = SimpleHttp1Client(appConfig.blazeDefaultConfig),
clientCallerId = appConfig.settings.callerId,
sessionCookieName = "JSESSIONID"
)
appConfig.settings.securitySettings.casPassword,
appConfig.settings.securitySettings.casUrl,
appConfig.settings.valintaPerusteetServiceUrl,
appConfig.settings.callerId,
appConfig.settings.callerId,
"/j_spring_cas_security_check",
"JSESSIONID"
))

import org.json4s._
case class ValintatapaJono(
aloituspaikat: Int,
nimi: String,
kuvaus: Option[String],
tyyppi: Option[String],
siirretaanSijoitteluun: Boolean,
tasapistesaanto: String,
aktiivinen: Boolean,
valisijoittelu: Boolean,
automaattinenSijoitteluunSiirto: Boolean,
eiVarasijatayttoa: Boolean,
kaikkiEhdonTayttavatHyvaksytaan: Boolean,
varasijat: Int,
varasijaTayttoPaivat: Int,
poissaOlevaTaytto: Boolean,
poistetaankoHylatyt: Boolean,
varasijojaKaytetaanAlkaen: Option[String],
varasijojaTaytetaanAsti: Option[String],
eiLasketaPaivamaaranJalkeen: Option[String],
kaytetaanValintalaskentaa: Boolean,
tayttojono: Option[String],
oid: String,
inheritance: Option[Boolean],
prioriteetti: Option[Int]
)

case class ValintatapaJono(aloituspaikat: Int,
nimi: String,
kuvaus: Option[String],
tyyppi: Option[String],
siirretaanSijoitteluun: Boolean,
tasapistesaanto: String,
aktiivinen: Boolean,
valisijoittelu: Boolean,
automaattinenSijoitteluunSiirto: Boolean,
eiVarasijatayttoa: Boolean,
kaikkiEhdonTayttavatHyvaksytaan: Boolean,
varasijat: Int,
varasijaTayttoPaivat: Int,
poissaOlevaTaytto: Boolean,
poistetaankoHylatyt: Boolean,
varasijojaKaytetaanAlkaen: Option[String],
varasijojaTaytetaanAsti: Option[String],
eiLasketaPaivamaaranJalkeen: Option[String],
kaytetaanValintalaskentaa: Boolean,
tayttojono: Option[String],
oid: String,
inheritance: Option[Boolean],
prioriteetti: Option[Int]
)
implicit val formats = DefaultFormats

def getKaytetaanValintalaskentaaFromValintatapajono(valintapajonoOid: ValintatapajonoOid, haku: Haku, hakukohdeOid: HakukohdeOid): Either[Throwable, Boolean] = {
getValintatapajonoByValintatapajonoOid(valintapajonoOid, haku, hakukohdeOid) match {
Expand All @@ -66,94 +70,37 @@ class ValintaPerusteetServiceImpl(appConfig: VtsAppConfig) extends ValintaPerust
}

private def getValintatapajonoByValintatapajonoOid(
valintatapajonoOid: ValintatapajonoOid,
haku: Haku,
hakukohdeOid: HakukohdeOid
): Either[Throwable, ValintatapaJono] = {
implicit val formats = DefaultFormats
implicit val valintatapajonoReader = new Reader[ValintatapaJono] {
def read(value: JValue): ValintatapaJono = {
ValintatapaJono(
(value \ "aloituspaikat").extract[Int],
(value \ "nimi").extract[String],
(value \ "kuvaus").extract[Option[String]],
(value \ "tyyppi").extract[Option[String]],
(value \ "siirretaanSijoitteluun").extract[Boolean],
(value \ "tasapistesaanto").extract[String],
(value \ "aktiivinen").extract[Boolean],
(value \ "valisijoittelu").extract[Boolean],
(value \ "automaattinenSijoitteluunSiirto").extract[Boolean],
(value \ "eiVarasijatayttoa").extract[Boolean],
(value \ "kaikkiEhdonTayttavatHyvaksytaan").extract[Boolean],
(value \ "varasijat").extract[Int],
(value \ "varasijaTayttoPaivat").extract[Int],
(value \ "poissaOlevaTaytto").extract[Boolean],
(value \ "poistetaankoHylatyt").extract[Boolean],
(value \ "varasijojaKaytetaanAlkaen").extract[Option[String]],
(value \ "varasijojaTaytetaanAsti").extract[Option[String]],
(value \ "eiLasketaPaivamaaranJalkeen").extract[Option[String]],
(value \ "kaytetaanValintalaskentaa").extract[Boolean],
(value \ "tayttojono").extract[Option[String]],
(value \ "oid").extract[String],
(value \ "inheritance").extract[Option[Boolean]],
(value \ "prioriteetti").extract[Option[Int]]
valintatapajonoOid: ValintatapajonoOid,
haku: Haku,
hakukohdeOid: HakukohdeOid
): Either[Throwable, ValintatapaJono] = {

val req = new RequestBuilder()
.setMethod("GET")
.setUrl(appConfig.ophUrlProperties.url("valintaperusteet-service.valintatapajono",
valintatapajonoOid.toString))
.build()

val result = toScala(client.execute(req)).map {
case r if r.getStatusCode == 200 => {
logger.info(
s"Successfully got valintatapajono (oid: $valintatapajonoOid) from valintaperusteet-service for haku: ${haku.oid}, hakukohde: $hakukohdeOid"
)
parse(r.getResponseBodyAsStream).extract[ValintatapaJono]
}
case r if r.getStatusCode == 404 =>
throw new NotFoundException(s"Valintatapajono was not found for oid $valintatapajonoOid")
case r =>
throw new RuntimeException(
s"Failed to get valintatapajono for oid $valintatapajonoOid, hakukohde: $hakukohdeOid, haku: ${haku.oid}, body: ${r.getResponseBody}"
)
}

implicit val ValintatapajonoDecoder = jsonOf[ValintatapaJono]

Uri
.fromString(
appConfig.ophUrlProperties
.url("valintaperusteet-service.valintatapajono", valintatapajonoOid.toString)
)
.fold(
Task.fail,
uri => {
val request = Request(
method = Method.GET,
uri = uri
)

client.fetch(request) {
case r if r.status.code == 200 => {
logger.info(
s"Successfully got valintatapajono (oid: $valintatapajonoOid) from valintaperusteet-service for haku: ${haku.oid}, hakukohde: $hakukohdeOid"
)
r.as[ValintatapaJono]
}
.handleWith {
case t =>
Task.fail(
new IllegalStateException(
s"Parsing valintatapajono for oid: $valintatapajonoOid failed",
t
)
)
}
case r if r.status.code == 404 => {
Task.fail(
new NotFoundException(
s"Valintatapajono was not found for oid $valintatapajonoOid"
)
)
}
case r =>
r.bodyAsText.runLast
.flatMap(body =>
Task.fail(
new RuntimeException(
s"Failed to get valintatapajono for oid $valintatapajonoOid, hakukohde: $hakukohdeOid, haku: ${haku.oid}, body: ${body
.getOrElse("Failed to parse body")}"
)
)
)
}
}
)
.attemptRunFor(Duration(1, TimeUnit.MINUTES))
.toEither
try {
Right(Await.result(result, Duration(1, TimeUnit.MINUTES)))
} catch {
case e: Throwable => Left(e)
}
}
}

Expand Down

0 comments on commit 7a53886

Please sign in to comment.