Skip to content

Commit

Permalink
Merge branch 'OK-415' into MERGE__OY-4799__OY-4780__OY-4797__OK-415
Browse files Browse the repository at this point in the history
  • Loading branch information
msiukola committed May 6, 2024
2 parents 9ebfee6 + cf01cb3 commit aa84986
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 2 deletions.
1 change: 1 addition & 0 deletions src/main/scala/ScalatraBootstrap.scala
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ class ScalatraBootstrap extends LifeCycle {
new OvaraService(
registers.ovaraDbRepository,
new SiirtotiedostoClient(config.siirtotiedostoClientConfig),
koosteet.ensikertalainen,
config.siirtotiedostoPageSize
)
),
Expand Down
17 changes: 17 additions & 0 deletions src/main/scala/fi/vm/sade/hakurekisteri/ovara/OvaraResource.scala
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,23 @@ 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.formSiirtotiedostoForHakus(Seq(hakuOid))
Ok(s"$result")
case _ =>
BadRequest(s"Pakollinen parametri (haku) puuttuu!")
}
} else {
Forbidden("Ei tarvittavia oikeuksia ovara-siirtotiedoston muodostamiseen")
}

}

override protected implicit def jsonFormats: Formats = HakurekisteriJsonSupport.format

}
63 changes: 61 additions & 2 deletions src/main/scala/fi/vm/sade/hakurekisteri/ovara/OvaraService.scala
Original file line number Diff line number Diff line change
@@ -1,18 +1,35 @@
package fi.vm.sade.hakurekisteri.ovara

import akka.actor.ActorRef
import akka.pattern.ask
import akka.util.Timeout
import fi.vm.sade.hakurekisteri.ensikertalainen.{Ensikertalainen, HaunEnsikertalaisetQuery}
import fi.vm.sade.hakurekisteri.integration.ExecutorUtil
import fi.vm.sade.utils.slf4j.Logging

import scala.annotation.tailrec
import scala.concurrent.{Await, ExecutionContext, Future}
import scala.concurrent.duration.DurationInt

trait IOvaraService {
//Muodostetaan siirtotiedostot kaikille neljälle tyypille. Jos dataa on aikavälillä paljon, muodostuu useita tiedostoja per tyyppi.
//Tiedostot tallennetaan s3:seen.
def formSiirtotiedostotPaged(start: Long, end: Long): Map[String, Long]
}

class OvaraService(db: OvaraDbRepository, s3Client: SiirtotiedostoClient, pageSize: Int)
extends IOvaraService
class OvaraService(
db: OvaraDbRepository,
s3Client: SiirtotiedostoClient,
ensikertalainenActor: ActorRef,
pageSize: Int
) extends IOvaraService
with Logging {

implicit val ec: ExecutionContext = ExecutorUtil.createExecutor(
2,
getClass.getSimpleName
)

@tailrec
private def saveInSiirtotiedostoPaged[T](
params: SiirtotiedostoPagingParams,
Expand Down Expand Up @@ -51,6 +68,48 @@ class OvaraService(db: OvaraDbRepository, s3Client: SiirtotiedostoClient, pageSi
}
}

//Ensivaiheessa ajetaan tämä kaikille kk-hauille kerran, myöhemmin riittää synkata kerran päivässä aktiivisten kk-hakujen tiedot
def formSiirtotiedostoForHakus(hakuOids: Seq[String]) = {
def formSiirtotiedostoForHaku(hakuOid: String) = {
implicit val to: Timeout = Timeout(30.minutes)

val ensikertalaiset: Future[Seq[Ensikertalainen]] =
(ensikertalainenActor ? HaunEnsikertalaisetQuery(hakuOid)).mapTo[Seq[Ensikertalainen]]
ensikertalaiset.map(ek => {
logger.info(
s"Saatiin ${ek.size} ensikertalaisuustietoa haulle $hakuOid. Tallennetaan siirtotiedosto."
)
s3Client.saveSiirtotiedosto[Ensikertalainen]("ensikertalainen", ek)
})
}

val infoStr =
if (hakuOids.size <= 5) s"hauille ${hakuOids.toString}" else s"${hakuOids.size} haulle."
logger.info(s"Muodostetaan siirtotiedostot $infoStr")
val resultsByHaku = hakuOids.map(hakuOid => {
try {
val result = formSiirtotiedostoForHaku(hakuOid)
//Todo, muu toteutus tälle? Mikä on riittävä timeout, mitä jos jäädään jumiin? Käsiteltäviä hakuja voi olla paljon,
//kaikkea ei voi tehdä rinnakkain. Muutaman kerrallaan varmaan voisi.
Await.result(result, 45.minutes)
logger.info(s"Valmista haulle $hakuOid")
(hakuOid, None)
} catch {
case t: Throwable =>
logger
.error("Siirtotiedoston muodostaminen haun $hakuOid ensikertalaisista epäonnistui:", t)
(
hakuOid,
Some(t.getMessage)
) //Todo, retry? Voisi olla järkevää, jos muodostetaan siirtotiedosto kymmenille hauille ja yksi satunnaissepäonnistuu.
}

})
val failed = resultsByHaku.filter(_._2.isDefined)
logger.error(s"Failed: $failed")
s"Onnistuneita ${hakuOids.size - failed.size}, epäonnistuneita ${failed.size}"
}

def formSiirtotiedostotPaged(start: Long, end: Long): Map[String, Long] = {
//lukitaan aikaikkunan loppuhetki korkeintaan nykyhetkeen, jolloin ei tarvitse huolehtia tämän jälkeen kantaan mahdollisesti tulevista muutoksista,
//ja eri tyyppiset tiedostot muodostetaan samalle aikaikkunalle.
Expand Down

0 comments on commit aa84986

Please sign in to comment.