diff --git a/src/main/scala/ScalatraBootstrap.scala b/src/main/scala/ScalatraBootstrap.scala index 93dc4060e9..e7d0d39d41 100644 --- a/src/main/scala/ScalatraBootstrap.scala +++ b/src/main/scala/ScalatraBootstrap.scala @@ -19,7 +19,7 @@ import fi.oph.koski.localization.KoskiSpecificLocalizationServlet import fi.oph.koski.log.Logging import fi.oph.koski.luovutuspalvelu.{PalveluvaylaServlet, TilastokeskusServlet} import fi.oph.koski.migri.MigriServlet -import fi.oph.koski.mydata.{ApiProxyServlet, MyDataReactServlet, MyDataServlet} +import fi.oph.koski.mydata.{MyDataReactServlet, MyDataServlet} import fi.oph.koski.omaopintopolkuloki.OmaOpintoPolkuLokiServlet import fi.oph.koski.omattiedot.{OmatTiedotHtmlServlet, OmatTiedotServlet, OmatTiedotServletV2} import fi.oph.koski.opiskeluoikeus.{OpiskeluoikeusServlet, OpiskeluoikeusValidationServlet} @@ -133,7 +133,6 @@ class ScalatraBootstrap extends LifeCycle with Logging with Timing with GlobalEx mount("/koski/api/luovutuspalvelu/ytl", new YtlServlet) mount("/koski/api/palveluvayla", new PalveluvaylaServlet) mount("/koski/api/luovutuspalvelu/haku", new TilastokeskusServlet) - mount("/koski/api/omadata/oppija", new ApiProxyServlet) mount("/koski/api/omadata", new MyDataServlet) mount("/koski/api/omaopintopolkuloki", new OmaOpintoPolkuLokiServlet) mount("/koski/api/ytrkoesuoritukset", new YtrKoesuoritusApiServlet) diff --git a/src/main/scala/fi/oph/koski/mydata/ApiProxyServlet.scala b/src/main/scala/fi/oph/koski/mydata/ApiProxyServlet.scala deleted file mode 100644 index 18e3c61670..0000000000 --- a/src/main/scala/fi/oph/koski/mydata/ApiProxyServlet.scala +++ /dev/null @@ -1,66 +0,0 @@ -package fi.oph.koski.mydata - -import fi.oph.koski.config.KoskiApplication -import fi.oph.koski.henkilo.Hetu -import fi.oph.koski.http.{HttpStatus, JsonErrorMessage, KoskiErrorCategory} -import fi.oph.koski.json.JsonSerializer -import fi.oph.koski.koskiuser.RequiresHSL -import fi.oph.koski.log.Logging -import fi.oph.koski.schema.TäydellisetHenkilötiedot -import fi.oph.koski.schema.filter.MyDataOppija -import fi.oph.koski.servlet.{InvalidRequestException, KoskiSpecificApiServlet, NoCache} -import org.scalatra.ContentEncodingSupport - - -class ApiProxyServlet(implicit val application: KoskiApplication) extends KoskiSpecificApiServlet - with Logging with ContentEncodingSupport with NoCache with MyDataSupport with RequiresHSL { - - post("/") { - val memberId = getMemberId - - withJsonBody { parsedJson => - val resp: Either[HttpStatus, MyDataOppija] = JsonSerializer.validateAndExtract[HetuRequest](parsedJson) - .left.map(errors => KoskiErrorCategory.badRequest.validation.jsonSchema(JsonErrorMessage(errors))) - .flatMap(req => Hetu.validFormat(req.hetu)) - .flatMap { hetu => - application.henkilöRepository.findByHetuOrCreateIfInYtrOrVirta(hetu).toRight(KoskiErrorCategory.notFound.oppijaaEiLöydyTaiEiOikeuksia()) - } - .flatMap { oppijaHenkilö => - if (application.mydataService.hasAuthorizedMember(oppijaHenkilö.oid, memberId)) { - - application.oppijaFacade.findOppijaByHetuOrCreateIfInYtrOrVirta(oppijaHenkilö.hetu.get, useVirta = true, useYtr = false).flatMap(_.warningsToLeft) - .map(oppija => { - - val paattymisPaiva = application.mydataService.getAll(oppijaHenkilö.oid).find(auth => memberId == auth.asiakasId) - .map(item => item.expirationDate) - - MyDataOppija( - henkilö = oppija.henkilö.asInstanceOf[TäydellisetHenkilötiedot], - opiskeluoikeudet = oppija.opiskeluoikeudet, - suostumuksenPaattymispaiva = paattymisPaiva - ) - }) - } else { - //Aiheuttaa merkittävän määrän turhaa logitusta HSL:n hakiessa näitä tietoja jatkuvasti -> debug - logger.debug(s"Student ${oppijaHenkilö.oid} has not authorized $memberId to access their student data") - Left(KoskiErrorCategory.forbidden.forbiddenXRoadHeader()) - } - } - - renderEither[MyDataOppija](resp) - }() - } - - private def getMemberId = { - val memberCode = request.header("X-ROAD-MEMBER").getOrElse({ - logger.warn(s"Missing X-ROAD-MEMBER header when requesting student data") - throw InvalidRequestException(KoskiErrorCategory.badRequest.header.missingXRoadHeader) - }) - - findMemberForMemberCode(memberCode).getOrElse( - throw InvalidRequestException(KoskiErrorCategory.badRequest.header.invalidXRoadHeader)) - .getString("id") - } -} - -case class HetuRequest(hetu: String) diff --git a/src/test/scala/fi/oph/koski/mydata/MyDataAPIProxyServletTest.scala b/src/test/scala/fi/oph/koski/mydata/MyDataAPIProxyServletTest.scala deleted file mode 100644 index 6ba833d948..0000000000 --- a/src/test/scala/fi/oph/koski/mydata/MyDataAPIProxyServletTest.scala +++ /dev/null @@ -1,130 +0,0 @@ -package fi.oph.koski.mydata - -import fi.oph.koski.henkilo.KoskiSpecificMockOppijat -import fi.oph.koski.koskiuser.{KoskiMockUser, MockUsers} -import fi.oph.koski.{KoskiApplicationForTests, KoskiHttpSpec} -import org.json4s._ -import org.json4s.jackson.Serialization.write -import org.scalatest.freespec.AnyFreeSpec -import org.scalatest.matchers.should.Matchers - -import java.time.LocalDate - -class MyDataAPIProxyServletTest extends AnyFreeSpec with KoskiHttpSpec with Matchers { - - implicit val formats = DefaultFormats - - val opiskelija = KoskiSpecificMockOppijat.markkanen - val memberId = "hsl" - val memberCode = "2769790-1" // HSL - - val muutLuovutuspalveluKäyttäjät = List( - MockUsers.ytlKäyttäjä, - MockUsers.valviraKäyttäjä, - MockUsers.kelaLaajatOikeudet, - MockUsers.kelaSuppeatOikeudet, - MockUsers.migriKäyttäjä, - MockUsers.tilastokeskusKäyttäjä, - MockUsers.suomiFiKäyttäjä - ) - - def application = KoskiApplicationForTests - - "ApiProxyServlet" - { - "Ei palauta mitään mikäli X-ROAD-MEMBER headeria ei ole asetettu" in { - requestOpintoOikeudet(opiskelija.hetu.get, Map.empty, MockUsers.hslKäyttäjä){ - status should equal(400) - body should include("Vaadittu X-ROAD-MEMBER http-otsikkokenttä puuttuu") - } - } - - "Ei palauta mitään mikäli käyttäjä ei ole antanut lupaa" in { - KoskiApplicationForTests.mydataRepository.delete(opiskelija.oid, memberId) - - requestOpintoOikeudet(opiskelija.hetu.get, memberHeaders(memberCode)){ - status should equal(403) - body should include("X-ROAD-MEMBER:llä ei ole lupaa hakea opiskelijan tietoja") - } - } - - "Palauttaa 404-virheen kun opinto-oikeutta ei löydy" in { - KoskiApplicationForTests.mydataRepository.create(opiskelija.oid, memberId) - - requestOpintoOikeudet("131047-803F", memberHeaders(memberCode)){ - status should equal(404) - body should include("Oppijaa ei löydy annetulla oidilla tai käyttäjällä ei ole oikeuksia tietojen katseluun.") - } - } - - "Palauttaa opiskelutiedot mikäli käyttäjä on antanut siihen luvan" in { - KoskiApplicationForTests.mydataRepository.create(opiskelija.oid, memberId) - - requestOpintoOikeudet(opiskelija.hetu.get, memberHeaders(memberCode)){ - status should equal(200) - body should (include (KoskiSpecificMockOppijat.markkanen.etunimet) and include (KoskiSpecificMockOppijat.markkanen.sukunimi)) - } - } - - "Palauttaa luvan viimeisen voimassaolopäivän opiskelijalle" in { - val jsonMethods = org.json4s.jackson.JsonMethods - val yearFromToday = LocalDate.now().plusYears(1) - - KoskiApplicationForTests.mydataRepository.create(opiskelija.oid, memberId) - - requestOpintoOikeudet(opiskelija.hetu.get, memberHeaders(memberCode)){ - status should equal(200) - - val response = jsonMethods.parse(body).extract[MyDataResponse] - response.suostumuksenPaattymispaiva should be(yearFromToday.toString) - } - } - - "Palauttaa 401 mikäli luovutuspalvelukäyttäjän tunnukset ovat väärät" in { - KoskiApplicationForTests.mydataRepository.create(opiskelija.oid, memberId) - - muutLuovutuspalveluKäyttäjät.map(user => { - val wrongPasswordHeader = Map(basicAuthHeader(user.username, "wrong password")) - requestOpintoOikeudetWithoutAuthHeaders(opiskelija.hetu.get, wrongPasswordHeader ++ memberHeaders(memberCode)) { - status should equal(401) - } - }) - } - - "Palauttaa 200 mikäli HSL" in { - KoskiApplicationForTests.mydataRepository.create(opiskelija.oid, memberId) - - requestOpintoOikeudetWithoutAuthHeaders(opiskelija.hetu.get, memberHeaders(memberCode) ++ authHeaders(MockUsers.hslKäyttäjä)) { - status should equal(200) - } - } - - "Palauttaa 403 mikäli ei palveluväyläkäyttäjä" in { - KoskiApplicationForTests.mydataRepository.create(opiskelija.oid, memberId) - - muutLuovutuspalveluKäyttäjät.map(user => { - requestOpintoOikeudetWithoutAuthHeaders(opiskelija.hetu.get, memberHeaders(memberCode) ++ authHeaders(user)) { - status should equal(403) - body should include("Sallittu vain HSL:lle") - } - }) - } - } - - def memberHeaders(memberCode: String) = Map("X-ROAD-MEMBER" -> memberCode) - - def requestOpintoOikeudet[A](hetu: String, headers: Map[String, String], user: KoskiMockUser = MockUsers.hslKäyttäjä)(f: => A) = { - requestOpintoOikeudetWithoutAuthHeaders(hetu, headers ++ authHeaders(user))(f) - } - - def requestOpintoOikeudetWithoutAuthHeaders[A](hetu: String, headers: Map[String, String])(f: => A) = { - post( - "api/omadata/oppija/", - write(Map("hetu" -> hetu)), - headers = jsonContent ++ headers - )(f) - } -} - -case class MyDataResponse( - suostumuksenPaattymispaiva: String -)