Skip to content

Commit

Permalink
Merge pull request #617 from Opetushallitus/OK-421
Browse files Browse the repository at this point in the history
Ok 421
  • Loading branch information
msiukola authored Nov 29, 2024
2 parents 8d7c775 + a840edf commit e1926f7
Show file tree
Hide file tree
Showing 14 changed files with 686 additions and 98 deletions.
6 changes: 4 additions & 2 deletions ovara-suoritusrekisteri/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,10 @@ Muodostaa erilliset siirtotiedostot aikaikkunassa muuttuneille tiedoille:

Jos muuttuneita tietoja on paljon (konffiarvo suoritusrekisteri.ovara.pagesize), muodostuu useita tiedostoja per tyyppi.

Lisäksi kerran vuorokaudessa muodostetaan siirtotiedostot kaikkien aktiivisten kk-hakujen päätellyille
ensikertalaisuustiedoille, jokainen haku erilliseen tiedostoon.
Lisäksi kerran vuorokaudessa muodostetaan siirtotiedostot kaikkien seuraaville, jokainen haku tarpeen mukaan useaan erilliseen tiedostoon:
-aktiivisten hakujen päätellyt ensikertalaisuustiedot
-aktiivisten toisen asteen hakujen proxysuoritustiedot valintalaskentakoostepalvelusta
-aktiivisten toisen asteen yhteishakujen päätellyt harkinnanvaraisuustiedot valintalaskentakoostepalvelusta

Muodostetut tiedostot tallennetaan sovellukselle konffattuun s3-ämpäriin seuraavien konffiarvojen perusteella:
suoritusrekisteri.ovara.s3.region
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,9 @@ object SiirtotiedostoApp {
new SiirtotiedostoClientImpl(config.siirtotiedostoClientConfig),
ensikertalainenActor,
ovaraIntegrations.haut,
config.siirtotiedostoPageSize
config.siirtotiedostoPageSize,
ovaraIntegrations.hakemusService,
ovaraIntegrations.koosteService
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ valinta-tulos-service.haku=/valinta-tulos-service/haku/$1
kouta-internal.haku.search.all=/kouta-internal/haku/search
kouta-internal.hakukohde=/kouta-internal/hakukohde/$1
kouta-internal.hakukohde.batch=/kouta-internal/hakukohde/findbyoids
kouta-internal.hakukohde.search=/kouta-internal/hakukohde/search?hakuOid=$1
kouta-internal.hakukohde.search=/kouta-internal/hakukohde/search?haku=$1
kouta-internal.toteutus=/kouta-internal/toteutus/$1
kouta-internal.koulutus=/kouta-internal/koulutus/$1
kouta-internal.haku=/kouta-internal/haku/$1
Expand All @@ -49,6 +49,7 @@ suoritusrekisteri.it.postgres.port=55432
valintalaskentakoostepalvelu.suorituksetByOpiskelijaOid=/valintalaskentakoostepalvelu/resources/proxy/suoritukset/suorituksetByOpiskelijaOid/hakuOid/$1?fetchEnsikertalaisuus=false
valintalaskentakoostepalvelu.atarusuorituksetByOpiskelijaOid=/valintalaskentakoostepalvelu/resources/proxy/suoritukset/ataruSuorituksetByOpiskelijaOid/hakuOid/$1?fetchEnsikertalaisuus=false&shouldUseApplicationPersonOid=true
valintalaskentakoostepalvelu.harkinnanvaraisuudet.atarutiedoille=/valintalaskentakoostepalvelu/resources/harkinnanvaraisuus/atarutiedoille
valintalaskentakoostepalvelu.harkinnanvaraisuudet.hakemuksille=/valintalaskentakoostepalvelu/resources/harkinnanvaraisuus/hakemuksille
valintalaskenta-service.bypersonoid=/valintalaskenta-laskenta-service/resources/valintakoe/hakijat
valintaperusteet.valintatapajonosByOids=/valintaperusteet-service/resources/valintatapajono
koski.oppija=/koski/api/oppija
Expand Down
4 changes: 3 additions & 1 deletion suoritusrekisteri/src/main/scala/ScalatraBootstrap.scala
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,9 @@ class ScalatraBootstrap extends LifeCycle {
new SiirtotiedostoClientImpl(config.siirtotiedostoClientConfig),
koosteet.ensikertalainen,
integrations.haut,
config.siirtotiedostoPageSize
config.siirtotiedostoPageSize,
integrations.hakemusService,
integrations.koosteService
)
),
("/rest/v1/hakijat", "rest/v1/hakijat") -> new HakijaResource(koosteet.hakijat),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,42 +131,62 @@ object ListFullSearchDto {

trait IHakemusService {
def hakemuksetForPerson(personOid: String): Future[Seq[HakijaHakemus]]

def hakemuksetForPersons(personOids: Set[String]): Future[Seq[HakijaHakemus]]

def personOidstoMasterOids(personOids: Set[String]): Future[Map[String, String]]

def hakemuksetForHakukohde(
hakukohdeOid: String,
organisaatio: Option[String]
): Future[Seq[HakijaHakemus]]

def hakemuksetForHakukohdes(
hakukohdeOid: Set[String],
organisaatio: Option[String]
): Future[Seq[HakijaHakemus]]

def personOidsForHaku(hakuOid: String, organisaatio: Option[String]): Future[Set[String]]

def springPersonOidsForJatkuvaHaku(hakuOid: String): Future[Set[String]]

def personOidsForHakukohde(
hakukohdeOid: String,
organisaatio: Option[String]
): Future[Set[String]]

def hakemuksetForHaku(hakuOid: String, organisaatio: Option[String]): Future[Seq[HakijaHakemus]]

def hakemuksetForToisenAsteenAtaruHaku(
hakuOid: String,
organisaatio: Option[String],
hakukohdekoodi: Option[String],
hakukohdeOid: Option[String]
): Future[Seq[AtaruHakemusToinenAste]]

def suoritusoikeudenTaiAiemmanTutkinnonVuosi(
hakuOid: String,
hakukohdeOid: Option[String]
): Future[Seq[HakijaHakemus]]

def hakemuksetForPersonsInHaku(
personOids: Set[String],
hakuOid: String
): Future[Seq[HakijaHakemus]]

def addTrigger(trigger: Trigger): Unit

def reprocessHaunHakemukset(hakuOid: String): Unit

def hetuAndPersonOidForHaku(hakuOid: String): Future[Seq[HetuPersonOid]]

def hetuAndPersonOidForHakuLite(hakuOid: String): Future[Seq[HetuPersonOid]]

def hetuAndPersonOidForPersonOid(personOid: String): Future[Seq[HakemusHakuHetuPersonOid]]

def ataruhakemustenHenkilot(
params: AtaruHenkiloSearchParams
): Future[List[AtaruHakemuksenHenkilotiedot]]
}

case class AtaruHenkiloSearchParams(
Expand Down Expand Up @@ -511,7 +531,7 @@ class HakemusService(
)
}

private def ataruhakemustenHenkilot(
override def ataruhakemustenHenkilot(
params: AtaruHenkiloSearchParams
): Future[List[AtaruHakemuksenHenkilotiedot]] = {
val p = params.hakuOid.fold[Map[String, Any]](Map.empty)(oid => Map("hakuOid" -> oid)) ++
Expand Down Expand Up @@ -1267,4 +1287,8 @@ class HakemusServiceMock extends IHakemusService {
override def springPersonOidsForJatkuvaHaku(hakuOid: String): Future[Set[String]] =
Future.successful(Set.empty)

override def ataruhakemustenHenkilot(
params: AtaruHenkiloSearchParams
): Future[List[AtaruHakemuksenHenkilotiedot]] =
Future.successful(List[AtaruHakemuksenHenkilotiedot]())
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,37 @@ package fi.vm.sade.hakurekisteri.integration.kooste
import akka.actor.ActorSystem
import akka.event.Logging
import fi.vm.sade.hakurekisteri.integration.hakemus.{
AtaruHakemus,
AtaruHakemusToinenAste,
FullHakemus,
HakemuksenHarkinnanvaraisuus,
HakijaHakemus
}
import fi.vm.sade.hakurekisteri.integration.VirkailijaRestClient

import scala.concurrent.Future
import scala.concurrent.duration.{Duration, DurationInt}
import scala.concurrent.{Await, Future}

trait IKoosteService {
def getSuorituksetForAtaruhakemukset(
hakuOid: String,
hs: Seq[HakijaHakemus]
): Future[Map[String, Map[String, String]]]
def getProxysuorituksetForHakemusOids(
hakuOid: String,
hakemusOids: Seq[String]
): Future[Map[String, Map[String, String]]]
def getSuoritukset(
hakuOid: String,
hakemukset: Seq[HakijaHakemus]
): Future[Map[String, Map[String, String]]]
def getHarkinnanvaraisuudet(hs: Seq[HakijaHakemus]): Future[Seq[HakemuksenHarkinnanvaraisuus]]
def getHarkinnanvaraisuudetForHakemusOidsWithTimeout(
hakemusOids: Seq[String],
timeout: Duration
): Future[Seq[HakemuksenHarkinnanvaraisuus]]
def getHarkinnanvaraisuudetForHakemusOids(
hakemusOids: Seq[String]
): Future[Seq[HakemuksenHarkinnanvaraisuus]]
}

class KoosteService(restClient: VirkailijaRestClient, pageSize: Int = 200)(implicit
Expand Down Expand Up @@ -59,25 +70,69 @@ class KoosteService(restClient: VirkailijaRestClient, pageSize: Int = 200)(impli
}
}

def getHarkinnanvaraisuudetForHakemusOidsWithTimeout(
hakemusOids: Seq[String],
timeout: Duration
): Future[Seq[HakemuksenHarkinnanvaraisuus]] = {
try {
logger.info(
s"${Thread.currentThread().getName} Haetaan koostepalvelusta harkinnanvaraisuudet ${hakemusOids.size} hakemukselle, timeout $timeout"
)
Future.successful(Await.result(getHarkinnanvaraisuudetForHakemusOids(hakemusOids), timeout))
} catch {
case e: Exception =>
logger.info(
s"${Thread.currentThread().getName} harkinnanvaraisuus fetch timed out for ${hakemusOids.size}, $timeout"
)
Future.failed(e)
}
}

def getHarkinnanvaraisuudetForHakemusOids(
hakemusOids: Seq[String]
): Future[Seq[HakemuksenHarkinnanvaraisuus]] = {
logger.info(
s"${Thread.currentThread().getName} Haetaan koostepalvelusta harkinnanvaraisuudet ${hakemusOids.size} hakemukselle"
)
if (hakemusOids.isEmpty) {
Future.successful(Seq.empty)
} else {
restClient.postObject[Seq[String], Seq[HakemuksenHarkinnanvaraisuus]](
"valintalaskentakoostepalvelu.harkinnanvaraisuudet.hakemuksille"
)(200, hakemusOids)
}
}

def getSuorituksetForAtaruhakemukset(
hakuOid: String,
hs: Seq[HakijaHakemus]
): Future[Map[String, Map[String, String]]] = {

val hakemusOids = hs.map(hh => hh.oid).toList
if (hakemusOids.nonEmpty) {
getProxysuorituksetForHakemusOids(hakuOid, hakemusOids)
} else {
logger.debug(s"No ataruhakemukses found!")
Future.successful(Map.empty)
}
}

def getProxysuorituksetForHakemusOids(
hakuOid: String,
hakemusOids: Seq[String]
): Future[Map[String, Map[String, String]]] = {

logger.info(
s"Getting atarusuoritukset from koostepalvelu for ataruhakemukset: ${hakemusOids}"
s"${Thread.currentThread().getName} Getting atarusuoritukset from koostepalvelu for ${hakemusOids.size} ataruhakemukses in haku $hakuOid"
)
if (hakemusOids.nonEmpty) {
restClient.postObject[List[String], Map[String, Map[String, String]]](
restClient.postObject[Seq[String], Map[String, Map[String, String]]](
"valintalaskentakoostepalvelu.atarusuorituksetByOpiskelijaOid",
hakuOid
)(200, hakemusOids)
} else {
logger.info(s"No ataruhakemukses found!")
Future.successful(Map.empty)
}

}

def getSuoritukset(
Expand Down Expand Up @@ -110,6 +165,7 @@ class KoosteService(restClient: VirkailijaRestClient, pageSize: Int = 200)(impli
}

case class HakemusHakija(opiskelijaOid: String, hakemus: FullHakemus)

}

class KoosteServiceMock extends IKoosteService {
Expand All @@ -128,4 +184,22 @@ class KoosteServiceMock extends IKoosteService {
hakemukset: Seq[HakijaHakemus]
): Future[Map[String, Map[String, String]]] =
Future.successful(Map[String, Map[String, String]]())

override def getProxysuorituksetForHakemusOids(
hakuOid: String,
hakemusOids: Seq[String]
): Future[Map[String, Map[String, String]]] = {
Future.successful(Map.empty)
}

override def getHarkinnanvaraisuudetForHakemusOids(
hakemusOids: Seq[String]
): Future[Seq[HakemuksenHarkinnanvaraisuus]] = {
Future.successful(Seq.empty)
}

override def getHarkinnanvaraisuudetForHakemusOidsWithTimeout(
hakemusOids: Seq[String],
timeout: Duration
): Future[Seq[HakemuksenHarkinnanvaraisuus]] = ???
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,9 @@ trait OvaraDbRepository {

}

case class SiirtotiedostoProcessInfo(entityTotals: Map[String, Long])
case class SiirtotiedostoProcessInfo(
entityTotals: Map[String, String] = Map.empty
)

case class SiirtotiedostoProcess(
id: Long,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,21 +15,26 @@ import org.json4s._
import org.json4s.jackson.Serialization.write
import org.scalatra.{SessionSupport, _}
import org.scalatra.json.{JValueResult, JacksonJsonSupport}
import org.scalatra.swagger.{Swagger, SwaggerEngine, SwaggerSupport}
import org.slf4j.LoggerFactory

import java.util.UUID
import scala.util.Try

class OvaraResource(ovaraService: OvaraService)(implicit val security: Security)
class OvaraResource(ovaraService: OvaraService)(implicit val security: Security, sw: Swagger)
extends ScalatraServlet
with JValueResult
with JacksonJsonSupport
with SessionSupport
with SecuritySupport
with Logging {
with Logging
with OvaraSwaggerApi {
val audit: Audit = SuoritusAuditVirkailija.audit

get("/muodosta") {
protected implicit def swagger: SwaggerEngine[_] = sw
override protected def applicationDescription: String = "Ovara-Resource"

get("/muodosta", operation(muodostaAikavalille)) {
if (currentUser.exists(_.isAdmin)) {
val start = params.get("start").map(_.toLong)
val end = params.get("end").map(_.toLong)
Expand Down Expand Up @@ -62,30 +67,24 @@ class OvaraResource(ovaraService: OvaraService)(implicit val security: Security)

}

get("/muodosta/ensikertalaisuudet") {
if (currentUser.exists(_.isAdmin)) {
val hakuOid = params.get("haku")
hakuOid match {
case Some(hakuOid) =>
logger.info(s"Muodostetaan ensikertalaisten siirtotiedosto haulle $hakuOid")
val result = ovaraService.formEnsikertalainenSiirtotiedostoForHakus(Seq(hakuOid))
Ok(s"$result")
case _ =>
BadRequest(s"Pakollinen parametri (haku) puuttuu!")
}
} else {
Forbidden("Ei tarvittavia oikeuksia ovara-siirtotiedoston muodostamiseen")
}
}

get("/muodosta/ensikertalaisuudet/kkhaut") {
get("/muodosta/paivittaiset", operation(muodostaPaivittaiset)) {
if (currentUser.exists(_.isAdmin)) {
val executionId = UUID.randomUUID().toString
val vainAktiiviset: Boolean = params.get("vainAktiiviset").exists(_.toBoolean)
val ensikertalaisuudet: Boolean = params.get("ensikertalaisuudet").exists(_.toBoolean)
val harkinnanvaraisuudet: Boolean = params.get("harkinnanvaraisuudet").exists(_.toBoolean)
val proxySuoritukset: Boolean = params.get("proxySuoritukset").exists(_.toBoolean)
val combinedParams = DailyProcessingParams(
executionId,
vainAktiiviset,
ensikertalaisuudet = ensikertalaisuudet,
harkinnanvaraisuudet = harkinnanvaraisuudet,
proxySuoritukset = proxySuoritukset
)
logger.info(
s"$executionId Muodostetaan ensikertalaisten siirtotiedosto kk-hauille. Vain aktiiviset: $vainAktiiviset"
s"$executionId Muodostetaan päivittäiset siirtotiedostot. $combinedParams"
)
val result = ovaraService.triggerEnsikertalaiset(vainAktiiviset, executionId)
val result = ovaraService.triggerDailyProcessing(combinedParams)
Ok(s"$executionId Valmista - $result")
} else {
Forbidden("Ei tarvittavia oikeuksia ovara-siirtotiedoston muodostamiseen")
Expand Down
Loading

0 comments on commit e1926f7

Please sign in to comment.