From 709add6d4964c3d11c5e4f39df1f0f5a787ad689 Mon Sep 17 00:00:00 2001 From: Aleksi Ahtiainen Date: Thu, 23 Jan 2025 10:11:08 +0200 Subject: [PATCH] WIP: Toteutus --- .../common/OpiskeluoikeusFacade.scala | 20 ++++++-- .../common/OpiskeluoikeusRepository.scala | 46 +++++++++++++++++++ 2 files changed, 63 insertions(+), 3 deletions(-) diff --git a/src/main/scala/fi/oph/koski/suoritusjako/common/OpiskeluoikeusFacade.scala b/src/main/scala/fi/oph/koski/suoritusjako/common/OpiskeluoikeusFacade.scala index e33370df0b..e23adfb1f7 100644 --- a/src/main/scala/fi/oph/koski/suoritusjako/common/OpiskeluoikeusFacade.scala +++ b/src/main/scala/fi/oph/koski/suoritusjako/common/OpiskeluoikeusFacade.scala @@ -75,6 +75,12 @@ class OpiskeluoikeusFacade[OPISKELUOIKEUS: TypeTag]( )) } + val onOpiskeluoikeuksiaKoskessaFut: Future[Either[HttpStatus, Boolean]] = + masterHenkilöFut + .map(_.flatMap(masterHenkilö => + Right(opiskeluoikeusRepository.oppijallaOnOpiskeluoikeuksiaKoskessa(masterHenkilö.oid)) + )) + val opiskeluoikeudetFut: Future[Either[HttpStatus, Seq[OPISKELUOIKEUS]]] = masterHenkilöFut .map(_.flatMap(masterHenkilö => @@ -86,16 +92,20 @@ class OpiskeluoikeusFacade[OPISKELUOIKEUS: TypeTag]( val rawOppija = for { henkilö <- EitherT(masterHenkilöFut) + onOpiskeluoikeuksiaKoskessa <- EitherT(onOpiskeluoikeuksiaKoskessaFut) opiskeluoikeudet <- EitherT(opiskeluoikeudetFut) ytrResult <- EitherT(ytrResultFut) virtaResult <- EitherT(virtaResultFut) - } yield RawOppija(henkilö, opiskeluoikeudet ++ ytrResult ++ virtaResult) + } yield RawOppija(henkilö, onOpiskeluoikeuksiaKoskessa, opiskeluoikeudet ++ ytrResult ++ virtaResult) try { Futures.await( future = rawOppija.value, atMost = if (Environment.isUnitTestEnvironment(application.config)) { 10.seconds } else { 5.minutes } - ) + ) match { + case Right(o) if !o.onKoskestaLuovutettavissa => Left(notFoundResult) + case result => result + } } catch { case _: TimeoutException => Left(KoskiErrorCategory.unavailable()) } @@ -159,5 +169,9 @@ class OpiskeluoikeusFacade[OPISKELUOIKEUS: TypeTag]( case class RawOppija[OPISKELUOIKEUS: TypeTag]( henkilö: LaajatOppijaHenkilöTiedot, + onOpiskeluoikeuksiaKoskessa: Boolean, opiskeluoikeudet: Seq[OPISKELUOIKEUS] -) +) { + def onKoskestaLuovutettavissa: Boolean = + onOpiskeluoikeuksiaKoskessa || !opiskeluoikeudet.isEmpty +} diff --git a/src/main/scala/fi/oph/koski/suoritusjako/common/OpiskeluoikeusRepository.scala b/src/main/scala/fi/oph/koski/suoritusjako/common/OpiskeluoikeusRepository.scala index 078d851648..498f072c3f 100644 --- a/src/main/scala/fi/oph/koski/suoritusjako/common/OpiskeluoikeusRepository.scala +++ b/src/main/scala/fi/oph/koski/suoritusjako/common/OpiskeluoikeusRepository.scala @@ -15,6 +15,52 @@ class OpiskeluoikeusRepository[OPISKELUOIKEUS: TypeTag]( val db: DB, val validatingAndResolvingExtractor: ValidatingAndResolvingExtractor ) extends QueryMethods { + + def oppijallaOnOpiskeluoikeuksiaKoskessa(oppijaMasterOid: String): Boolean = { + runDbSync(SQLHelpers.concatMany(Some( + sql""" +with + haettu_oppija as ( + select + oid as oppija_oid, + coalesce(master_oid, oid) as oppija_master_oid + from henkilo + where henkilo.oid = $oppijaMasterOid or henkilo.master_oid = $oppijaMasterOid + ) + , linkitetty as ( + select + distinct haettu_oppija.oppija_master_oid + from + haettu_oppija + inner join haettu_oppija h2 on h2.oppija_master_oid = haettu_oppija.oppija_master_oid and h2.oppija_master_oid <> h2.oppija_oid + ) + , opiskeluoikeus_kaikki as ( + select + haettu_oppija.oppija_master_oid, + oid as opiskeluoikeus_oid + from + opiskeluoikeus + join haettu_oppija on haettu_oppija.oppija_oid = opiskeluoikeus.oppija_oid + left join linkitetty on linkitetty.oppija_master_oid = haettu_oppija.oppija_master_oid + where mitatoity = false + ) +select exists(select 1 from opiskeluoikeus_kaikki) AS "exists" + """)).as[ExistsRow]) + .headOption + .map(_.exists) + .getOrElse(false) + } + + private implicit def getExistsRow: GetResult[ExistsRow] = GetResult(r => { + ExistsRow( + exists = r.rs.getBoolean("exists") + ) + }) + + case class ExistsRow( + exists: Boolean + ) + def getOppijanKaikkiOpiskeluoikeudet( palautettavatOpiskeluoikeudenTyypit: Seq[String], oppijaMasterOid: String