Skip to content

Commit

Permalink
refactor: Replace StringFormatter.validateProjectShortcode methods wi… (
Browse files Browse the repository at this point in the history
  • Loading branch information
seakayone committed Nov 15, 2023
1 parent 52d1efa commit 80561af
Show file tree
Hide file tree
Showing 7 changed files with 25 additions and 63 deletions.
Expand Up @@ -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
Expand Down
Expand Up @@ -5,7 +5,7 @@

package org.knora.webapi.responders.admin

import org.apache.pekko
import org.apache.pekko.testkit._

import scala.concurrent.duration._

Expand All @@ -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]].
Expand All @@ -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
)
Expand All @@ -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
)
Expand Down
Expand Up @@ -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.
*/
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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.
*
Expand Down
Expand Up @@ -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
Expand Down Expand Up @@ -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

Expand Down
Expand Up @@ -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
Expand All @@ -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`.
Expand All @@ -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
Expand Down
Expand Up @@ -8,15 +8,14 @@ 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
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
Expand Down Expand Up @@ -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 _ =>
Expand Down
Expand Up @@ -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
Expand All @@ -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.
Expand All @@ -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)))
Expand Down

0 comments on commit 80561af

Please sign in to comment.