diff --git a/src/main/scala/fi/oph/koski/massaluovutus/MassaluovutusQueryParameters.scala b/src/main/scala/fi/oph/koski/massaluovutus/MassaluovutusQueryParameters.scala index 67a20c80e1..52de47dad3 100644 --- a/src/main/scala/fi/oph/koski/massaluovutus/MassaluovutusQueryParameters.scala +++ b/src/main/scala/fi/oph/koski/massaluovutus/MassaluovutusQueryParameters.scala @@ -29,6 +29,10 @@ trait MassaluovutusQueryParameters { def priority: Int = MassaluovutusQueryPriority.normal } +trait PartitionSupport { + def partitionFormats: Seq[String] +} + object MassaluovutusQueryPriority { val highest = 1 val high = 3 diff --git a/src/main/scala/fi/oph/koski/massaluovutus/MassaluovutusServlet.scala b/src/main/scala/fi/oph/koski/massaluovutus/MassaluovutusServlet.scala index e88261b5f4..dbab7aac12 100644 --- a/src/main/scala/fi/oph/koski/massaluovutus/MassaluovutusServlet.scala +++ b/src/main/scala/fi/oph/koski/massaluovutus/MassaluovutusServlet.scala @@ -175,7 +175,7 @@ object QueryResponse { startedAt = q.startedAt, finishedAt = q.finishedAt, files = q.filesToExternal(rootUrl), - hint = failedQueryHint(q), + hint = failedQueryHint(q, rootUrl), error = if (session.hasGlobalReadAccess) Some(q.error) else None, ) case q: CompleteQuery => CompleteQueryResponse( @@ -197,9 +197,19 @@ object QueryResponse { implicit def toOffsetDateTime(dt: Option[LocalDateTime]): Option[OffsetDateTime] = dt.map(toOffsetDateTime) - def failedQueryHint(q: FailedQuery): Option[String] = + def failedQueryHint(q: FailedQuery, rootUrl: String): Option[String] = if (q.error.contains("Your proposed upload exceeds the maximum allowed size")) { - Some("Kyselystä syntyneen tulostiedoston koko kasvoi liian suureksi. Pienennä tulosjoukon kokoa esimerkiksi rajaamalla kysely lyhyemmälle aikavälille tai käytä ositettuja tulostiedostoja, jos kysely tukee sitä.") + val suggestions = ( + List("rajaa kysely lyhyemmälle aikavälille") ++ + (q.query match { + case p: PartitionSupport => + val formats = p.partitionFormats.mkString(" tai ") + val helpUrl = s"$rootUrl/dokumentaatio/rajapinnat/massaluovutus/koulutuksenjarjestajat" + List(s"käytä tulostiedostojen ositusta asettalla format-kenttään $formats (kts. tarkemmat ohjeet $helpUrl)") + case _ => List() + }) + ).mkString("; ") + Some(s"Kyselystä syntyneen tulostiedoston koko kasvoi liian suureksi. Ehdotuksia kyselyn korjaamiseksi: $suggestions") } else { None } diff --git a/src/main/scala/fi/oph/koski/massaluovutus/organisaationopiskeluoikeudet/MassaluovutusQueryOrganisaationOpiskeluoikeudetCsv.scala b/src/main/scala/fi/oph/koski/massaluovutus/organisaationopiskeluoikeudet/MassaluovutusQueryOrganisaationOpiskeluoikeudetCsv.scala index 615099889c..5a0cb6b330 100644 --- a/src/main/scala/fi/oph/koski/massaluovutus/organisaationopiskeluoikeudet/MassaluovutusQueryOrganisaationOpiskeluoikeudetCsv.scala +++ b/src/main/scala/fi/oph/koski/massaluovutus/organisaationopiskeluoikeudet/MassaluovutusQueryOrganisaationOpiskeluoikeudetCsv.scala @@ -4,7 +4,7 @@ import fi.oph.koski.config.KoskiApplication import fi.oph.koski.koskiuser.KoskiSpecificSession import fi.oph.koski.organisaatio.MockOrganisaatiot import fi.oph.koski.massaluovutus.MassaluovutusUtils.QueryResourceManager -import fi.oph.koski.massaluovutus.{CsvStream, QueryFormat, QueryResultWriter} +import fi.oph.koski.massaluovutus.{CsvStream, PartitionSupport, QueryFormat, QueryResultWriter} import fi.oph.koski.raportointikanta._ import fi.oph.koski.schema.Organisaatio import fi.oph.koski.schema.Organisaatio.Oid @@ -43,7 +43,8 @@ case class MassaluovutusQueryOrganisaationOpiskeluoikeudetCsv( eiOsasuorituksia: Option[Boolean] = None, @Description("Jos true, ei kyselyllä luoda opiskeluoikeuden aikajaksotiedostoja") eiAikajaksoja: Option[Boolean] = None, -) extends MassaluovutusQueryOrganisaationOpiskeluoikeudet { +) extends MassaluovutusQueryOrganisaationOpiskeluoikeudet with PartitionSupport { + def partitionFormats: Seq[String] = Seq(QueryFormat.csvPartition) def withOrganisaatioOid(organisaatioOid: Oid): MassaluovutusQueryOrganisaationOpiskeluoikeudetCsv = copy(organisaatioOid = Some(organisaatioOid)) diff --git a/src/test/scala/fi/oph/koski/massaluovutus/MassaluovutusSpec.scala b/src/test/scala/fi/oph/koski/massaluovutus/MassaluovutusSpec.scala index b8dc479026..d3fda05417 100644 --- a/src/test/scala/fi/oph/koski/massaluovutus/MassaluovutusSpec.scala +++ b/src/test/scala/fi/oph/koski/massaluovutus/MassaluovutusSpec.scala @@ -118,7 +118,7 @@ class MassaluovutusSpec extends AnyFreeSpec with KoskiHttpSpec with Matchers wit KoskiApplicationForTests.massaluovutusService.addRaw(failedQuery) getQuerySuccessfully(failedQuery.queryId, MockUsers.tornioTallentaja) { response => val failResponse = response.asInstanceOf[FailedQueryResponse] - failResponse.hint should equal(Some("Kyselystä syntyneen tulostiedoston koko kasvoi liian suureksi. Pienennä tulosjoukon kokoa esimerkiksi rajaamalla kysely lyhyemmälle aikavälille tai käytä ositettuja tulostiedostoja, jos kysely tukee sitä.")) + failResponse.hint should equal(Some("Kyselystä syntyneen tulostiedoston koko kasvoi liian suureksi. Ehdotuksia kyselyn korjaamiseksi: rajaa kysely lyhyemmälle aikavälille; käytä tulostiedostojen ositusta asettalla format-kenttään text/x-csv-partition (kts. tarkemmat ohjeet http://localhost:7021/koski/dokumentaatio/rajapinnat/massaluovutus/koulutuksenjarjestajat)")) failResponse.error should equal(None) } }