From 80561af0521908af37b18ca08e4d243a9dea998e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Kleinb=C3=B6lting?= Date: Wed, 15 Nov 2023 17:02:30 +0100 Subject: [PATCH] =?UTF-8?q?refactor:=20Replace=20StringFormatter.validateP?= =?UTF-8?q?rojectShortcode=20methods=20wi=E2=80=A6=20(#2935)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../webapi/messages/StringFormatterSpec.scala | 19 +-------------- .../admin/SipiResponderADMSpec.scala | 9 ++++---- .../webapi/messages/StringFormatter.scala | 23 ++++--------------- .../ProjectsMessagesADM.scala | 4 +--- .../sipimessages/SipiMessagesADM.scala | 7 +++--- .../responders/admin/SipiResponderADM.scala | 16 +++++-------- .../webapi/routing/admin/FilesRouteADM.scala | 10 ++++---- 7 files changed, 25 insertions(+), 63 deletions(-) diff --git a/integration/src/test/scala/org/knora/webapi/messages/StringFormatterSpec.scala b/integration/src/test/scala/org/knora/webapi/messages/StringFormatterSpec.scala index 0f1962cd4d..8d71880387 100644 --- a/integration/src/test/scala/org/knora/webapi/messages/StringFormatterSpec.scala +++ b/integration/src/test/scala/org/knora/webapi/messages/StringFormatterSpec.scala @@ -948,24 +948,7 @@ class StringFormatterSpec extends CoreSpec { } - "The StringFormatter class for User and Project" should { - "validate project shortcode" in { - stringFormatter.validateProjectShortcode("00FF", throw AssertionException("not valid")) should be("00FF") - stringFormatter.validateProjectShortcode("00ff", throw AssertionException("not valid")) should be("00FF") - stringFormatter.validateProjectShortcode("12aF", throw AssertionException("not valid")) should be("12AF") - - an[AssertionException] should be thrownBy { - stringFormatter.validateProjectShortcode("000", throw AssertionException("not valid")) - } - - an[AssertionException] should be thrownBy { - stringFormatter.validateProjectShortcode("00000", throw AssertionException("not valid")) - } - - an[AssertionException] should be thrownBy { - stringFormatter.validateProjectShortcode("wxyz", throw AssertionException("not valid")) - } - } + "The StringFormatter class for User" should { "validate username" in { // 4 - 50 characters long diff --git a/integration/src/test/scala/org/knora/webapi/responders/admin/SipiResponderADMSpec.scala b/integration/src/test/scala/org/knora/webapi/responders/admin/SipiResponderADMSpec.scala index 2b56aeb087..1994b09fae 100644 --- a/integration/src/test/scala/org/knora/webapi/responders/admin/SipiResponderADMSpec.scala +++ b/integration/src/test/scala/org/knora/webapi/responders/admin/SipiResponderADMSpec.scala @@ -5,7 +5,7 @@ package org.knora.webapi.responders.admin -import org.apache.pekko +import org.apache.pekko.testkit._ import scala.concurrent.duration._ @@ -14,8 +14,7 @@ import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectRestric import org.knora.webapi.messages.admin.responder.sipimessages._ import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject import org.knora.webapi.sharedtestdata.SharedTestDataADM - -import pekko.testkit._ +import org.knora.webapi.slice.admin.domain.model.KnoraProject.Shortcode /** * Tests [[SipiResponderADM]]. @@ -36,7 +35,7 @@ class SipiResponderADMSpec extends CoreSpec with ImplicitSender { "return details of a full quality file value" in { // http://localhost:3333/v1/files/http%3A%2F%2Frdfh.ch%2F8a0b1e75%2Freps%2F7e4ba672 appActor ! SipiFileInfoGetRequestADM( - projectID = "0803", + projectID = Shortcode.unsafeFrom("0803"), filename = "incunabula_0000003328.jp2", requestingUser = SharedTestDataADM.incunabulaMemberUser ) @@ -47,7 +46,7 @@ class SipiResponderADMSpec extends CoreSpec with ImplicitSender { "return details of a restricted view file value" in { // http://localhost:3333/v1/files/http%3A%2F%2Frdfh.ch%2F8a0b1e75%2Freps%2F7e4ba672 appActor ! SipiFileInfoGetRequestADM( - projectID = "0803", + projectID = Shortcode.unsafeFrom("0803"), filename = "incunabula_0000003328.jp2", requestingUser = SharedTestDataADM.anonymousUser ) diff --git a/webapi/src/main/scala/org/knora/webapi/messages/StringFormatter.scala b/webapi/src/main/scala/org/knora/webapi/messages/StringFormatter.scala index 0e9e0867ae..ded490da6d 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/StringFormatter.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/StringFormatter.scala @@ -25,16 +25,16 @@ import dsp.valueobjects.UuidUtil import org.knora.webapi.* import org.knora.webapi.config.AppConfig import org.knora.webapi.messages.StringFormatter.* +import org.knora.webapi.messages.XmlPatterns.nCNamePattern +import org.knora.webapi.messages.XmlPatterns.nCNameRegex import org.knora.webapi.messages.store.triplestoremessages.StringLiteralSequenceV2 import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 import org.knora.webapi.messages.v2.responder.KnoraContentV2 +import org.knora.webapi.slice.admin.domain.model.KnoraProject.Shortcode import org.knora.webapi.slice.resourceinfo.domain.InternalIri import org.knora.webapi.util.Base64UrlCheckDigit import org.knora.webapi.util.JavaUtil -import XmlPatterns.nCNamePattern -import XmlPatterns.nCNameRegex - /** * Provides instances of [[StringFormatter]], as well as string formatting constants. */ @@ -875,13 +875,13 @@ class StringFormatter private ( (true, Some(DefaultSharedOntologiesProjectCode)) } else if (ontologyPath.length == 3) { // other shared ontologies project - (true, Some(validateProjectShortcode(ontologyPath(1), errorFun))) + (true, Some(Try(Shortcode.unsafeFrom(ontologyPath(1)).value).getOrElse(errorFun))) } else { errorFun } } else if (ontologyPath.length == 2) { // non-shared ontology with project code - (false, Some(validateProjectShortcode(ontologyPath.head, errorFun))) + (false, Some(Try(Shortcode.unsafeFrom(ontologyPath.head).value).getOrElse(errorFun))) } else { // built-in ontology (false, None) @@ -1525,19 +1525,6 @@ class StringFormatter private ( case _ => false } - /** - * Given the project shortcode, checks if it is in a valid format, and converts it to upper case. - * - * @param shortcode the project's shortcode. - * @return the shortcode in upper case. - */ - @deprecated("Use def validateProjectShortcode(String) instead.") - def validateProjectShortcode(shortcode: String, errorFun: => Nothing): String = // V2 / value objects - validateProjectShortcode(shortcode).getOrElse(errorFun) - - def validateProjectShortcode(shortcode: String): Option[String] = - ProjectIDRegex.findFirstIn(shortcode.toUpperCase) - /** * Given the group IRI, checks if it is in a valid format. * diff --git a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/projectsmessages/ProjectsMessagesADM.scala b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/projectsmessages/ProjectsMessagesADM.scala index 1cdb70a1b5..16e0a95331 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/projectsmessages/ProjectsMessagesADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/projectsmessages/ProjectsMessagesADM.scala @@ -6,7 +6,7 @@ package org.knora.webapi.messages.admin.responder.projectsmessages import org.apache.commons.lang3.builder.HashCodeBuilder -import org.apache.pekko +import org.apache.pekko.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import spray.json.DefaultJsonProtocol import spray.json.JsValue import spray.json.JsonFormat @@ -39,8 +39,6 @@ import org.knora.webapi.slice.admin.api.model.ProjectsEndpointsRequests.ProjectC import org.knora.webapi.slice.admin.api.model.ProjectsEndpointsRequests.ProjectUpdateRequest import org.knora.webapi.slice.admin.domain.model.KnoraProject.* -import pekko.http.scaladsl.marshallers.sprayjson.SprayJsonSupport - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Messages diff --git a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/sipimessages/SipiMessagesADM.scala b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/sipimessages/SipiMessagesADM.scala index d12cb380ab..9a57817a7d 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/sipimessages/SipiMessagesADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/sipimessages/SipiMessagesADM.scala @@ -5,7 +5,7 @@ package org.knora.webapi.messages.admin.responder.sipimessages -import org.apache.pekko +import org.apache.pekko.http.scaladsl.marshallers.sprayjson.SprayJsonSupport import spray.json.DefaultJsonProtocol import spray.json.JsValue import spray.json.NullOptions @@ -17,8 +17,7 @@ import org.knora.webapi.messages.admin.responder.KnoraResponseADM import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectRestrictedViewSettingsADM import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectsADMJsonProtocol import org.knora.webapi.messages.admin.responder.usersmessages.UserADM - -import pekko.http.scaladsl.marshallers.sprayjson.SprayJsonSupport +import org.knora.webapi.slice.admin.domain.model.KnoraProject.Shortcode /** * An abstract trait representing a Knora v1 API request message that can be sent to `SipiResponderV2`. @@ -33,7 +32,7 @@ sealed trait SipiResponderRequestADM extends KnoraRequestADM with RelayedMessage * @param requestingUser the profile of the user making the request. */ case class SipiFileInfoGetRequestADM( - projectID: String, + projectID: Shortcode, filename: String, requestingUser: UserADM ) extends SipiResponderRequestADM diff --git a/webapi/src/main/scala/org/knora/webapi/responders/admin/SipiResponderADM.scala b/webapi/src/main/scala/org/knora/webapi/responders/admin/SipiResponderADM.scala index 86ba2dbff4..5c743aa465 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/admin/SipiResponderADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/admin/SipiResponderADM.scala @@ -8,7 +8,6 @@ package org.knora.webapi.responders.admin import com.typesafe.scalalogging.LazyLogging import zio.* -import dsp.errors.BadRequestException import dsp.errors.InconsistentRepositoryDataException import dsp.errors.NotFoundException import org.knora.webapi.core.MessageHandler @@ -16,7 +15,7 @@ import org.knora.webapi.core.MessageRelay import org.knora.webapi.messages.ResponderRequest import org.knora.webapi.messages.SmartIri import org.knora.webapi.messages.StringFormatter -import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM.* +import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM.ShortcodeIdentifier import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectRestrictedViewSettingsADM import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectRestrictedViewSettingsGetADM import org.knora.webapi.messages.admin.responder.sipimessages.SipiFileInfoGetRequestADM @@ -118,14 +117,11 @@ final case class SipiResponderADMLive( response <- permissionCode match { case 1 => for { - maybeRVSettings <- messageRelay - .ask[Option[ProjectRestrictedViewSettingsADM]]( - ProjectRestrictedViewSettingsGetADM( - identifier = ShortcodeIdentifier - .fromString(request.projectID) - .getOrElseWith(e => throw BadRequestException(e.head.getMessage)) - ) - ) + maybeRVSettings <- + messageRelay + .ask[Option[ProjectRestrictedViewSettingsADM]]( + ProjectRestrictedViewSettingsGetADM(ShortcodeIdentifier.from(request.projectID)) + ) } yield SipiFileInfoGetResponseADM(permissionCode = permissionCode, maybeRVSettings) case _ => diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/FilesRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/FilesRouteADM.scala index 09f0b962e2..dae582e751 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/FilesRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/FilesRouteADM.scala @@ -5,7 +5,8 @@ package org.knora.webapi.routing.admin -import org.apache.pekko +import org.apache.pekko.http.scaladsl.server.Directives.* +import org.apache.pekko.http.scaladsl.server.Route import zio.* import dsp.errors.BadRequestException @@ -17,9 +18,7 @@ import org.knora.webapi.routing.Authenticator import org.knora.webapi.routing.KnoraRoute import org.knora.webapi.routing.KnoraRouteData import org.knora.webapi.routing.RouteUtilADM - -import pekko.http.scaladsl.server.Directives.* -import pekko.http.scaladsl.server.Route +import org.knora.webapi.slice.admin.domain.model.KnoraProject.Shortcode /** * Provides a routing function for the API that Sipi connects to. @@ -41,7 +40,8 @@ final case class FilesRouteADM( val requestMessage = for { requestingUser <- Authenticator.getUserADM(requestContext) projectID <- ZIO - .fromOption(stringFormatter.validateProjectShortcode(projectIDAndFile.head)) + .fromOption(projectIDAndFile.headOption) + .flatMap(Shortcode.from(_).toZIO) .orElseFail(BadRequestException(s"Invalid project ID: '${projectIDAndFile.head}'")) filename <- ZIO .fromOption(Iri.toSparqlEncodedString(projectIDAndFile(1)))