From 982c6618b8ca77a85ce175b9e629e53ac10afe17 Mon Sep 17 00:00:00 2001 From: irinaschubert Date: Thu, 25 Aug 2022 11:54:34 +0200 Subject: [PATCH 01/10] remove remnants of feature toggles --- .github/pull_request_template.md | 2 - docs/03-apis/api-v2/query-language.md | 2 - docs/03-apis/feature-toggles.md | 64 ----- docs/03-apis/index.md | 2 - .../design/principles/feature-toggles.md | 263 ------------------ docs/05-internals/design/principles/index.md | 1 - .../05-internals/design/principles/rdf-api.md | 27 +- .../src/main/scala/dsp/errors/Errors.scala | 8 - mkdocs.yml | 2 - .../messages/util/rdf/RdfFeatureFactory.scala | 5 - .../org/knora/webapi/routing/KnoraRoute.scala | 2 - .../admin/lists/DeleteListItemsRouteADM.scala | 2 +- .../admin/lists/OldListsRouteADMFeature.scala | 2 +- .../admin/lists/UpdateListItemsRouteADM.scala | 2 +- .../knora/webapi/settings/KnoraSettings.scala | 1 - 15 files changed, 7 insertions(+), 378 deletions(-) delete mode 100644 docs/03-apis/feature-toggles.md delete mode 100644 docs/05-internals/design/principles/feature-toggles.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index ffd6f60e74..b32d0381b9 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -29,8 +29,6 @@ What kind of change does this PR introduce? ## What is the current behavior? -Issue Number: N/A - ## What is the new behavior? diff --git a/docs/03-apis/api-v2/query-language.md b/docs/03-apis/api-v2/query-language.md index 48f36c0d9b..420a980164 100644 --- a/docs/03-apis/api-v2/query-language.md +++ b/docs/03-apis/api-v2/query-language.md @@ -1201,8 +1201,6 @@ The query performance of triplestores, such as Fuseki, is highly dependent on th patterns. To improve performance, Gravsearch automatically reorders the statement patterns in the WHERE clause according to their dependencies on each other, to minimise the number of possible matches for each pattern. -This optimization can be controlled using `gravsearch-dependency-optimisation` -[feature toggle](../feature-toggles.md), which is turned on by default. Consider the following Gravsearch query: diff --git a/docs/03-apis/feature-toggles.md b/docs/03-apis/feature-toggles.md deleted file mode 100644 index e240edef86..0000000000 --- a/docs/03-apis/feature-toggles.md +++ /dev/null @@ -1,64 +0,0 @@ - - -# Feature Toggles - -Some Knora features can be turned on or off on a per-request basis. -This mechanism is based on -[Feature Toggles (aka Feature Flags)](https://martinfowler.com/articles/feature-toggles.html). - -For example, a new feature that introduces a breaking API change may first be -introduced with a feature toggle that leaves it disabled by default, so that clients -can continue using the old functionality. - -When the new feature is ready to be tested with client code, the Knora release notes -and documentation will indicate that it can be enabled on a per-request basis, as explained -below. - -At a later date, the feature may be enabled by default, and the release notes -will indicate that it can still be disabled on a per-request basis by clients -that are not yet ready to use it. - -There may be more than one version of a feature toggle. Every feature -toggle has at least one version number, which is an integer. The first -version is 1. - -Most feature toggles have an expiration date, after which they will be removed. - -## Request Header - -A client can override one or more feature toggles by submitting the HTTP header -`X-Knora-Feature-Toggles`. Its value is a comma-separated list of -toggles. Each toggle consists of: - -1. its name -2. a colon -3. the version number -4. an equals sign -5. a boolean value, which can be `on`/`off`, `yes`/`no`, or `true`/`false` - -Using `on`/`off` is recommended for clarity. For example: - -``` -X-Knora-Feature-Toggles: new-foo:2=on,new-bar=off,fast-baz:1=on -``` - -A version number must be given when enabling a toggle. -Only one version of each toggle can be enabled at a time. -If a toggle is enabled by default, and you want a version -other than the default version, simply enable the toggle, -specifying the desired version number. The version number -you specify overrides the default. - -Disabling a toggle means disabling all its versions. When -a toggle is disabled, you will get the functionality that you would have -got before the toggle existed. Therefore, a version number cannot -be given when disabling a toggle. - -## Response Header - -DSP-API v2 and admin API responses contain the header -`X-Knora-Feature-Toggles`. It lists all configured toggles, -in the same format as the corresponding request header. diff --git a/docs/03-apis/index.md b/docs/03-apis/index.md index 7a405cd408..ef282e2ea1 100644 --- a/docs/03-apis/index.md +++ b/docs/03-apis/index.md @@ -15,5 +15,3 @@ The DSP APIs include: administering projects that use Knora as well as Knora itself. * The DSP [Util API](api-util/index.md), which is intended to be used for information retrieval about the DSP-stack itself. - -DSP API v2 and the admin API support [Feature Toggles](feature-toggles.md). diff --git a/docs/05-internals/design/principles/feature-toggles.md b/docs/05-internals/design/principles/feature-toggles.md deleted file mode 100644 index b04526672f..0000000000 --- a/docs/05-internals/design/principles/feature-toggles.md +++ /dev/null @@ -1,263 +0,0 @@ - - -# Feature Toggles - -For an overview of feature toggles, see -[Feature Toggles (aka Feature Flags)](https://martinfowler.com/articles/feature-toggles.html). -The design presented here is partly inspired by that article. - -## Requirements - -- It should be possible to turn features on and off by: - - - changing a setting in `application.conf` - - - sending a particular HTTP header value with an API request - - - (in the future) using a web-based user interface to configure a - feature toggle service that multiple subsystems can access - - -- Feature implementations should be produced by factory classes, - so that the code using a feature does not need to know - about the toggling decision. - -- Feature factories should use toggle configuration taken - from different sources, without knowing where the configuration - came from. - -- An HTTP response should indicate which features are turned - on. - -- A feature toggle should have metadata such as a description, - an expiration date, developer contact information, etc. - -- A feature toggle should have a version number, so - you can get different versions of the same feature. - -- It should be possible to configure a toggle in `application.conf` - so that its setting cannot be overridden per request. - -- The design of feature toggles should avoid ambiguity and - try to prevent situations where clients might be surprised by - unexpected functionality. It should be clear what will change - when a client requests a particular toggle setting. Therefore, - per-request settings should require the client to be explicit - about what is being requested. - -## Design - -### Configuration - -### Base Configuration - -The base configuration of feature toggles is in `application.conf` -under `app.feature-toggles`. Example: - -``` -app { - feature-toggles { - new-foo { - description = "Replace the old foo routes with new ones." - - available-versions = [ 1, 2 ] - default-version = 1 - enabled-by-default = yes - override-allowed = yes - - expiration-date = "2021-12-01T00:00:00Z" - - developer-emails = [ - "A developer " - ] - } - - new-bar { - description = "Replace the old bar routes with new ones." - - available-versions = [ 1, 2, 3 ] - default-version = 3 - enabled-by-default = yes - override-allowed = yes - - expiration-date = "2021-12-01T00:00:00Z" - - developer-emails = [ - "A developer " - ] - } - - fast-baz { - description = "Replace the slower, more accurate baz route with a faster, less accurate one." - - available-versions = [ 1 ] - default-version = 1 - enabled-by-default = no - override-allowed = yes - - developer-emails = [ - "A developer " - ] - } - } -} -``` - -All fields are required except `expiration-date`. - -Since it may not be possible to predict which toggles will need versions, -all toggles must have at least one version. (If a toggle could be created -without versions, and then get versions later, it would not be obvious -what should happen if a client then requested the toggle without specifying -a version number.) Version numbers must be an ascending sequence of -consecutive integers starting from 1. - -If `expiration-date` is provided, it must be an [`xsd:dateTimeStamp`](http://www.datypic.com/sc/xsd11/t-xsd_dateTimeStamp.html). All feature toggles -should have expiration dates except for long-lived ops toggles like `fast-baz` above. - -`KnoraSettingsFeatureFactoryConfig` reads this base configuration on startup. If -a feature toggle has an expiration date in the past, a warning is logged -on startup. - -### Per-Request Configuration - -A client can override the base configuration by submitting the HTTP header -`X-Knora-Feature-Toggles`. Its value is a comma-separated list of -toggles. Each toggle consists of: - -1. its name -2. a colon -3. the version number -4. an equals sign -5. a boolean value, which can be `on`/`off`, `yes`/`no`, or `true`/`false` - -Using `on`/`off` is recommended for clarity. For example: - -``` -X-Knora-Feature-Toggles: new-foo:2=on,new-bar=off,fast-baz:1=on -``` - -A version number must be given when enabling a toggle. -Only one version of each toggle can be enabled at a time. -If a toggle is enabled by default, and you want a version -other than the default version, simply enable the toggle, -specifying the desired version number. The version number -you specify overrides the default. - -Disabling a toggle means disabling all its versions. When -a toggle is disabled, you will get the functionality that you would have -got before the toggle existed. A version number cannot -be given when disabling a toggle, because it would not -be obvious what this would mean (disable all versions -or only the specified version). - -## Response Header - -DSP-API v2 and admin API responses contain the header -`X-Knora-Feature-Toggles`. It lists all configured toggles, -in the same format as the corresponding request header. - -## Implementation Framework - -A `FeatureFactoryConfig` reads feature toggles from some -configuration source, and optionally delegates to a parent -`FeatureFactoryConfig`. - -`KnoraRoute` constructs a `KnoraSettingsFeatureFactoryConfig` -to read the base configuration. For each request, it -constructs a `RequestContextFeatureFactoryConfig`, which -reads the per-request configuration and has the -`KnoraSettingsFeatureFactoryConfig` as its parent. -It then passes the per-request configuration object to the `makeRoute` -method, which can in turn pass it to a feature factory, -or send it in a request message to allow a responder to -use it. - -### Feature Factories - -The traits `FeatureFactory` and `Feature` are just tagging traits, -to make code clearer. The factory methods in a feature -factory will depend on the feature, and need only be known by -the code that uses the feature. The only requirement is that -each factory method must take a `FeatureFactoryConfig` parameter. - -To get a `FeatureToggle`, a feature factory -calls `featureFactoryConfig.getToggle`, passing the name of the toggle. -If a feature toggle has only one version, it is enough to test -whether test if the toggle is enabled, by calling `isEnabled` on the toggle. - -If the feature toggle has more than one version, call its `getMatchableState` -method. To allow the compiler to check that matches on version numbers -are exhaustive, this method is designed to be used with a sealed trait -(extending `Version`) that is implemented by case objects representing -the feature's version numbers. The method returns an instance of -`MatchableState`, which is analogous to `Option`: it is either `Off` -or `On`, and an instance of `On` contains one of the version objects. -For example: - -``` -// A trait for version numbers of the new 'foo' feature. -sealed trait NewFooVersion extends Version - -// Represents version 1 of the new 'foo' feature. -case object NEW_FOO_1 extends NewFooVersion - -// Represents version 2 of the new 'foo' feature. -case object NEW_FOO_2 extends NewFooVersion - -// The old 'foo' feature implementation. -private val oldFoo = new OldFooFeature - -// The new 'foo' feature implementation, version 1. -private val newFoo1 = new NewFooVersion1Feature - -// The new 'foo' feature implementation, version 2. -private val newFoo2 = new NewFooVersion2Feature - -def makeFoo(featureFactoryConfig: FeatureFactoryConfig): Foo = { - // Get the 'new-foo' feature toggle. - val fooToggle: FeatureToggle = featureFactoryConfig.getToggle("new-foo") - - // Choose an implementation according to the toggle state. - fooToggle.getMatchableState(NEW_FOO_1, NEW_FOO_2) match { - case Off => oldFoo - case On(NEW_FOO_1) => newFoo1 - case On(NEW_FOO_2) => newFoo2 - } -} -``` - -### Routes as Features - -To select different routes according to a feature toggle: - -- Make a feature factory that extends `KnoraRouteFactory` and `FeatureFactory`, - and has a `makeRoute` method that returns different implementations, - each of which extends `KnoraRoute` and `Feature`. - -- Make a façade route that extends `KnoraRoute`, is used in - `ApplicationActor.apiRoutes`, and has a `makeRoute` method that - delegates to the feature factory. - -To avoid constructing redundant route instances, each façade route needs its -own feature factory class. - -### Documenting a Feature Toggle - -The behaviour of each possible setting of each feature toggle should be -documented. Feature toggles that are configurable per request should be described -in the release notes. - -### Removing a Feature Toggle - -To facilitate removing a feature toggle, each implementation should have: - -- a separate file for its source code - -- a separate file for its documentation - -When the toggle is removed, the files that are no longer needed can be -deleted. diff --git a/docs/05-internals/design/principles/index.md b/docs/05-internals/design/principles/index.md index d9619f868e..6c4c734d01 100644 --- a/docs/05-internals/design/principles/index.md +++ b/docs/05-internals/design/principles/index.md @@ -13,4 +13,3 @@ - [Triplestore Updates](triplestore-updates.md) - [Consistency Checking](consistency-checking.md) - [Authentication](authentication.md) -- [Feature Toggles](feature-toggles.md) diff --git a/docs/05-internals/design/principles/rdf-api.md b/docs/05-internals/design/principles/rdf-api.md index ca870afc27..7316e54501 100644 --- a/docs/05-internals/design/principles/rdf-api.md +++ b/docs/05-internals/design/principles/rdf-api.md @@ -5,14 +5,9 @@ # RDF Processing API -Knora provides an API for parsing and formatting RDF data and -for working with RDF graphs. This allows Knora developers to use a single, +DSP provides an API for parsing and formatting RDF data and +for working with RDF graphs. This allows DSP developers to use a single, idiomatic Scala API as a façade for a Java RDF library. -By using a feature toggle, you can choose either -[Jena](https://jena.apache.org/tutorials/rdf_api.html) -or -[RDF4J](https://rdf4j.org/documentation/programming/) -as the underlying implementation. ## Overview @@ -39,8 +34,8 @@ The API is in the package `org.knora.webapi.messages.util.rdf`. It includes: - `ShaclValidator`, which validates RDF models using SHACL shapes. To work with RDF models, start with `RdfFeatureFactory`, which returns instances -of `RdfNodeFactory`, `RdfModelFactory`, `RdfFormatUtil`, and `ShaclValidator`, -using feature toggle configuration. `JsonLDUtil` does not need a feature factory. +of `RdfNodeFactory`, `RdfModelFactory`, `RdfFormatUtil`, and `ShaclValidator`. +`JsonLDUtil` does not need a feature factory. To iterate efficiently over the statements in an `RdfModel`, use its `iterator` method. An `RdfModel` cannot be modified while you are iterating over it. @@ -93,20 +88,6 @@ Turtle file containing the graph of shapes. - The RDF4J-based implementation, in package `org.knora.webapi.messages.util.rdf.rdf4jimpl`. -## Feature toggle - -For an overview of feature toggles, see [Feature Toggles](feature-toggles.md). - -The RDF API uses the feature toggle `jena-rdf-library`: - -- `on`: use the Jena implementation. - -- `off` (the default): use the RDF4J implementation. - -The default setting is used on startup, e.g. to read ontologies from the -repository. After startup, the per-request setting is used. - - ## TODO - SHACL validation. diff --git a/dsp-shared/src/main/scala/dsp/errors/Errors.scala b/dsp-shared/src/main/scala/dsp/errors/Errors.scala index 847b3fe629..8d1b78a784 100644 --- a/dsp-shared/src/main/scala/dsp/errors/Errors.scala +++ b/dsp-shared/src/main/scala/dsp/errors/Errors.scala @@ -405,14 +405,6 @@ case class HttpConfigurationException(message: String) extends ApplicationConfig */ case class TestConfigurationException(message: String) extends ApplicationConfigurationException(message) -/** - * Indicates that a feature toggle configuration is incorrect. - * - * @param message a description of the error. - */ -case class FeatureToggleException(message: String, cause: Option[Throwable] = None) - extends ApplicationConfigurationException(message) - /** * Indicates that RDF processing failed. * diff --git a/mkdocs.yml b/mkdocs.yml index 505486de81..07bea41840 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -21,7 +21,6 @@ nav: - APIs: - The DSP APIs: - Index: 03-apis/index.md - - Feature Toggles: 03-apis/feature-toggles.md - API V1: - Index: 03-apis/api-v1/index.md - Introduction: 03-apis/api-v1/introduction.md @@ -80,7 +79,6 @@ nav: - Triplestore Updates: 05-internals/design/principles/triplestore-updates.md - Consistency Checking: 05-internals/design/principles/consistency-checking.md - Authentication: 05-internals/design/principles/authentication.md - - Feature Toggles: 05-internals/design/principles/feature-toggles.md - RDF Processing API: 05-internals/design/principles/rdf-api.md - API V1 Design: - Index: 05-internals/design/api-v1/index.md diff --git a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/RdfFeatureFactory.scala b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/RdfFeatureFactory.scala index f19c9ffbc0..dae457ac7c 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/RdfFeatureFactory.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/util/rdf/RdfFeatureFactory.scala @@ -14,11 +14,6 @@ import org.knora.webapi.settings.KnoraSettingsImpl */ object RdfFeatureFactory { - /** - * The name of the feature toggle that enables the Jena implementation of the RDF façade. - */ - private val JENA_TOGGLE_NAME = "jena-rdf-library" - // Jena singletons. private val jenaNodeFactory = new JenaNodeFactory private val jenaModelFactory = new JenaModelFactory(jenaNodeFactory) diff --git a/webapi/src/main/scala/org/knora/webapi/routing/KnoraRoute.scala b/webapi/src/main/scala/org/knora/webapi/routing/KnoraRoute.scala index 7f4338505c..48759774c0 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/KnoraRoute.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/KnoraRoute.scala @@ -67,8 +67,6 @@ abstract class KnoraRouteFactory(routeData: KnoraRouteData) { * * - by asking a feature factory for a routing function (if this is a façade route) * - * - by making a choice based on a feature toggle (if this is a feature factory) - * * @return a route configured with the features enabled by the feature factory configuration. */ def makeRoute(): Route diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/DeleteListItemsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/DeleteListItemsRouteADM.scala index abc309d3fa..59b0eefe1f 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/DeleteListItemsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/DeleteListItemsRouteADM.scala @@ -24,7 +24,7 @@ object DeleteListItemsRouteADM { } /** - * A [[Feature]] that provides routes to delete list items. + * Provides routes to delete list items. * * @param routeData the [[KnoraRouteData]] to be used in constructing the route. */ diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/OldListsRouteADMFeature.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/OldListsRouteADMFeature.scala index f1c8e5edec..f55d75d3b4 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/OldListsRouteADMFeature.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/OldListsRouteADMFeature.scala @@ -34,7 +34,7 @@ object OldListsRouteADMFeature { } /** - * A [[Feature]] that provides the old list admin API route. + * Provides the old list admin API route. * * @param routeData the [[KnoraRouteData]] to be used in constructing the route. */ diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala index e143da900d..f92501ce4b 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala @@ -27,7 +27,7 @@ object UpdateListItemsRouteADM { } /** - * A [[Feature]] that provides routes to delete list items. + * Provides routes to update list items. * * @param routeData the [[KnoraRouteData]] to be used in constructing the route. */ diff --git a/webapi/src/main/scala/org/knora/webapi/settings/KnoraSettings.scala b/webapi/src/main/scala/org/knora/webapi/settings/KnoraSettings.scala index d9c0b8987b..c4c59f23c6 100644 --- a/webapi/src/main/scala/org/knora/webapi/settings/KnoraSettings.scala +++ b/webapi/src/main/scala/org/knora/webapi/settings/KnoraSettings.scala @@ -15,7 +15,6 @@ import com.typesafe.config.Config import com.typesafe.config.ConfigObject import com.typesafe.config.ConfigValue import com.typesafe.scalalogging.Logger -import dsp.errors.FeatureToggleException import dsp.errors.FileWriteException import dsp.valueobjects.User import org.knora.webapi.util.cache.CacheUtil.KnoraCacheConfig From 5f84c59d56708aa7e0d3e39f6b8c0ea7dc2feb85 Mon Sep 17 00:00:00 2001 From: irinaschubert Date: Thu, 25 Aug 2022 12:21:55 +0200 Subject: [PATCH 02/10] redo changes in PR template --- .github/pull_request_template.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index b32d0381b9..ffd6f60e74 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -29,6 +29,8 @@ What kind of change does this PR introduce? ## What is the current behavior? +Issue Number: N/A + ## What is the new behavior? From 37aeac51177af442e5a310efd4fe6cddd80e9bcb Mon Sep 17 00:00:00 2001 From: irinaschubert Date: Thu, 25 Aug 2022 15:44:42 +0200 Subject: [PATCH 03/10] refactor admin list routes --- .../webapi/routing/SwaggerApiDocsRoute.scala | 4 +- .../webapi/routing/admin/ListsRouteADM.scala | 6 +- .../admin/lists/CreateListItemsRouteADM.scala | 197 +++++++ .../admin/lists/GetListItemsRouteADM.scala | 180 ++++++ .../admin/lists/OldListsRouteADMFeature.scala | 404 ------------- .../admin/lists/UpdateListItemsRouteADM.scala | 85 ++- webapi/src/test/resources/logback-test.xml | 2 +- ...a => CreateListItemsRouteADME2ESpec.scala} | 544 +----------------- .../DeleteListItemsRouteADME2ESpec.scala | 37 +- .../lists/GetListItemsRouteADME2ESpec.scala | 275 +++++++++ .../UpdateListItemsRouteADME2ESpec.scala | 5 +- 11 files changed, 768 insertions(+), 971 deletions(-) create mode 100644 webapi/src/main/scala/org/knora/webapi/routing/admin/lists/CreateListItemsRouteADM.scala create mode 100644 webapi/src/main/scala/org/knora/webapi/routing/admin/lists/GetListItemsRouteADM.scala delete mode 100644 webapi/src/main/scala/org/knora/webapi/routing/admin/lists/OldListsRouteADMFeature.scala rename webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/{OldListsRouteADMFeatureE2ESpec.scala => CreateListItemsRouteADME2ESpec.scala} (52%) create mode 100644 webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/GetListItemsRouteADME2ESpec.scala diff --git a/webapi/src/main/scala/org/knora/webapi/routing/SwaggerApiDocsRoute.scala b/webapi/src/main/scala/org/knora/webapi/routing/SwaggerApiDocsRoute.scala index 4561d6df85..8eeb92cc37 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/SwaggerApiDocsRoute.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/SwaggerApiDocsRoute.scala @@ -22,8 +22,10 @@ class SwaggerApiDocsRoute(routeData: KnoraRouteData) extends KnoraRoute(routeDat // List all routes here override val apiClasses: Set[Class[_]] = Set( classOf[GroupsRouteADM], - classOf[OldListsRouteADMFeature], classOf[DeleteListItemsRouteADM], + classOf[CreateListItemsRouteADM], + classOf[GetListItemsRouteADM], + classOf[UpdateListItemsRouteADM], classOf[PermissionsRouteADM], classOf[ProjectsRouteADM], classOf[StoreRouteADM], diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/ListsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/ListsRouteADM.scala index 2aa6dabd15..870a0b25f0 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/ListsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/ListsRouteADM.scala @@ -15,12 +15,14 @@ import org.knora.webapi.routing.admin.lists._ * Provides an akka-http-routing function for API routes that deal with lists. */ class ListsRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) { - private val oldListRoute: OldListsRouteADMFeature = new OldListsRouteADMFeature(routeData) + private val getNodeRoute: GetListItemsRouteADM = new GetListItemsRouteADM(routeData) + private val createNodeRoute: CreateListItemsRouteADM = new CreateListItemsRouteADM(routeData) private val deleteNodeRoute: DeleteListItemsRouteADM = new DeleteListItemsRouteADM(routeData) private val updateNodeRoute: UpdateListItemsRouteADM = new UpdateListItemsRouteADM(routeData) override def makeRoute(): Route = - oldListRoute.makeRoute() ~ + getNodeRoute.makeRoute() ~ + createNodeRoute.makeRoute() ~ deleteNodeRoute.makeRoute() ~ updateNodeRoute.makeRoute() } diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/CreateListItemsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/CreateListItemsRouteADM.scala new file mode 100644 index 0000000000..d70f1b9a63 --- /dev/null +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/CreateListItemsRouteADM.scala @@ -0,0 +1,197 @@ +/* + * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.knora.webapi.routing.admin.lists + +import akka.http.scaladsl.server.Directives._ +import akka.http.scaladsl.server.PathMatcher +import akka.http.scaladsl.server.Route +import io.swagger.annotations._ +import org.knora.webapi.IRI +import dsp.errors.BadRequestException +import dsp.errors.ForbiddenException + +import org.knora.webapi.messages.admin.responder.listsmessages.ListNodeCreatePayloadADM.ListChildNodeCreatePayloadADM +import org.knora.webapi.messages.admin.responder.listsmessages.ListNodeCreatePayloadADM.ListRootNodeCreatePayloadADM +import org.knora.webapi.messages.admin.responder.listsmessages._ +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 zio.prelude.Validation + +import java.util.UUID +import javax.ws.rs.Path +import scala.concurrent.Future +import dsp.valueobjects.Iri._ +import dsp.valueobjects.List._ +import dsp.valueobjects.ListErrorMessages + +object CreateListItemsRouteADM { + val ListsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "lists") +} + +/** + * Provides routes to create list items. + * + * @param routeData the [[KnoraRouteData]] to be used in constructing the route. + */ +@Api(value = "lists", produces = "application/json") +@Path("/admin/lists") +class CreateListItemsRouteADM(routeData: KnoraRouteData) + extends KnoraRoute(routeData) + with Authenticator + with ListADMJsonProtocol { + + import CreateListItemsRouteADM._ + + def makeRoute(): Route = + createListRootNode() ~ + createListChildNode() + + @ApiOperation( + value = "Add new list", + nickname = "addList", + httpMethod = "POST", + response = classOf[ListGetResponseADM] + ) + @ApiImplicitParams( + Array( + new ApiImplicitParam( + name = "body", + value = "\"list\" to create", + required = true, + dataTypeClass = classOf[ListRootNodeCreateApiRequestADM], + paramType = "body" + ) + ) + ) + @ApiResponses( + Array( + new ApiResponse(code = 500, message = "Internal server error") + ) + ) + /** + * Creates a new list (root node). + */ + private def createListRootNode(): Route = path(ListsBasePath) { + post { + entity(as[ListRootNodeCreateApiRequestADM]) { apiRequest => requestContext => + val maybeId: Validation[Throwable, Option[ListIri]] = ListIri.make(apiRequest.id) + val projectIri: Validation[Throwable, ProjectIri] = ProjectIri.make(apiRequest.projectIri) + val maybeName: Validation[Throwable, Option[ListName]] = ListName.make(apiRequest.name) + val labels: Validation[Throwable, Labels] = Labels.make(apiRequest.labels) + val comments: Validation[Throwable, Comments] = Comments.make(apiRequest.comments) + val validatedListRootNodeCreatePayload: Validation[Throwable, ListRootNodeCreatePayloadADM] = + Validation.validateWith(maybeId, projectIri, maybeName, labels, comments)(ListRootNodeCreatePayloadADM) + + val requestMessage: Future[ListRootNodeCreateRequestADM] = for { + payload <- toFuture(validatedListRootNodeCreatePayload) + requestingUser <- getUserADM(requestContext) + + // check if the requesting user is allowed to perform operation + _ = if ( + !requestingUser.permissions.isProjectAdmin( + projectIri.toOption.get.value + ) && !requestingUser.permissions.isSystemAdmin + ) { + // not project or a system admin + throw ForbiddenException(ListErrorMessages.ListCreatePermission) + } + } yield ListRootNodeCreateRequestADM( + createRootNode = payload, + requestingUser = requestingUser, + apiRequestID = UUID.randomUUID() + ) + + RouteUtilADM.runJsonRoute( + requestMessageF = requestMessage, + requestContext = requestContext, + settings = settings, + appActor = appActor, + log = log + ) + } + } + } + + @Path("/{IRI}") + @ApiOperation( + value = "Add new node", + nickname = "addListNode", + httpMethod = "POST", + response = classOf[ChildNodeInfoGetResponseADM] + ) + @ApiImplicitParams( + Array( + new ApiImplicitParam( + name = "body", + value = "\"node\" to create", + required = true, + dataTypeClass = classOf[ListChildNodeCreateApiRequestADM], + paramType = "body" + ) + ) + ) + @ApiResponses( + Array( + new ApiResponse(code = 500, message = "Internal server error") + ) + ) + /** + * Creates a new list child node. + */ + private def createListChildNode(): Route = path(ListsBasePath / Segment) { iri => + post { + entity(as[ListChildNodeCreateApiRequestADM]) { apiRequest => requestContext => + // check if requested ListIri matches the Iri passed in the route + val parentNodeIri: Validation[Throwable, ListIri] = if (iri == apiRequest.parentNodeIri) { + ListIri.make(apiRequest.parentNodeIri) + } else { + Validation.fail(throw BadRequestException("Route and payload parentNodeIri mismatch.")) + } + + val id: Validation[Throwable, Option[ListIri]] = ListIri.make(apiRequest.id) + val projectIri: Validation[Throwable, ProjectIri] = ProjectIri.make(apiRequest.projectIri) + val name: Validation[Throwable, Option[ListName]] = ListName.make(apiRequest.name) + val position: Validation[Throwable, Option[Position]] = Position.make(apiRequest.position) + val labels: Validation[Throwable, Labels] = Labels.make(apiRequest.labels) + val comments: Validation[Throwable, Option[Comments]] = Comments.make(apiRequest.comments) + val validatedCreateChildNodePeyload: Validation[Throwable, ListChildNodeCreatePayloadADM] = + Validation.validateWith(id, parentNodeIri, projectIri, name, position, labels, comments)( + ListChildNodeCreatePayloadADM + ) + + val requestMessage: Future[ListChildNodeCreateRequestADM] = for { + payload <- toFuture(validatedCreateChildNodePeyload) + requestingUser <- getUserADM(requestContext) + + // check if the requesting user is allowed to perform operation + _ = if ( + !requestingUser.permissions.isProjectAdmin( + projectIri.toOption.get.value + ) && !requestingUser.permissions.isSystemAdmin + ) { + // not project or a system admin + throw ForbiddenException(ListErrorMessages.ListCreatePermission) + } + } yield ListChildNodeCreateRequestADM( + createChildNodeRequest = payload, + requestingUser = requestingUser, + apiRequestID = UUID.randomUUID() + ) + + RouteUtilADM.runJsonRoute( + requestMessageF = requestMessage, + requestContext = requestContext, + settings = settings, + appActor = appActor, + log = log + ) + } + } + } + +} diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/GetListItemsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/GetListItemsRouteADM.scala new file mode 100644 index 0000000000..d8fa32b68b --- /dev/null +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/GetListItemsRouteADM.scala @@ -0,0 +1,180 @@ +/* + * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.knora.webapi.routing.admin.lists + +import akka.http.scaladsl.server.Directives._ +import akka.http.scaladsl.server.PathMatcher +import akka.http.scaladsl.server.Route +import io.swagger.annotations._ +import org.knora.webapi.IRI +import dsp.errors.BadRequestException +import dsp.errors.ForbiddenException + +import org.knora.webapi.messages.admin.responder.listsmessages.ListNodeCreatePayloadADM.ListChildNodeCreatePayloadADM +import org.knora.webapi.messages.admin.responder.listsmessages.ListNodeCreatePayloadADM.ListRootNodeCreatePayloadADM +import org.knora.webapi.messages.admin.responder.listsmessages._ +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 zio.prelude.Validation + +import java.util.UUID +import javax.ws.rs.Path +import scala.concurrent.Future +import dsp.valueobjects.Iri._ +import dsp.valueobjects.List._ +import dsp.valueobjects.ListErrorMessages + +object GetListItemsRouteADM { + val ListsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "lists") +} + +/** + * Provides routes to get list items. + * + * @param routeData the [[KnoraRouteData]] to be used in constructing the route. + */ +@Api(value = "lists", produces = "application/json") +@Path("/admin/lists") +class GetListItemsRouteADM(routeData: KnoraRouteData) + extends KnoraRoute(routeData) + with Authenticator + with ListADMJsonProtocol { + + import GetListItemsRouteADM._ + + def makeRoute(): Route = + getLists() ~ + getListNode() ~ + getListOrNodeInfo("infos") ~ + getListOrNodeInfo("nodes") ~ + getListInfo() + + @ApiOperation(value = "Get lists", nickname = "getlists", httpMethod = "GET", response = classOf[ListsGetResponseADM]) + @ApiResponses( + Array( + new ApiResponse(code = 500, message = "Internal server error") + ) + ) + /** + * Returns all lists optionally filtered by project. + */ + private def getLists(): Route = path(ListsBasePath) { + get { + parameters("projectIri".?) { maybeProjectIri: Option[IRI] => requestContext => + val projectIri = + stringFormatter.validateAndEscapeOptionalIri( + maybeProjectIri, + throw BadRequestException(s"Invalid param project IRI: $maybeProjectIri") + ) + + val requestMessage: Future[ListsGetRequestADM] = for { + requestingUser <- getUserADM( + requestContext = requestContext + ) + } yield ListsGetRequestADM( + projectIri = projectIri, + requestingUser = requestingUser + ) + + RouteUtilADM.runJsonRoute( + requestMessageF = requestMessage, + requestContext = requestContext, + settings = settings, + appActor = appActor, + log = log + ) + } + } + } + + @Path("/{IRI}") + @ApiOperation(value = "Get a list", nickname = "getlist", httpMethod = "GET", response = classOf[ListGetResponseADM]) + @ApiResponses( + Array( + new ApiResponse(code = 500, message = "Internal server error") + ) + ) + /** + * Returns a list node, root or child, with children (if exist). + */ + private def getListNode(): Route = path(ListsBasePath / Segment) { iri => + get { requestContext => + val listIri = + stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid param list IRI: $iri")) + + val requestMessage: Future[ListGetRequestADM] = for { + requestingUser <- getUserADM( + requestContext = requestContext + ) + } yield ListGetRequestADM( + iri = listIri, + requestingUser = requestingUser + ) + + RouteUtilADM.runJsonRoute( + requestMessageF = requestMessage, + requestContext = requestContext, + settings = settings, + appActor = appActor, + log = log + ) + } + } + + /** + * Returns basic information about list node, root or child, w/o children (if exist). + */ + private def getListOrNodeInfo(routeSwitch: String): Route = + path(ListsBasePath / routeSwitch / Segment) { iri => + get { requestContext => + val listIri = + stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid param list IRI: $iri")) + val requestMessage: Future[ListNodeInfoGetRequestADM] = for { + requestingUser <- getUserADM(requestContext) + } yield ListNodeInfoGetRequestADM( + iri = listIri, + requestingUser = requestingUser + ) + + RouteUtilADM.runJsonRoute( + requestMessageF = requestMessage, + requestContext = requestContext, + settings = settings, + appActor = appActor, + log = log + ) + } + } + + /** + * Returns basic information about a node, root or child, w/o children. + */ + private def getListInfo(): Route = + // Brought from new lists route implementation, has the e functionality as getListOrNodeInfo + path(ListsBasePath / Segment / "info") { iri => + get { requestContext => + val listIri = + stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid param list IRI: $iri")) + + val requestMessage: Future[ListNodeInfoGetRequestADM] = for { + requestingUser <- getUserADM(requestContext) + } yield ListNodeInfoGetRequestADM( + iri = listIri, + requestingUser = requestingUser + ) + + RouteUtilADM.runJsonRoute( + requestMessageF = requestMessage, + requestContext = requestContext, + settings = settings, + appActor = appActor, + log = log + ) + } + } +} diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/OldListsRouteADMFeature.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/OldListsRouteADMFeature.scala deleted file mode 100644 index f55d75d3b4..0000000000 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/OldListsRouteADMFeature.scala +++ /dev/null @@ -1,404 +0,0 @@ -/* - * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. - * SPDX-License-Identifier: Apache-2.0 - */ - -package org.knora.webapi.routing.admin.lists - -import akka.http.scaladsl.server.Directives._ -import akka.http.scaladsl.server.PathMatcher -import akka.http.scaladsl.server.Route -import io.swagger.annotations._ -import org.knora.webapi.IRI -import dsp.errors.BadRequestException -import dsp.errors.ForbiddenException - -import org.knora.webapi.messages.admin.responder.listsmessages.ListNodeCreatePayloadADM.ListChildNodeCreatePayloadADM -import org.knora.webapi.messages.admin.responder.listsmessages.ListNodeCreatePayloadADM.ListRootNodeCreatePayloadADM -import org.knora.webapi.messages.admin.responder.listsmessages._ -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 zio.prelude.Validation - -import java.util.UUID -import javax.ws.rs.Path -import scala.concurrent.Future -import dsp.valueobjects.Iri._ -import dsp.valueobjects.List._ -import dsp.valueobjects.ListErrorMessages - -object OldListsRouteADMFeature { - val ListsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "lists") -} - -/** - * Provides the old list admin API route. - * - * @param routeData the [[KnoraRouteData]] to be used in constructing the route. - */ -@Api(value = "lists (old endpoint)", produces = "application/json") -@Path("/admin/lists") -class OldListsRouteADMFeature(routeData: KnoraRouteData) - extends KnoraRoute(routeData) - with Authenticator - with ListADMJsonProtocol { - - import OldListsRouteADMFeature._ - - def makeRoute(): Route = - getLists() ~ - getListNode() ~ - getListOrNodeInfo("infos") ~ - getListOrNodeInfo("nodes") ~ - getListInfo() ~ - createListRootNode() ~ - createListChildNode() ~ - updateList() - - @ApiOperation(value = "Get lists", nickname = "getlists", httpMethod = "GET", response = classOf[ListsGetResponseADM]) - @ApiResponses( - Array( - new ApiResponse(code = 500, message = "Internal server error") - ) - ) - /** - * Returns all lists optionally filtered by project. - */ - private def getLists(): Route = path(ListsBasePath) { - get { - parameters("projectIri".?) { maybeProjectIri: Option[IRI] => requestContext => - val projectIri = - stringFormatter.validateAndEscapeOptionalIri( - maybeProjectIri, - throw BadRequestException(s"Invalid param project IRI: $maybeProjectIri") - ) - - val requestMessage: Future[ListsGetRequestADM] = for { - requestingUser <- getUserADM( - requestContext = requestContext - ) - } yield ListsGetRequestADM( - projectIri = projectIri, - requestingUser = requestingUser - ) - - RouteUtilADM.runJsonRoute( - requestMessageF = requestMessage, - requestContext = requestContext, - settings = settings, - appActor = appActor, - log = log - ) - } - } - } - - @Path("/{IRI}") - @ApiOperation(value = "Get a list", nickname = "getlist", httpMethod = "GET", response = classOf[ListGetResponseADM]) - @ApiResponses( - Array( - new ApiResponse(code = 500, message = "Internal server error") - ) - ) - /** - * Returns a list node, root or child, with children (if exist). - */ - private def getListNode(): Route = path(ListsBasePath / Segment) { iri => - get { requestContext => - val listIri = - stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid param list IRI: $iri")) - - val requestMessage: Future[ListGetRequestADM] = for { - requestingUser <- getUserADM( - requestContext = requestContext - ) - } yield ListGetRequestADM( - iri = listIri, - requestingUser = requestingUser - ) - - RouteUtilADM.runJsonRoute( - requestMessageF = requestMessage, - requestContext = requestContext, - settings = settings, - appActor = appActor, - log = log - ) - } - } - - /** - * Returns basic information about list node, root or child, w/o children (if exist). - */ - private def getListOrNodeInfo(routeSwitch: String): Route = - path(ListsBasePath / routeSwitch / Segment) { iri => - get { requestContext => - val listIri = - stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid param list IRI: $iri")) - val requestMessage: Future[ListNodeInfoGetRequestADM] = for { - requestingUser <- getUserADM(requestContext) - } yield ListNodeInfoGetRequestADM( - iri = listIri, - requestingUser = requestingUser - ) - - RouteUtilADM.runJsonRoute( - requestMessageF = requestMessage, - requestContext = requestContext, - settings = settings, - appActor = appActor, - log = log - ) - } - } - - /** - * Returns basic information about a node, root or child, w/o children. - */ - private def getListInfo(): Route = -// Brought from new lists route implementation, has the e functionality as getListOrNodeInfo - path(ListsBasePath / Segment / "info") { iri => - get { requestContext => - val listIri = - stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid param list IRI: $iri")) - - val requestMessage: Future[ListNodeInfoGetRequestADM] = for { - requestingUser <- getUserADM(requestContext) - } yield ListNodeInfoGetRequestADM( - iri = listIri, - requestingUser = requestingUser - ) - - RouteUtilADM.runJsonRoute( - requestMessageF = requestMessage, - requestContext = requestContext, - settings = settings, - appActor = appActor, - log = log - ) - } - } - - @ApiOperation( - value = "Add new list", - nickname = "addList", - httpMethod = "POST", - response = classOf[ListGetResponseADM] - ) - @ApiImplicitParams( - Array( - new ApiImplicitParam( - name = "body", - value = "\"list\" to create", - required = true, - dataTypeClass = classOf[ListRootNodeCreateApiRequestADM], - paramType = "body" - ) - ) - ) - @ApiResponses( - Array( - new ApiResponse(code = 500, message = "Internal server error") - ) - ) - /** - * Creates a new list (root node). - */ - private def createListRootNode(): Route = path(ListsBasePath) { - post { - entity(as[ListRootNodeCreateApiRequestADM]) { apiRequest => requestContext => - val maybeId: Validation[Throwable, Option[ListIri]] = ListIri.make(apiRequest.id) - val projectIri: Validation[Throwable, ProjectIri] = ProjectIri.make(apiRequest.projectIri) - val maybeName: Validation[Throwable, Option[ListName]] = ListName.make(apiRequest.name) - val labels: Validation[Throwable, Labels] = Labels.make(apiRequest.labels) - val comments: Validation[Throwable, Comments] = Comments.make(apiRequest.comments) - val validatedListRootNodeCreatePayload: Validation[Throwable, ListRootNodeCreatePayloadADM] = - Validation.validateWith(maybeId, projectIri, maybeName, labels, comments)(ListRootNodeCreatePayloadADM) - - val requestMessage: Future[ListRootNodeCreateRequestADM] = for { - payload <- toFuture(validatedListRootNodeCreatePayload) - requestingUser <- getUserADM(requestContext) - - // check if the requesting user is allowed to perform operation - _ = if ( - !requestingUser.permissions.isProjectAdmin( - projectIri.toOption.get.value - ) && !requestingUser.permissions.isSystemAdmin - ) { - // not project or a system admin - throw ForbiddenException(ListErrorMessages.ListCreatePermission) - } - } yield ListRootNodeCreateRequestADM( - createRootNode = payload, - requestingUser = requestingUser, - apiRequestID = UUID.randomUUID() - ) - - RouteUtilADM.runJsonRoute( - requestMessageF = requestMessage, - requestContext = requestContext, - settings = settings, - appActor = appActor, - log = log - ) - } - } - } - - @Path("/{IRI}") - @ApiOperation( - value = "Add new node", - nickname = "addListNode", - httpMethod = "POST", - response = classOf[ChildNodeInfoGetResponseADM] - ) - @ApiImplicitParams( - Array( - new ApiImplicitParam( - name = "body", - value = "\"node\" to create", - required = true, - dataTypeClass = classOf[ListChildNodeCreateApiRequestADM], - paramType = "body" - ) - ) - ) - @ApiResponses( - Array( - new ApiResponse(code = 500, message = "Internal server error") - ) - ) - /** - * Creates a new list child node. - */ - private def createListChildNode(): Route = path(ListsBasePath / Segment) { iri => - post { - entity(as[ListChildNodeCreateApiRequestADM]) { apiRequest => requestContext => - // check if requested ListIri matches the Iri passed in the route - val parentNodeIri: Validation[Throwable, ListIri] = if (iri == apiRequest.parentNodeIri) { - ListIri.make(apiRequest.parentNodeIri) - } else { - Validation.fail(throw BadRequestException("Route and payload parentNodeIri mismatch.")) - } - - val id: Validation[Throwable, Option[ListIri]] = ListIri.make(apiRequest.id) - val projectIri: Validation[Throwable, ProjectIri] = ProjectIri.make(apiRequest.projectIri) - val name: Validation[Throwable, Option[ListName]] = ListName.make(apiRequest.name) - val position: Validation[Throwable, Option[Position]] = Position.make(apiRequest.position) - val labels: Validation[Throwable, Labels] = Labels.make(apiRequest.labels) - val comments: Validation[Throwable, Option[Comments]] = Comments.make(apiRequest.comments) - val validatedCreateChildNodePeyload: Validation[Throwable, ListChildNodeCreatePayloadADM] = - Validation.validateWith(id, parentNodeIri, projectIri, name, position, labels, comments)( - ListChildNodeCreatePayloadADM - ) - - val requestMessage: Future[ListChildNodeCreateRequestADM] = for { - payload <- toFuture(validatedCreateChildNodePeyload) - requestingUser <- getUserADM(requestContext) - - // check if the requesting user is allowed to perform operation - _ = if ( - !requestingUser.permissions.isProjectAdmin( - projectIri.toOption.get.value - ) && !requestingUser.permissions.isSystemAdmin - ) { - // not project or a system admin - throw ForbiddenException(ListErrorMessages.ListCreatePermission) - } - } yield ListChildNodeCreateRequestADM( - createChildNodeRequest = payload, - requestingUser = requestingUser, - apiRequestID = UUID.randomUUID() - ) - - RouteUtilADM.runJsonRoute( - requestMessageF = requestMessage, - requestContext = requestContext, - settings = settings, - appActor = appActor, - log = log - ) - } - } - } - - @Path("/{IRI}") - @ApiOperation( - value = "Update basic list information", - nickname = "putList", - httpMethod = "PUT", - response = classOf[RootNodeInfoGetResponseADM] - ) - @ApiImplicitParams( - Array( - new ApiImplicitParam( - name = "body", - value = "\"list\" to update", - required = true, - dataTypeClass = classOf[ListNodeChangeApiRequestADM], - paramType = "body" - ) - ) - ) - @ApiResponses( - Array( - new ApiResponse(code = 500, message = "Internal server error") - ) - ) - /** - * Updates existing list node, either root or child. - */ - private def updateList(): Route = path(ListsBasePath / Segment) { iri => - put { - entity(as[ListNodeChangeApiRequestADM]) { apiRequest => requestContext => - // check if requested Iri matches the route Iri - val listIri: Validation[Throwable, ListIri] = if (iri == apiRequest.listIri) { - ListIri.make(apiRequest.listIri) - } else { - Validation.fail(throw BadRequestException("Route and payload listIri mismatch.")) - } - - val projectIri: Validation[Throwable, ProjectIri] = ProjectIri.make(apiRequest.projectIri) - val hasRootNode: Validation[Throwable, Option[ListIri]] = ListIri.make(apiRequest.hasRootNode) - val position: Validation[Throwable, Option[Position]] = Position.make(apiRequest.position) - val name: Validation[Throwable, Option[ListName]] = ListName.make(apiRequest.name) - val labels: Validation[Throwable, Option[Labels]] = Labels.make(apiRequest.labels) - val comments: Validation[Throwable, Option[Comments]] = Comments.make(apiRequest.comments) - - val validatedChangeNodeInfoPayload: Validation[Throwable, ListNodeChangePayloadADM] = - Validation.validateWith(listIri, projectIri, hasRootNode, position, name, labels, comments)( - ListNodeChangePayloadADM - ) - - val requestMessage: Future[NodeInfoChangeRequestADM] = for { - payload <- toFuture(validatedChangeNodeInfoPayload) - requestingUser <- getUserADM(requestContext) - // check if the requesting user is allowed to perform operation - _ = if ( - !requestingUser.permissions.isProjectAdmin( - projectIri.toOption.get.value - ) && !requestingUser.permissions.isSystemAdmin - ) { - // not project or a system admin - throw ForbiddenException(ListErrorMessages.ListNodeCreatePermission) - } - } yield NodeInfoChangeRequestADM( - listIri = listIri.toOption.get.value, - changeNodeRequest = payload, - requestingUser = requestingUser, - apiRequestID = UUID.randomUUID() - ) - - RouteUtilADM.runJsonRoute( - requestMessageF = requestMessage, - requestContext = requestContext, - settings = settings, - appActor = appActor, - log = log - ) - } - } - } -} diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala index f92501ce4b..ec845af6ae 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala @@ -21,6 +21,10 @@ import java.util.UUID import javax.ws.rs.Path import scala.concurrent.Future import dsp.valueobjects.List._ +import zio.prelude.Validation +import dsp.valueobjects.Iri._ +import dsp.valueobjects.ListErrorMessages +import dsp.errors.ForbiddenException object UpdateListItemsRouteADM { val ListsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "lists") @@ -42,7 +46,8 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) updateNodeName() ~ updateNodeLabels() ~ updateNodeComments() ~ - updateNodePosition() + updateNodePosition() ~ + updateList() @Path("/{IRI}/name") @ApiOperation( @@ -264,4 +269,82 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) } } } + + @Path("/{IRI}") + @ApiOperation( + value = "Update basic list information", + nickname = "putList", + httpMethod = "PUT", + response = classOf[RootNodeInfoGetResponseADM] + ) + @ApiImplicitParams( + Array( + new ApiImplicitParam( + name = "body", + value = "\"list\" to update", + required = true, + dataTypeClass = classOf[ListNodeChangeApiRequestADM], + paramType = "body" + ) + ) + ) + @ApiResponses( + Array( + new ApiResponse(code = 500, message = "Internal server error") + ) + ) + /** + * Updates existing list node, either root or child. + */ + private def updateList(): Route = path(ListsBasePath / Segment) { iri => + put { + entity(as[ListNodeChangeApiRequestADM]) { apiRequest => requestContext => + // check if requested Iri matches the route Iri + val listIri: Validation[Throwable, ListIri] = if (iri == apiRequest.listIri) { + ListIri.make(apiRequest.listIri) + } else { + Validation.fail(throw BadRequestException("Route and payload listIri mismatch.")) + } + + val projectIri: Validation[Throwable, ProjectIri] = ProjectIri.make(apiRequest.projectIri) + val hasRootNode: Validation[Throwable, Option[ListIri]] = ListIri.make(apiRequest.hasRootNode) + val position: Validation[Throwable, Option[Position]] = Position.make(apiRequest.position) + val name: Validation[Throwable, Option[ListName]] = ListName.make(apiRequest.name) + val labels: Validation[Throwable, Option[Labels]] = Labels.make(apiRequest.labels) + val comments: Validation[Throwable, Option[Comments]] = Comments.make(apiRequest.comments) + + val validatedChangeNodeInfoPayload: Validation[Throwable, ListNodeChangePayloadADM] = + Validation.validateWith(listIri, projectIri, hasRootNode, position, name, labels, comments)( + ListNodeChangePayloadADM + ) + + val requestMessage: Future[NodeInfoChangeRequestADM] = for { + payload <- toFuture(validatedChangeNodeInfoPayload) + requestingUser <- getUserADM(requestContext) + // check if the requesting user is allowed to perform operation + _ = if ( + !requestingUser.permissions.isProjectAdmin( + projectIri.toOption.get.value + ) && !requestingUser.permissions.isSystemAdmin + ) { + // not project or a system admin + throw ForbiddenException(ListErrorMessages.ListNodeCreatePermission) + } + } yield NodeInfoChangeRequestADM( + listIri = listIri.toOption.get.value, + changeNodeRequest = payload, + requestingUser = requestingUser, + apiRequestID = UUID.randomUUID() + ) + + RouteUtilADM.runJsonRoute( + requestMessageF = requestMessage, + requestContext = requestContext, + settings = settings, + appActor = appActor, + log = log + ) + } + } + } } diff --git a/webapi/src/test/resources/logback-test.xml b/webapi/src/test/resources/logback-test.xml index f9f996aed3..c9b19feafb 100644 --- a/webapi/src/test/resources/logback-test.xml +++ b/webapi/src/test/resources/logback-test.xml @@ -134,7 +134,7 @@ - + diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/OldListsRouteADMFeatureE2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/CreateListItemsRouteADME2ESpec.scala similarity index 52% rename from webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/OldListsRouteADMFeatureE2ESpec.scala rename to webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/CreateListItemsRouteADME2ESpec.scala index d1111b8317..d34131d3dd 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/OldListsRouteADMFeatureE2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/CreateListItemsRouteADME2ESpec.scala @@ -31,7 +31,7 @@ import org.knora.webapi.util.MutableTestIri import scala.concurrent.Await import scala.concurrent.duration._ -object OldListsRouteADMFeatureE2ESpec { +object CreateListItemsRouteADME2ESpec { val config: Config = ConfigFactory.parseString(""" akka.loglevel = "DEBUG" akka.stdout-loglevel = "DEBUG" @@ -41,8 +41,8 @@ object OldListsRouteADMFeatureE2ESpec { /** * End-to-End (E2E) test specification for testing lists endpoint. */ -class OldListsRouteADMFeatureE2ESpec - extends E2ESpec(OldListsRouteADMFeatureE2ESpec.config) +class CreateListItemsRouteADME2ESpec + extends E2ESpec(CreateListItemsRouteADME2ESpec.config) with SessionJsonProtocol with TriplestoreJsonProtocol with ListADMJsonProtocol { @@ -60,16 +60,6 @@ class OldListsRouteADMFeatureE2ESpec RdfDataObject(path = "test_data/all_data/anything-data.ttl", name = "http://www.knora.org/data/0001/anything") ) - val rootCreds: CredentialsADM = CredentialsADM( - SharedTestDataADM.rootUser, - "test" - ) - - val normalUserCreds: CredentialsADM = CredentialsADM( - SharedTestDataADM.normalUser, - "test" - ) - val anythingUserCreds: CredentialsADM = CredentialsADM( SharedTestDataADM.anythingUser1, "test" @@ -80,9 +70,7 @@ class OldListsRouteADMFeatureE2ESpec "test" ) - private val treeListInfo: ListRootNodeInfoADM = SharedListsTestDataADM.treeListInfo - private val treeListNodes: Seq[ListChildNodeADM] = SharedListsTestDataADM.treeListChildNodes - private val customChildNodeIRI = "http://rdfh.ch/lists/0001/vQgijJZKSqawFooJPyhYkw" + private val customChildNodeIRI = "http://rdfh.ch/lists/0001/vQgijJZKSqawFooJPyhYkw" def addChildListNodeRequest(parentNodeIri: IRI, name: String, label: String, comment: String): String = s"""{ | "parentNodeIri": "$parentNodeIri", @@ -92,225 +80,8 @@ class OldListsRouteADMFeatureE2ESpec | "comments": [{ "value": "$comment", "language": "en"}] |}""".stripMargin - "The Lists Route (/admin/lists)" when { - "used to query information about lists" should { - "return all lists" in { - val request = - Get(baseApiUrl + s"/admin/lists") ~> addCredentials(BasicHttpCredentials(rootCreds.email, rootCreds.password)) - val response: HttpResponse = singleAwaitingRequest(request) - - response.status should be(StatusCodes.OK) - - val lists: Seq[ListNodeInfoADM] = - AkkaHttpUtils.httpResponseToJson(response).fields("lists").convertTo[Seq[ListNodeInfoADM]] - - // log.debug("lists: {}", lists) - - lists.size should be(9) - clientTestDataCollector.addFile( - TestDataFileContent( - filePath = TestDataFilePath( - directoryPath = clientTestDataPath, - filename = "get-lists-response", - fileExtension = "json" - ), - text = responseToString(response) - ) - ) - } - - "return all lists belonging to the images project" in { - val request = Get( - baseApiUrl + s"/admin/lists?projectIri=http%3A%2F%2Frdfh.ch%2Fprojects%2F00FF" - ) ~> addCredentials(rootCreds.basicHttpCredentials) - val response: HttpResponse = singleAwaitingRequest(request) - // log.debug(s"response: ${response.toString}") - - response.status should be(StatusCodes.OK) - - val lists: Seq[ListNodeInfoADM] = - AkkaHttpUtils.httpResponseToJson(response).fields("lists").convertTo[Seq[ListNodeInfoADM]] - - // log.debug("lists: {}", lists) - - lists.size should be(4) - - clientTestDataCollector.addFile( - TestDataFileContent( - filePath = TestDataFilePath( - directoryPath = clientTestDataPath, - filename = "get-image-project-lists-response", - fileExtension = "json" - ), - text = responseToString(response) - ) - ) - } - - "return all lists belonging to the anything project" in { - val request = Get( - baseApiUrl + s"/admin/lists?projectIri=http%3A%2F%2Frdfh.ch%2Fprojects%2F0001" - ) ~> addCredentials(rootCreds.basicHttpCredentials) - val response: HttpResponse = singleAwaitingRequest(request) - // log.debug(s"response: ${response.toString}") - - response.status should be(StatusCodes.OK) - - val lists: Seq[ListNodeInfoADM] = - AkkaHttpUtils.httpResponseToJson(response).fields("lists").convertTo[Seq[ListNodeInfoADM]] - - // log.debug("lists: {}", lists) - - lists.size should be(4) - - clientTestDataCollector.addFile( - TestDataFileContent( - filePath = TestDataFilePath( - directoryPath = clientTestDataPath, - filename = "get-anything-project-lists-response", - fileExtension = "json" - ), - text = responseToString(response) - ) - ) - } - - "return basic list information (w/o children)" in { - val request = Get( - baseApiUrl + s"/admin/lists/infos/http%3A%2F%2Frdfh.ch%2Flists%2F0001%2FtreeList" - ) ~> addCredentials(rootCreds.basicHttpCredentials) - val response: HttpResponse = singleAwaitingRequest(request) - // log.debug(s"response: ${response.toString}") - - response.status should be(StatusCodes.OK) - - val receivedListInfo: ListRootNodeInfoADM = - AkkaHttpUtils.httpResponseToJson(response).fields("listinfo").convertTo[ListRootNodeInfoADM] - - val expectedListInfo: ListRootNodeInfoADM = SharedListsTestDataADM.treeListInfo - - receivedListInfo.sorted should be(expectedListInfo.sorted) - - clientTestDataCollector.addFile( - TestDataFileContent( - filePath = TestDataFilePath( - directoryPath = clientTestDataPath, - filename = "get-list-info-response", - fileExtension = "json" - ), - text = responseToString(response) - ) - ) - } - - "return basic list information (w/o children) for new merged GET route" in { - // the same test as above, testing the new route - val request = Get( - baseApiUrl + s"/admin/lists/http%3A%2F%2Frdfh.ch%2Flists%2F0001%2FtreeList/info" - ) ~> addCredentials(rootCreds.basicHttpCredentials) - val response: HttpResponse = singleAwaitingRequest(request) - // log.debug(s"response: ${response.toString}") - - response.status should be(StatusCodes.OK) - - val receivedListInfo: ListRootNodeInfoADM = - AkkaHttpUtils.httpResponseToJson(response).fields("listinfo").convertTo[ListRootNodeInfoADM] - - val expectedListInfo: ListRootNodeInfoADM = SharedListsTestDataADM.treeListInfo - - receivedListInfo.sorted should be(expectedListInfo.sorted) - - clientTestDataCollector.addFile( - TestDataFileContent( - filePath = TestDataFilePath( - directoryPath = clientTestDataPath, - filename = "get-list-info-response-new-merged-get-route", - fileExtension = "json" - ), - text = responseToString(response) - ) - ) - } - - "return a complete list" in { - val request = Get( - baseApiUrl + s"/admin/lists/http%3A%2F%2Frdfh.ch%2Flists%2F0001%2FtreeList" - ) ~> addCredentials(rootCreds.basicHttpCredentials) - val response: HttpResponse = singleAwaitingRequest(request) - // println(s"response: ${response.toString}") - - response.status should be(StatusCodes.OK) - - val receivedList: ListADM = AkkaHttpUtils.httpResponseToJson(response).fields("list").convertTo[ListADM] - receivedList.listinfo.sorted should be(treeListInfo.sorted) - receivedList.children.map(_.sorted) should be(treeListNodes.map(_.sorted)) - - clientTestDataCollector.addFile( - TestDataFileContent( - filePath = TestDataFilePath( - directoryPath = clientTestDataPath, - filename = "get-list-response", - fileExtension = "json" - ), - text = responseToString(response) - ) - ) - } - - "return node info w/o children" in { - val request = Get( - baseApiUrl + s"/admin/lists/nodes/http%3A%2F%2Frdfh.ch%2Flists%2F0001%2FtreeList01" - ) ~> addCredentials(rootCreds.basicHttpCredentials) - val response: HttpResponse = singleAwaitingRequest(request) - // log.debug(s"response: ${response.toString}") - - response.status should be(StatusCodes.OK) - - val receivedListInfo: ListChildNodeInfoADM = - AkkaHttpUtils.httpResponseToJson(response).fields("nodeinfo").convertTo[ListChildNodeInfoADM] - - val expectedListInfo: ListChildNodeInfoADM = SharedListsTestDataADM.treeListNode01Info - - receivedListInfo.sorted should be(expectedListInfo.sorted) - - clientTestDataCollector.addFile( - TestDataFileContent( - filePath = TestDataFilePath( - directoryPath = clientTestDataPath, - filename = "get-list-node-info-response", - fileExtension = "json" - ), - text = responseToString(response) - ) - ) - } - - "return a complete node with children" in { - val request = Get( - baseApiUrl + s"/admin/lists/http%3A%2F%2Frdfh.ch%2Flists%2F0001%2FtreeList03" - ) ~> addCredentials(rootCreds.basicHttpCredentials) - val response: HttpResponse = singleAwaitingRequest(request) - response.status should be(StatusCodes.OK) - - val receivedNode: NodeADM = AkkaHttpUtils.httpResponseToJson(response).fields("node").convertTo[NodeADM] - receivedNode.nodeinfo.id should be("http://rdfh.ch/lists/0001/treeList03") - receivedNode.nodeinfo.name should be(Some("Tree list node 03")) - receivedNode.children.size should be(2) - - clientTestDataCollector.addFile( - TestDataFileContent( - filePath = TestDataFilePath( - directoryPath = clientTestDataPath, - filename = "get-node-response", - fileExtension = "json" - ), - text = responseToString(response) - ) - ) - } - } - - "given a custom Iri" should { + "The admin lists route (/admin/lists)" when { + "creating list items with a custom Iri" should { "create a list with the provided custom Iri" in { val createListWithCustomIriRequest: String = s"""{ @@ -412,7 +183,6 @@ class OldListsRouteADMFeatureE2ESpec HttpEntity(ContentTypes.`application/json`, createChildNodeWithCustomIriRequest) ) ~> addCredentials(anythingAdminUserCreds.basicHttpCredentials) val response: HttpResponse = singleAwaitingRequest(request) - // println(s"response: ${response.toString}") response.status should be(StatusCodes.OK) val received: ListNodeInfoADM = @@ -438,7 +208,7 @@ class OldListsRouteADMFeatureE2ESpec } } - "used to modify list information" should { + "used to create list items" should { val newListIri = new MutableTestIri val firstChildIri = new MutableTestIri val secondChildIri = new MutableTestIri @@ -531,7 +301,6 @@ class OldListsRouteADMFeatureE2ESpec val request01 = Post(baseApiUrl + s"/admin/lists", HttpEntity(ContentTypes.`application/json`, params01)) val response01: HttpResponse = singleAwaitingRequest(request01) - // println(s"response: ${response01.toString}") response01.status should be(StatusCodes.BadRequest) // invalid project IRI @@ -546,7 +315,6 @@ class OldListsRouteADMFeatureE2ESpec val request02 = Post(baseApiUrl + s"/admin/lists", HttpEntity(ContentTypes.`application/json`, params02)) val response02: HttpResponse = singleAwaitingRequest(request02) - // println(s"response: ${response02.toString}") response02.status should be(StatusCodes.BadRequest) // missing label @@ -561,250 +329,6 @@ class OldListsRouteADMFeatureE2ESpec val request03 = Post(baseApiUrl + s"/admin/lists", HttpEntity(ContentTypes.`application/json`, params03)) val response03: HttpResponse = singleAwaitingRequest(request03) - // println(s"response: ${response03.toString}") - response03.status should be(StatusCodes.BadRequest) - - } - - "update basic list information" in { - val updateListInfo: String = - s"""{ - | "listIri": "${newListIri.get}", - | "projectIri": "${SharedTestDataADM.ANYTHING_PROJECT_IRI}", - | "labels": [{ "value": "Neue geänderte Liste", "language": "de"}, { "value": "Changed list", "language": "en"}], - | "comments": [{ "value": "Neuer Kommentar", "language": "de"}, { "value": "New comment", "language": "en"}] - |}""".stripMargin - - clientTestDataCollector.addFile( - TestDataFileContent( - filePath = TestDataFilePath( - directoryPath = clientTestDataPath, - filename = "update-list-info-request", - fileExtension = "json" - ), - text = updateListInfo - ) - ) - val encodedListUrl = java.net.URLEncoder.encode(newListIri.get, "utf-8") - - val request = Put( - baseApiUrl + s"/admin/lists/" + encodedListUrl, - HttpEntity(ContentTypes.`application/json`, updateListInfo) - ) ~> addCredentials(anythingAdminUserCreds.basicHttpCredentials) - val response: HttpResponse = singleAwaitingRequest(request) - // log.debug(s"response: ${response.toString}") - response.status should be(StatusCodes.OK) - - val receivedListInfo: ListRootNodeInfoADM = - AkkaHttpUtils.httpResponseToJson(response).fields("listinfo").convertTo[ListRootNodeInfoADM] - - receivedListInfo.projectIri should be(SharedTestDataADM.ANYTHING_PROJECT_IRI) - - val labels: Seq[StringLiteralV2] = receivedListInfo.labels.stringLiterals - labels.size should be(2) - - val comments = receivedListInfo.comments.stringLiterals - comments.size should be(2) - - clientTestDataCollector.addFile( - TestDataFileContent( - filePath = TestDataFilePath( - directoryPath = clientTestDataPath, - filename = "update-list-info-response", - fileExtension = "json" - ), - text = responseToString(response) - ) - ) - } - - "update basic list information with a new name" in { - val updateListName = - s"""{ - | "listIri": "${newListIri.get}", - | "projectIri": "${SharedTestDataADM.ANYTHING_PROJECT_IRI}", - | "name": "a totally new name" - |}""".stripMargin - clientTestDataCollector.addFile( - TestDataFileContent( - filePath = TestDataFilePath( - directoryPath = clientTestDataPath, - filename = "update-list-name-request", - fileExtension = "json" - ), - text = updateListName - ) - ) - val encodedListUrl = java.net.URLEncoder.encode(newListIri.get, "utf-8") - - val request = Put( - baseApiUrl + s"/admin/lists/" + encodedListUrl, - HttpEntity(ContentTypes.`application/json`, updateListName) - ) ~> addCredentials(anythingAdminUserCreds.basicHttpCredentials) - val response: HttpResponse = singleAwaitingRequest(request) - // log.debug(s"response: ${response.toString}") - response.status should be(StatusCodes.OK) - - val receivedListInfo: ListRootNodeInfoADM = - AkkaHttpUtils.httpResponseToJson(response).fields("listinfo").convertTo[ListRootNodeInfoADM] - - receivedListInfo.projectIri should be(SharedTestDataADM.ANYTHING_PROJECT_IRI) - - receivedListInfo.name should be(Some("a totally new name")) - - clientTestDataCollector.addFile( - TestDataFileContent( - filePath = TestDataFilePath( - directoryPath = clientTestDataPath, - filename = "update-list-name-response", - fileExtension = "json" - ), - text = responseToString(response) - ) - ) - } - - "update basic list information with repeated comment and label in different languages" in { - val updateListInfoWithRepeatedCommentAndLabelValuesRequest: String = - s"""{ - | "listIri": "http://rdfh.ch/lists/0001/treeList", - | "projectIri": "${SharedTestDataADM.ANYTHING_PROJECT_IRI}", - | "labels": [ - | {"language": "en", "value": "Test List"}, - | {"language": "se", "value": "Test List"} - | ], - | "comments": [ - | {"language": "en", "value": "test"}, - | {"language": "de", "value": "test"}, - | {"language": "fr", "value": "test"}, - | {"language": "it", "value": "test"} - | ] - |}""".stripMargin - - clientTestDataCollector.addFile( - TestDataFileContent( - filePath = TestDataFilePath( - directoryPath = clientTestDataPath, - filename = "update-list-info-comment-label-multiple-languages-request", - fileExtension = "json" - ), - text = updateListInfoWithRepeatedCommentAndLabelValuesRequest - ) - ) - - val encodedListUrl = java.net.URLEncoder.encode("http://rdfh.ch/lists/0001/treeList", "utf-8") - - val request = Put( - baseApiUrl + s"/admin/lists/" + encodedListUrl, - HttpEntity(ContentTypes.`application/json`, updateListInfoWithRepeatedCommentAndLabelValuesRequest) - ) ~> addCredentials(anythingAdminUserCreds.basicHttpCredentials) - val response: HttpResponse = singleAwaitingRequest(request) - // log.debug(s"response: ${response.toString}") - response.status should be(StatusCodes.OK) - - val receivedListInfo: ListRootNodeInfoADM = - AkkaHttpUtils.httpResponseToJson(response).fields("listinfo").convertTo[ListRootNodeInfoADM] - - receivedListInfo.projectIri should be(SharedTestDataADM.ANYTHING_PROJECT_IRI) - - val labels: Seq[StringLiteralV2] = receivedListInfo.labels.stringLiterals - labels.size should be(2) - - val comments = receivedListInfo.comments.stringLiterals - comments.size should be(4) - - clientTestDataCollector.addFile( - TestDataFileContent( - filePath = TestDataFilePath( - directoryPath = clientTestDataPath, - filename = "update-list-info-comment-label-multiple-languages-response", - fileExtension = "json" - ), - text = responseToString(response) - ) - ) - } - - "return a ForbiddenException if the user updating the list is not project or system admin" in { - val params = - s""" - |{ - | "listIri": "${newListIri.get}", - | "projectIri": "${SharedTestDataADM.ANYTHING_PROJECT_IRI}", - | "labels": [{ "value": "Neue geönderte Liste", "language": "de"}, { "value": "Changed list", "language": "en"}], - | "comments": [{ "value": "Neuer Kommentar", "language": "de"}, { "value": "New comment", "language": "en"}] - |} - """.stripMargin - - val encodedListUrl = java.net.URLEncoder.encode(newListIri.get, "utf-8") - - val request = Put( - baseApiUrl + s"/admin/lists/" + encodedListUrl, - HttpEntity(ContentTypes.`application/json`, params) - ) ~> addCredentials(anythingUserCreds.basicHttpCredentials) - val response: HttpResponse = singleAwaitingRequest(request) - // log.debug(s"response: ${response.toString}") - response.status should be(StatusCodes.Forbidden) - } - - "return a BadRequestException during list change when payload is not correct" in { - val encodedListUrl = java.net.URLEncoder.encode(newListIri.get, "utf-8") - - // empty list IRI - val params01 = - s""" - |{ - | "listIri": "", - | "projectIri": "${SharedTestDataADM.ANYTHING_PROJECT_IRI}", - | "labels": [{ "value": "Neue geönderte Liste", "language": "de"}, { "value": "Changed list", "language": "en"}], - | "comments": [{ "value": "Neuer Kommentar", "language": "de"}, { "value": "New comment", "language": "en"}] - |} - """.stripMargin - - val request01 = Put( - baseApiUrl + s"/admin/lists/" + encodedListUrl, - HttpEntity(ContentTypes.`application/json`, params01) - ) ~> addCredentials(anythingAdminUserCreds.basicHttpCredentials) - val response01: HttpResponse = singleAwaitingRequest(request01) - // log.debug(s"response: ${response.toString}") - response01.status should be(StatusCodes.BadRequest) - - // empty project - val params02 = - s""" - |{ - | "listIri": "${newListIri.get}", - | "projectIri": "", - | "labels": [{ "value": "Neue geönderte Liste", "language": "de"}, { "value": "Changed list", "language": "en"}], - | "comments": [{ "value": "Neuer Kommentar", "language": "de"}, { "value": "New comment", "language": "en"}] - |} - """.stripMargin - - val request02 = Put( - baseApiUrl + s"/admin/lists/" + encodedListUrl, - HttpEntity(ContentTypes.`application/json`, params02) - ) ~> addCredentials(anythingAdminUserCreds.basicHttpCredentials) - val response02: HttpResponse = singleAwaitingRequest(request02) - // log.debug(s"response: ${response.toString}") - response02.status should be(StatusCodes.BadRequest) - - // empty parameters - val params03 = - s""" - |{ - | "listIri": "${newListIri.get}", - | "projectIri": "${SharedTestDataADM.ANYTHING_PROJECT_IRI}", - | "labels": [], - | "comments": [{ "value": "XXXXX", "language": "en"}] - |} - """.stripMargin - - val request03 = Put( - baseApiUrl + s"/admin/lists/" + encodedListUrl, - HttpEntity(ContentTypes.`application/json`, params03) - ) ~> addCredentials(anythingAdminUserCreds.basicHttpCredentials) - val response03: HttpResponse = singleAwaitingRequest(request03) - // log.debug(s"response: ${response.toString}") response03.status should be(StatusCodes.BadRequest) } @@ -839,7 +363,6 @@ class OldListsRouteADMFeatureE2ESpec HttpEntity(ContentTypes.`application/json`, addChildToRoot) ) ~> addCredentials(anythingAdminUserCreds.basicHttpCredentials) val response: HttpResponse = singleAwaitingRequest(request) - // println(s"response: ${response.toString}") response.status should be(StatusCodes.OK) val received: ListNodeInfoADM = @@ -909,7 +432,6 @@ class OldListsRouteADMFeatureE2ESpec HttpEntity(ContentTypes.`application/json`, addSecondChildToRoot) ) ~> addCredentials(anythingAdminUserCreds.basicHttpCredentials) val response: HttpResponse = singleAwaitingRequest(request) - // println(s"response: ${response.toString}") response.status should be(StatusCodes.OK) val received: ListNodeInfoADM = @@ -985,7 +507,6 @@ class OldListsRouteADMFeatureE2ESpec HttpEntity(ContentTypes.`application/json`, insertChild) ) ~> addCredentials(anythingAdminUserCreds.basicHttpCredentials) val response: HttpResponse = singleAwaitingRequest(request) - // println(s"response: ${response.toString}") response.status should be(StatusCodes.OK) val received: ListNodeInfoADM = @@ -1057,7 +578,6 @@ class OldListsRouteADMFeatureE2ESpec HttpEntity(ContentTypes.`application/json`, addChildToSecondChild) ) ~> addCredentials(anythingAdminUserCreds.basicHttpCredentials) val response: HttpResponse = singleAwaitingRequest(request) - // println(s"response: ${response.toString}") response.status should be(StatusCodes.OK) val received: ListNodeInfoADM = @@ -1100,56 +620,6 @@ class OldListsRouteADMFeatureE2ESpec ) ) } - - "update node information of a node that has custom IRI with a new name" in { - val newName = "modified third child" - val updateNodeName = - s"""{ - | "listIri": "$customChildNodeIRI", - | "projectIri": "${SharedTestDataADM.ANYTHING_PROJECT_IRI}", - | "name": "${newName}" - |}""".stripMargin - - clientTestDataCollector.addFile( - TestDataFileContent( - filePath = TestDataFilePath( - directoryPath = clientTestDataPath, - filename = "update-node-info-name-request", - fileExtension = "json" - ), - text = updateNodeName - ) - ) - - val encodedListUrl = java.net.URLEncoder.encode(customChildNodeIRI, "utf-8") - - val request = Put( - baseApiUrl + s"/admin/lists/" + encodedListUrl, - HttpEntity(ContentTypes.`application/json`, updateNodeName) - ) ~> addCredentials(anythingAdminUserCreds.basicHttpCredentials) - val response: HttpResponse = singleAwaitingRequest(request) - - response.status should be(StatusCodes.OK) - - val receivedNodeInfo: ListChildNodeInfoADM = - AkkaHttpUtils.httpResponseToJson(response).fields("nodeinfo").convertTo[ListChildNodeInfoADM] - receivedNodeInfo.name.get should be(newName) - - clientTestDataCollector.addFile( - TestDataFileContent( - filePath = TestDataFilePath( - directoryPath = clientTestDataPath, - filename = "update-node-info-name-response", - fileExtension = "json" - ), - text = responseToString(response) - ) - ) - } - - "add flat nodes" ignore {} - "add hierarchical nodes" ignore {} - "change node order" ignore {} } } } diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/DeleteListItemsRouteADME2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/DeleteListItemsRouteADME2ESpec.scala index f92bd7a015..10cf7f33d0 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/DeleteListItemsRouteADME2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/DeleteListItemsRouteADME2ESpec.scala @@ -74,11 +74,6 @@ class DeleteListItemsRouteADME2ESpec "test" ) - val normalUserCreds: CredentialsADM = CredentialsADM( - SharedTestDataADM.normalUser, - "test" - ) - val anythingUserCreds: CredentialsADM = CredentialsADM( SharedTestDataADM.anythingUser1, "test" @@ -89,10 +84,7 @@ class DeleteListItemsRouteADME2ESpec "test" ) - private val treeListInfo: ListRootNodeInfoADM = SharedListsTestDataADM.treeListInfo - private val treeListNodes: Seq[ListChildNodeADM] = SharedListsTestDataADM.treeListChildNodes - - "The List Items Route (/admin/lists)" when { + "The admin lists route (/admin/lists)" when { "deleting list items" should { "return forbidden exception when requesting user is not system or project admin" in { val encodedNodeUrl = java.net.URLEncoder.encode(SharedListsTestDataADM.otherTreeListInfo.id, "utf-8") @@ -153,23 +145,24 @@ class DeleteListItemsRouteADME2ESpec val children = node.getChildren children.size should be(0) } - } - "delete a list entirely with all its children" in { - val encodedNodeUrl = java.net.URLEncoder.encode("http://rdfh.ch/lists/0001/notUsedList", "utf-8") - val request = Delete(baseApiUrl + s"/admin/lists/" + encodedNodeUrl) ~> addCredentials( - BasicHttpCredentials(anythingAdminUserCreds.user.email, anythingAdminUserCreds.password) - ) - val response: HttpResponse = singleAwaitingRequest(request) - response.status should be(StatusCodes.OK) - val deletedStatus = AkkaHttpUtils.httpResponseToJson(response).fields("deleted") - deletedStatus.convertTo[Boolean] should be(true) + "delete a list entirely with all its children" in { + val encodedNodeUrl = java.net.URLEncoder.encode("http://rdfh.ch/lists/0001/notUsedList", "utf-8") + val request = Delete(baseApiUrl + s"/admin/lists/" + encodedNodeUrl) ~> addCredentials( + BasicHttpCredentials(anythingAdminUserCreds.user.email, anythingAdminUserCreds.password) + ) + val response: HttpResponse = singleAwaitingRequest(request) + response.status should be(StatusCodes.OK) + val deletedStatus = AkkaHttpUtils.httpResponseToJson(response).fields("deleted") + deletedStatus.convertTo[Boolean] should be(true) - collectClientTestData("delete-list-response", responseToString(response)) + collectClientTestData("delete-list-response", responseToString(response)) + } } + } - "Candeletelist route (/admin/lists/candelete)" when { + "The admin lists candelete route (/admin/lists/candelete)" when { "used to query if list can be deleted" should { "return positive response for unused list" in { val unusedList = "http://rdfh.ch/lists/0001/notUsedList" @@ -218,7 +211,7 @@ class DeleteListItemsRouteADME2ESpec } } - "DeleteListNodeComments route (/admin/lists/comments)" when { + "The admin lists comments route (/admin/lists/comments)" when { "deleting comments" should { "delete child node comments" in { val childNodeIri = "http://rdfh.ch/lists/0001/testList01" diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/GetListItemsRouteADME2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/GetListItemsRouteADME2ESpec.scala new file mode 100644 index 0000000000..738c304a72 --- /dev/null +++ b/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/GetListItemsRouteADME2ESpec.scala @@ -0,0 +1,275 @@ +/* + * Copyright © 2021 - 2022 Swiss National Data and Service Center for the Humanities and/or DaSCH Service Platform contributors. + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.knora.webapi.e2e.admin.lists + +import akka.actor.ActorSystem +import akka.http.scaladsl.model._ +import akka.http.scaladsl.model.headers._ +import akka.http.scaladsl.testkit.RouteTestTimeout +import akka.http.scaladsl.unmarshalling.Unmarshal +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory +import org.knora.webapi.E2ESpec +import org.knora.webapi.IRI +import org.knora.webapi.e2e.ClientTestDataCollector +import org.knora.webapi.e2e.TestDataFileContent +import org.knora.webapi.e2e.TestDataFilePath +import org.knora.webapi.messages.admin.responder.listsmessages._ +import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject +import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 +import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol +import org.knora.webapi.messages.v1.responder.sessionmessages.SessionJsonProtocol +import org.knora.webapi.messages.v1.routing.authenticationmessages.CredentialsADM +import org.knora.webapi.sharedtestdata.SharedListsTestDataADM +import org.knora.webapi.sharedtestdata.SharedTestDataADM +import org.knora.webapi.util.AkkaHttpUtils +import org.knora.webapi.util.MutableTestIri + +import scala.concurrent.Await +import scala.concurrent.duration._ + +object GetListItemsRouteADME2ESpec { + val config: Config = ConfigFactory.parseString(""" + akka.loglevel = "DEBUG" + akka.stdout-loglevel = "DEBUG" + """.stripMargin) +} + +/** + * End-to-End (E2E) test specification for testing lists endpoint. + */ +class GetListItemsRouteADME2ESpec + extends E2ESpec(GetListItemsRouteADME2ESpec.config) + with SessionJsonProtocol + with TriplestoreJsonProtocol + with ListADMJsonProtocol { + + implicit def default(implicit system: ActorSystem): RouteTestTimeout = RouteTestTimeout(5.seconds) + + // Directory path for generated client test data + private val clientTestDataPath: Seq[String] = Seq("admin", "lists") + + // Collects client test data + private val clientTestDataCollector = new ClientTestDataCollector(settings) + + override lazy val rdfDataObjects = List( + RdfDataObject(path = "test_data/demo_data/images-demo-data.ttl", name = "http://www.knora.org/data/00FF/images"), + RdfDataObject(path = "test_data/all_data/anything-data.ttl", name = "http://www.knora.org/data/0001/anything") + ) + + val rootCreds: CredentialsADM = CredentialsADM( + SharedTestDataADM.rootUser, + "test" + ) + + private val treeListInfo: ListRootNodeInfoADM = SharedListsTestDataADM.treeListInfo + private val treeListNodes: Seq[ListChildNodeADM] = SharedListsTestDataADM.treeListChildNodes + + "The admin lists route (/admin/lists)" should { + "return all lists" in { + val request = + Get(baseApiUrl + s"/admin/lists") ~> addCredentials(BasicHttpCredentials(rootCreds.email, rootCreds.password)) + val response: HttpResponse = singleAwaitingRequest(request) + + response.status should be(StatusCodes.OK) + + val lists: Seq[ListNodeInfoADM] = + AkkaHttpUtils.httpResponseToJson(response).fields("lists").convertTo[Seq[ListNodeInfoADM]] + + lists.size should be(9) + clientTestDataCollector.addFile( + TestDataFileContent( + filePath = TestDataFilePath( + directoryPath = clientTestDataPath, + filename = "get-lists-response", + fileExtension = "json" + ), + text = responseToString(response) + ) + ) + } + + "return all lists belonging to the images project" in { + val request = Get( + baseApiUrl + s"/admin/lists?projectIri=http%3A%2F%2Frdfh.ch%2Fprojects%2F00FF" + ) ~> addCredentials(rootCreds.basicHttpCredentials) + val response: HttpResponse = singleAwaitingRequest(request) + + response.status should be(StatusCodes.OK) + + val lists: Seq[ListNodeInfoADM] = + AkkaHttpUtils.httpResponseToJson(response).fields("lists").convertTo[Seq[ListNodeInfoADM]] + + lists.size should be(4) + + clientTestDataCollector.addFile( + TestDataFileContent( + filePath = TestDataFilePath( + directoryPath = clientTestDataPath, + filename = "get-image-project-lists-response", + fileExtension = "json" + ), + text = responseToString(response) + ) + ) + } + + "return all lists belonging to the anything project" in { + val request = Get( + baseApiUrl + s"/admin/lists?projectIri=http%3A%2F%2Frdfh.ch%2Fprojects%2F0001" + ) ~> addCredentials(rootCreds.basicHttpCredentials) + val response: HttpResponse = singleAwaitingRequest(request) + + response.status should be(StatusCodes.OK) + + val lists: Seq[ListNodeInfoADM] = + AkkaHttpUtils.httpResponseToJson(response).fields("lists").convertTo[Seq[ListNodeInfoADM]] + + lists.size should be(4) + + clientTestDataCollector.addFile( + TestDataFileContent( + filePath = TestDataFilePath( + directoryPath = clientTestDataPath, + filename = "get-anything-project-lists-response", + fileExtension = "json" + ), + text = responseToString(response) + ) + ) + } + + "return basic list information (w/o children)" in { + val request = Get( + baseApiUrl + s"/admin/lists/infos/http%3A%2F%2Frdfh.ch%2Flists%2F0001%2FtreeList" + ) ~> addCredentials(rootCreds.basicHttpCredentials) + val response: HttpResponse = singleAwaitingRequest(request) + + response.status should be(StatusCodes.OK) + + val receivedListInfo: ListRootNodeInfoADM = + AkkaHttpUtils.httpResponseToJson(response).fields("listinfo").convertTo[ListRootNodeInfoADM] + + val expectedListInfo: ListRootNodeInfoADM = SharedListsTestDataADM.treeListInfo + + receivedListInfo.sorted should be(expectedListInfo.sorted) + + clientTestDataCollector.addFile( + TestDataFileContent( + filePath = TestDataFilePath( + directoryPath = clientTestDataPath, + filename = "get-list-info-response", + fileExtension = "json" + ), + text = responseToString(response) + ) + ) + } + + "return basic list information (w/o children) for new merged GET route" in { + // the same test as above, testing the new route + val request = Get( + baseApiUrl + s"/admin/lists/http%3A%2F%2Frdfh.ch%2Flists%2F0001%2FtreeList/info" + ) ~> addCredentials(rootCreds.basicHttpCredentials) + val response: HttpResponse = singleAwaitingRequest(request) + + response.status should be(StatusCodes.OK) + + val receivedListInfo: ListRootNodeInfoADM = + AkkaHttpUtils.httpResponseToJson(response).fields("listinfo").convertTo[ListRootNodeInfoADM] + + val expectedListInfo: ListRootNodeInfoADM = SharedListsTestDataADM.treeListInfo + + receivedListInfo.sorted should be(expectedListInfo.sorted) + + clientTestDataCollector.addFile( + TestDataFileContent( + filePath = TestDataFilePath( + directoryPath = clientTestDataPath, + filename = "get-list-info-response-new-merged-get-route", + fileExtension = "json" + ), + text = responseToString(response) + ) + ) + } + + "return a complete list" in { + val request = Get( + baseApiUrl + s"/admin/lists/http%3A%2F%2Frdfh.ch%2Flists%2F0001%2FtreeList" + ) ~> addCredentials(rootCreds.basicHttpCredentials) + val response: HttpResponse = singleAwaitingRequest(request) + + response.status should be(StatusCodes.OK) + + val receivedList: ListADM = AkkaHttpUtils.httpResponseToJson(response).fields("list").convertTo[ListADM] + receivedList.listinfo.sorted should be(treeListInfo.sorted) + receivedList.children.map(_.sorted) should be(treeListNodes.map(_.sorted)) + + clientTestDataCollector.addFile( + TestDataFileContent( + filePath = TestDataFilePath( + directoryPath = clientTestDataPath, + filename = "get-list-response", + fileExtension = "json" + ), + text = responseToString(response) + ) + ) + } + + "return node info w/o children" in { + val request = Get( + baseApiUrl + s"/admin/lists/nodes/http%3A%2F%2Frdfh.ch%2Flists%2F0001%2FtreeList01" + ) ~> addCredentials(rootCreds.basicHttpCredentials) + val response: HttpResponse = singleAwaitingRequest(request) + + response.status should be(StatusCodes.OK) + + val receivedListInfo: ListChildNodeInfoADM = + AkkaHttpUtils.httpResponseToJson(response).fields("nodeinfo").convertTo[ListChildNodeInfoADM] + + val expectedListInfo: ListChildNodeInfoADM = SharedListsTestDataADM.treeListNode01Info + + receivedListInfo.sorted should be(expectedListInfo.sorted) + + clientTestDataCollector.addFile( + TestDataFileContent( + filePath = TestDataFilePath( + directoryPath = clientTestDataPath, + filename = "get-list-node-info-response", + fileExtension = "json" + ), + text = responseToString(response) + ) + ) + } + + "return a complete node with children" in { + val request = Get( + baseApiUrl + s"/admin/lists/http%3A%2F%2Frdfh.ch%2Flists%2F0001%2FtreeList03" + ) ~> addCredentials(rootCreds.basicHttpCredentials) + val response: HttpResponse = singleAwaitingRequest(request) + response.status should be(StatusCodes.OK) + + val receivedNode: NodeADM = AkkaHttpUtils.httpResponseToJson(response).fields("node").convertTo[NodeADM] + receivedNode.nodeinfo.id should be("http://rdfh.ch/lists/0001/treeList03") + receivedNode.nodeinfo.name should be(Some("Tree list node 03")) + receivedNode.children.size should be(2) + + clientTestDataCollector.addFile( + TestDataFileContent( + filePath = TestDataFilePath( + directoryPath = clientTestDataPath, + filename = "get-node-response", + fileExtension = "json" + ), + text = responseToString(response) + ) + ) + } + } +} diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/UpdateListItemsRouteADME2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/UpdateListItemsRouteADME2ESpec.scala index 1fa1303e56..a3cee7606b 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/UpdateListItemsRouteADME2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/UpdateListItemsRouteADME2ESpec.scala @@ -82,8 +82,8 @@ class UpdateListItemsRouteADME2ESpec private val treeListNodes: Seq[ListChildNodeADM] = SharedListsTestDataADM.treeListChildNodes private val treeChildNode = treeListNodes.head - "The List Items Route (/admin/lists)" when { - "update list root" should { + "The admin lists route (/admin/lists)" when { + "updating list root node" should { "update only node name" in { val updateNodeName = s"""{ @@ -229,7 +229,6 @@ class UpdateListItemsRouteADME2ESpec HttpEntity(ContentTypes.`application/json`, deleteComments) ) ~> addCredentials(anythingAdminUserCreds.basicHttpCredentials) val response: HttpResponse = singleAwaitingRequest(request) -// log.debug(s"response: ${response.toString}") response.status should be(StatusCodes.BadRequest) } } From 91584b0183cad516a1f489d2ad5766378d8bc98e Mon Sep 17 00:00:00 2001 From: irinaschubert Date: Thu, 25 Aug 2022 15:58:27 +0200 Subject: [PATCH 04/10] remove unused imports --- .../routing/admin/lists/CreateListItemsRouteADM.scala | 1 - .../webapi/routing/admin/lists/GetListItemsRouteADM.scala | 8 -------- .../routing/admin/lists/UpdateListItemsRouteADM.scala | 3 --- .../scala/org/knora/webapi/settings/KnoraSettings.scala | 1 - .../e2e/admin/lists/CreateListItemsRouteADME2ESpec.scala | 5 ----- .../e2e/admin/lists/GetListItemsRouteADME2ESpec.scala | 5 ----- 6 files changed, 23 deletions(-) diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/CreateListItemsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/CreateListItemsRouteADM.scala index d70f1b9a63..30e78f3018 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/CreateListItemsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/CreateListItemsRouteADM.scala @@ -9,7 +9,6 @@ import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.PathMatcher import akka.http.scaladsl.server.Route import io.swagger.annotations._ -import org.knora.webapi.IRI import dsp.errors.BadRequestException import dsp.errors.ForbiddenException diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/GetListItemsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/GetListItemsRouteADM.scala index d8fa32b68b..e829030d72 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/GetListItemsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/GetListItemsRouteADM.scala @@ -11,23 +11,15 @@ import akka.http.scaladsl.server.Route import io.swagger.annotations._ import org.knora.webapi.IRI import dsp.errors.BadRequestException -import dsp.errors.ForbiddenException -import org.knora.webapi.messages.admin.responder.listsmessages.ListNodeCreatePayloadADM.ListChildNodeCreatePayloadADM -import org.knora.webapi.messages.admin.responder.listsmessages.ListNodeCreatePayloadADM.ListRootNodeCreatePayloadADM import org.knora.webapi.messages.admin.responder.listsmessages._ 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 zio.prelude.Validation -import java.util.UUID import javax.ws.rs.Path import scala.concurrent.Future -import dsp.valueobjects.Iri._ -import dsp.valueobjects.List._ -import dsp.valueobjects.ListErrorMessages object GetListItemsRouteADM { val ListsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "lists") diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala index 84a45bddaf..10606fdb00 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala @@ -10,12 +10,9 @@ import akka.http.scaladsl.server.PathMatcher import akka.http.scaladsl.server.Route import io.swagger.annotations._ -import java.util.UUID import javax.ws.rs.Path -import scala.concurrent.Future import dsp.errors.BadRequestException -import dsp.valueobjects.List._ import org.knora.webapi.messages.admin.responder.listsmessages._ import org.knora.webapi.routing.Authenticator import org.knora.webapi.routing.KnoraRoute diff --git a/webapi/src/main/scala/org/knora/webapi/settings/KnoraSettings.scala b/webapi/src/main/scala/org/knora/webapi/settings/KnoraSettings.scala index 63ba4971fc..7fbfa12f28 100644 --- a/webapi/src/main/scala/org/knora/webapi/settings/KnoraSettings.scala +++ b/webapi/src/main/scala/org/knora/webapi/settings/KnoraSettings.scala @@ -18,7 +18,6 @@ import com.typesafe.scalalogging.Logger import dsp.errors.FileWriteException import dsp.valueobjects.User import org.knora.webapi.util.cache.CacheUtil.KnoraCacheConfig -import zio.prelude.ZValidation import java.nio.file.Files import java.nio.file.Path diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/CreateListItemsRouteADME2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/CreateListItemsRouteADME2ESpec.scala index b73205f65d..0d4593b27c 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/CreateListItemsRouteADME2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/CreateListItemsRouteADME2ESpec.scala @@ -7,15 +7,11 @@ package org.knora.webapi.e2e.admin.lists import akka.actor.ActorSystem import akka.http.scaladsl.model._ -import akka.http.scaladsl.model.headers._ import akka.http.scaladsl.testkit.RouteTestTimeout import akka.http.scaladsl.unmarshalling.Unmarshal import com.typesafe.config.Config import com.typesafe.config.ConfigFactory -import scala.concurrent.Await -import scala.concurrent.duration._ - import org.knora.webapi.E2ESpec import org.knora.webapi.IRI import org.knora.webapi.e2e.ClientTestDataCollector @@ -27,7 +23,6 @@ import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol import org.knora.webapi.messages.v1.responder.sessionmessages.SessionJsonProtocol import org.knora.webapi.messages.v1.routing.authenticationmessages.CredentialsADM -import org.knora.webapi.sharedtestdata.SharedListsTestDataADM import org.knora.webapi.sharedtestdata.SharedTestDataADM import org.knora.webapi.util.AkkaHttpUtils import org.knora.webapi.util.MutableTestIri diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/GetListItemsRouteADME2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/GetListItemsRouteADME2ESpec.scala index 738c304a72..1f46a0f533 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/GetListItemsRouteADME2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/GetListItemsRouteADME2ESpec.scala @@ -9,26 +9,21 @@ import akka.actor.ActorSystem import akka.http.scaladsl.model._ import akka.http.scaladsl.model.headers._ import akka.http.scaladsl.testkit.RouteTestTimeout -import akka.http.scaladsl.unmarshalling.Unmarshal import com.typesafe.config.Config import com.typesafe.config.ConfigFactory import org.knora.webapi.E2ESpec -import org.knora.webapi.IRI import org.knora.webapi.e2e.ClientTestDataCollector import org.knora.webapi.e2e.TestDataFileContent import org.knora.webapi.e2e.TestDataFilePath import org.knora.webapi.messages.admin.responder.listsmessages._ import org.knora.webapi.messages.store.triplestoremessages.RdfDataObject -import org.knora.webapi.messages.store.triplestoremessages.StringLiteralV2 import org.knora.webapi.messages.store.triplestoremessages.TriplestoreJsonProtocol import org.knora.webapi.messages.v1.responder.sessionmessages.SessionJsonProtocol import org.knora.webapi.messages.v1.routing.authenticationmessages.CredentialsADM import org.knora.webapi.sharedtestdata.SharedListsTestDataADM import org.knora.webapi.sharedtestdata.SharedTestDataADM import org.knora.webapi.util.AkkaHttpUtils -import org.knora.webapi.util.MutableTestIri -import scala.concurrent.Await import scala.concurrent.duration._ object GetListItemsRouteADME2ESpec { From 1b28f94667eb24c78f59fc582691e44f313c3ef1 Mon Sep 17 00:00:00 2001 From: irinaschubert Date: Thu, 25 Aug 2022 16:08:38 +0200 Subject: [PATCH 05/10] fix formatting --- .../admin/lists/CreateListItemsRouteADM.scala | 18 +++++++++--------- .../admin/lists/GetListItemsRouteADM.scala | 10 +++++----- .../admin/lists/UpdateListItemsRouteADM.scala | 16 +++++++--------- .../knora/webapi/settings/KnoraSettings.scala | 8 ++++---- .../lists/CreateListItemsRouteADME2ESpec.scala | 6 +++--- .../lists/GetListItemsRouteADME2ESpec.scala | 5 +++-- 6 files changed, 31 insertions(+), 32 deletions(-) diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/CreateListItemsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/CreateListItemsRouteADM.scala index 30e78f3018..4d8e9efb34 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/CreateListItemsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/CreateListItemsRouteADM.scala @@ -9,9 +9,17 @@ import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.PathMatcher import akka.http.scaladsl.server.Route import io.swagger.annotations._ +import zio.prelude.Validation + +import java.util.UUID +import javax.ws.rs.Path +import scala.concurrent.Future + import dsp.errors.BadRequestException import dsp.errors.ForbiddenException - +import dsp.valueobjects.Iri._ +import dsp.valueobjects.List._ +import dsp.valueobjects.ListErrorMessages import org.knora.webapi.messages.admin.responder.listsmessages.ListNodeCreatePayloadADM.ListChildNodeCreatePayloadADM import org.knora.webapi.messages.admin.responder.listsmessages.ListNodeCreatePayloadADM.ListRootNodeCreatePayloadADM import org.knora.webapi.messages.admin.responder.listsmessages._ @@ -19,14 +27,6 @@ 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 zio.prelude.Validation - -import java.util.UUID -import javax.ws.rs.Path -import scala.concurrent.Future -import dsp.valueobjects.Iri._ -import dsp.valueobjects.List._ -import dsp.valueobjects.ListErrorMessages object CreateListItemsRouteADM { val ListsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "lists") diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/GetListItemsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/GetListItemsRouteADM.scala index e829030d72..69d8377f49 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/GetListItemsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/GetListItemsRouteADM.scala @@ -9,18 +9,18 @@ import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.PathMatcher import akka.http.scaladsl.server.Route import io.swagger.annotations._ -import org.knora.webapi.IRI -import dsp.errors.BadRequestException +import javax.ws.rs.Path +import scala.concurrent.Future + +import dsp.errors.BadRequestException +import org.knora.webapi.IRI import org.knora.webapi.messages.admin.responder.listsmessages._ 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 javax.ws.rs.Path -import scala.concurrent.Future - object GetListItemsRouteADM { val ListsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "lists") } diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala index 10606fdb00..a94aa4d211 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala @@ -9,25 +9,23 @@ import akka.http.scaladsl.server.Directives._ import akka.http.scaladsl.server.PathMatcher import akka.http.scaladsl.server.Route import io.swagger.annotations._ +import zio.prelude.Validation +import java.util.UUID import javax.ws.rs.Path +import scala.concurrent.Future import dsp.errors.BadRequestException +import dsp.errors.ForbiddenException +import dsp.valueobjects.Iri._ +import dsp.valueobjects.List._ +import dsp.valueobjects.ListErrorMessages import org.knora.webapi.messages.admin.responder.listsmessages._ 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 java.util.UUID -import javax.ws.rs.Path -import scala.concurrent.Future -import dsp.valueobjects.List._ -import zio.prelude.Validation -import dsp.valueobjects.Iri._ -import dsp.valueobjects.ListErrorMessages -import dsp.errors.ForbiddenException - object UpdateListItemsRouteADM { val ListsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "lists") } diff --git a/webapi/src/main/scala/org/knora/webapi/settings/KnoraSettings.scala b/webapi/src/main/scala/org/knora/webapi/settings/KnoraSettings.scala index 7fbfa12f28..4391b2f276 100644 --- a/webapi/src/main/scala/org/knora/webapi/settings/KnoraSettings.scala +++ b/webapi/src/main/scala/org/knora/webapi/settings/KnoraSettings.scala @@ -15,16 +15,16 @@ import com.typesafe.config.Config import com.typesafe.config.ConfigValue import com.typesafe.scalalogging.Logger -import dsp.errors.FileWriteException -import dsp.valueobjects.User -import org.knora.webapi.util.cache.CacheUtil.KnoraCacheConfig - import java.nio.file.Files import java.nio.file.Path import java.nio.file.Paths import scala.concurrent.duration._ import scala.jdk.CollectionConverters._ +import dsp.errors.FileWriteException +import dsp.valueobjects.User +import org.knora.webapi.util.cache.CacheUtil.KnoraCacheConfig + /** * Reads application settings that come from `application.conf`. */ diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/CreateListItemsRouteADME2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/CreateListItemsRouteADME2ESpec.scala index 0d4593b27c..69a051a275 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/CreateListItemsRouteADME2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/CreateListItemsRouteADME2ESpec.scala @@ -12,6 +12,9 @@ import akka.http.scaladsl.unmarshalling.Unmarshal import com.typesafe.config.Config import com.typesafe.config.ConfigFactory +import scala.concurrent.Await +import scala.concurrent.duration._ + import org.knora.webapi.E2ESpec import org.knora.webapi.IRI import org.knora.webapi.e2e.ClientTestDataCollector @@ -27,9 +30,6 @@ import org.knora.webapi.sharedtestdata.SharedTestDataADM import org.knora.webapi.util.AkkaHttpUtils import org.knora.webapi.util.MutableTestIri -import scala.concurrent.Await -import scala.concurrent.duration._ - object CreateListItemsRouteADME2ESpec { val config: Config = ConfigFactory.parseString(""" akka.loglevel = "DEBUG" diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/GetListItemsRouteADME2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/GetListItemsRouteADME2ESpec.scala index 1f46a0f533..1bb2274bea 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/GetListItemsRouteADME2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/GetListItemsRouteADME2ESpec.scala @@ -11,6 +11,9 @@ import akka.http.scaladsl.model.headers._ import akka.http.scaladsl.testkit.RouteTestTimeout import com.typesafe.config.Config import com.typesafe.config.ConfigFactory + +import scala.concurrent.duration._ + import org.knora.webapi.E2ESpec import org.knora.webapi.e2e.ClientTestDataCollector import org.knora.webapi.e2e.TestDataFileContent @@ -24,8 +27,6 @@ import org.knora.webapi.sharedtestdata.SharedListsTestDataADM import org.knora.webapi.sharedtestdata.SharedTestDataADM import org.knora.webapi.util.AkkaHttpUtils -import scala.concurrent.duration._ - object GetListItemsRouteADME2ESpec { val config: Config = ConfigFactory.parseString(""" akka.loglevel = "DEBUG" From 46773b00768b118df0d9aa49295f0d9fce9a75c5 Mon Sep 17 00:00:00 2001 From: irinaschubert Date: Thu, 25 Aug 2022 16:48:38 +0200 Subject: [PATCH 06/10] refactor unnecessary companion objects in routes --- .../org/knora/webapi/routing/admin/GroupsRouteADM.scala | 6 +----- .../org/knora/webapi/routing/admin/ProjectsRouteADM.scala | 6 +----- .../org/knora/webapi/routing/admin/UsersRouteADM.scala | 6 +----- .../routing/admin/lists/CreateListItemsRouteADM.scala | 6 +----- .../routing/admin/lists/DeleteListItemsRouteADM.scala | 6 +----- .../webapi/routing/admin/lists/GetListItemsRouteADM.scala | 6 +----- .../routing/admin/lists/UpdateListItemsRouteADM.scala | 6 +----- .../admin/permissions/CreatePermissionRouteADM.scala | 6 +----- .../admin/permissions/DeletePermissionRouteADM.scala | 6 +----- .../routing/admin/permissions/GetPermissionsRouteADM.scala | 6 +----- .../admin/permissions/UpdatePermissionRouteADM.scala | 6 +----- .../org/knora/webapi/routing/v2/OntologiesRouteV2.scala | 6 +----- .../org/knora/webapi/routing/v2/ResourcesRouteV2.scala | 6 +----- .../scala/org/knora/webapi/routing/v2/ValuesRouteV2.scala | 6 +----- 14 files changed, 14 insertions(+), 70 deletions(-) diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/GroupsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/GroupsRouteADM.scala index 2ecdd5b1e7..84c627462e 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/GroupsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/GroupsRouteADM.scala @@ -23,10 +23,6 @@ import org.knora.webapi.routing.KnoraRoute import org.knora.webapi.routing.KnoraRouteData import org.knora.webapi.routing.RouteUtilADM -object GroupsRouteADM { - val GroupsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "groups") -} - /** * Provides a routing function for API routes that deal with groups. */ @@ -38,7 +34,7 @@ class GroupsRouteADM(routeData: KnoraRouteData) with Authenticator with GroupsADMJsonProtocol { - import GroupsRouteADM._ + val GroupsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "groups") override def makeRoute(): Route = getGroups() ~ diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/ProjectsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/ProjectsRouteADM.scala index 49694d80b1..3c70192ea4 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/ProjectsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/ProjectsRouteADM.scala @@ -38,10 +38,6 @@ import org.knora.webapi.routing.KnoraRoute import org.knora.webapi.routing.KnoraRouteData import org.knora.webapi.routing.RouteUtilADM -object ProjectsRouteADM { - val ProjectsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "projects") -} - @Api(value = "projects", produces = "application/json") @Path("/admin/projects") class ProjectsRouteADM(routeData: KnoraRouteData) @@ -49,7 +45,7 @@ class ProjectsRouteADM(routeData: KnoraRouteData) with Authenticator with ProjectsADMJsonProtocol { - import ProjectsRouteADM._ + val ProjectsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "projects") /** * Returns the route. diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/UsersRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/UsersRouteADM.scala index 5bf65d2ab0..70b229f282 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/UsersRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/UsersRouteADM.scala @@ -28,10 +28,6 @@ import org.knora.webapi.routing.KnoraRoute import org.knora.webapi.routing.KnoraRouteData import org.knora.webapi.routing.RouteUtilADM -object UsersRouteADM { - val UsersBasePath: PathMatcher[Unit] = PathMatcher("admin" / "users") -} - /** * Provides an akka-http-routing function for API routes that deal with users. */ @@ -39,7 +35,7 @@ object UsersRouteADM { @Path("/admin/users") class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) with Authenticator { - import UsersRouteADM._ + val UsersBasePath: PathMatcher[Unit] = PathMatcher("admin" / "users") /** * Returns the route. diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/CreateListItemsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/CreateListItemsRouteADM.scala index 4d8e9efb34..1988a35924 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/CreateListItemsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/CreateListItemsRouteADM.scala @@ -28,10 +28,6 @@ import org.knora.webapi.routing.KnoraRoute import org.knora.webapi.routing.KnoraRouteData import org.knora.webapi.routing.RouteUtilADM -object CreateListItemsRouteADM { - val ListsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "lists") -} - /** * Provides routes to create list items. * @@ -44,7 +40,7 @@ class CreateListItemsRouteADM(routeData: KnoraRouteData) with Authenticator with ListADMJsonProtocol { - import CreateListItemsRouteADM._ + val ListsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "lists") def makeRoute(): Route = createListRootNode() ~ diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/DeleteListItemsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/DeleteListItemsRouteADM.scala index 69dc038bd7..74a24a5cb9 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/DeleteListItemsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/DeleteListItemsRouteADM.scala @@ -19,10 +19,6 @@ import org.knora.webapi.routing.KnoraRoute import org.knora.webapi.routing.KnoraRouteData import org.knora.webapi.routing.RouteUtilADM -object DeleteListItemsRouteADM { - val ListsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "lists") -} - /** * Provides routes to delete list items. * @@ -33,7 +29,7 @@ class DeleteListItemsRouteADM(routeData: KnoraRouteData) with Authenticator with ListADMJsonProtocol { - import DeleteListItemsRouteADM._ + val ListsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "lists") def makeRoute(): Route = deleteListItem() ~ diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/GetListItemsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/GetListItemsRouteADM.scala index 69d8377f49..e15cea5bce 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/GetListItemsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/GetListItemsRouteADM.scala @@ -21,10 +21,6 @@ import org.knora.webapi.routing.KnoraRoute import org.knora.webapi.routing.KnoraRouteData import org.knora.webapi.routing.RouteUtilADM -object GetListItemsRouteADM { - val ListsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "lists") -} - /** * Provides routes to get list items. * @@ -37,7 +33,7 @@ class GetListItemsRouteADM(routeData: KnoraRouteData) with Authenticator with ListADMJsonProtocol { - import GetListItemsRouteADM._ + val ListsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "lists") def makeRoute(): Route = getLists() ~ diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala index a94aa4d211..c613967d04 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala @@ -26,10 +26,6 @@ import org.knora.webapi.routing.KnoraRoute import org.knora.webapi.routing.KnoraRouteData import org.knora.webapi.routing.RouteUtilADM -object UpdateListItemsRouteADM { - val ListsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "lists") -} - /** * Provides routes to update list items. * @@ -40,7 +36,7 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) with Authenticator with ListADMJsonProtocol { - import UpdateListItemsRouteADM._ + val ListsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "lists") def makeRoute(): Route = updateNodeName() ~ diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/CreatePermissionRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/CreatePermissionRouteADM.scala index 32dd4659ab..a3d02bb9d9 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/CreatePermissionRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/CreatePermissionRouteADM.scala @@ -20,10 +20,6 @@ import org.knora.webapi.routing.KnoraRoute import org.knora.webapi.routing.KnoraRouteData import org.knora.webapi.routing.RouteUtilADM -object CreatePermissionRouteADM { - val PermissionsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "permissions") -} - @Api(value = "permissions", produces = "application/json") @Path("/admin/permissions") class CreatePermissionRouteADM(routeData: KnoraRouteData) @@ -31,7 +27,7 @@ class CreatePermissionRouteADM(routeData: KnoraRouteData) with Authenticator with PermissionsADMJsonProtocol { - import CreatePermissionRouteADM._ + val PermissionsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "permissions") /** * Returns the route. diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/DeletePermissionRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/DeletePermissionRouteADM.scala index e5620941cf..2339a3b4ab 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/DeletePermissionRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/DeletePermissionRouteADM.scala @@ -19,10 +19,6 @@ import org.knora.webapi.routing.KnoraRoute import org.knora.webapi.routing.KnoraRouteData import org.knora.webapi.routing.RouteUtilADM -object DeletePermissionRouteADM { - val PermissionsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "permissions") -} - @Api(value = "permissions", produces = "application/json") @Path("/admin/permissions") class DeletePermissionRouteADM(routeData: KnoraRouteData) @@ -30,7 +26,7 @@ class DeletePermissionRouteADM(routeData: KnoraRouteData) with Authenticator with PermissionsADMJsonProtocol { - import DeletePermissionRouteADM._ + val PermissionsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "permissions") /** * Returns the route. diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/GetPermissionsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/GetPermissionsRouteADM.scala index 12490567a4..b5f40de2f3 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/GetPermissionsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/GetPermissionsRouteADM.scala @@ -19,10 +19,6 @@ import org.knora.webapi.routing.KnoraRoute import org.knora.webapi.routing.KnoraRouteData import org.knora.webapi.routing.RouteUtilADM -object GetPermissionsRouteADM { - val PermissionsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "permissions") -} - @Api(value = "permissions", produces = "application/json") @Path("/admin/permissions") class GetPermissionsRouteADM(routeData: KnoraRouteData) @@ -30,7 +26,7 @@ class GetPermissionsRouteADM(routeData: KnoraRouteData) with Authenticator with PermissionsADMJsonProtocol { - import GetPermissionsRouteADM._ + val PermissionsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "permissions") /** * Returns the route. diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/UpdatePermissionRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/UpdatePermissionRouteADM.scala index f92c56ab4f..e952eef859 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/UpdatePermissionRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/UpdatePermissionRouteADM.scala @@ -20,10 +20,6 @@ import org.knora.webapi.routing.KnoraRoute import org.knora.webapi.routing.KnoraRouteData import org.knora.webapi.routing.RouteUtilADM -object UpdatePermissionRouteADM { - val PermissionsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "permissions") -} - @Api(value = "permissions", produces = "application/json") @Path("/admin/permissions") class UpdatePermissionRouteADM(routeData: KnoraRouteData) @@ -31,7 +27,7 @@ class UpdatePermissionRouteADM(routeData: KnoraRouteData) with Authenticator with PermissionsADMJsonProtocol { - import UpdatePermissionRouteADM._ + val PermissionsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "permissions") /** * Returns the route. diff --git a/webapi/src/main/scala/org/knora/webapi/routing/v2/OntologiesRouteV2.scala b/webapi/src/main/scala/org/knora/webapi/routing/v2/OntologiesRouteV2.scala index d6c62250e4..2d412c71e9 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/v2/OntologiesRouteV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/v2/OntologiesRouteV2.scala @@ -37,16 +37,12 @@ import org.knora.webapi.routing.KnoraRoute import org.knora.webapi.routing.KnoraRouteData import org.knora.webapi.routing.RouteUtilV2 -object OntologiesRouteV2 { - val OntologiesBasePath: PathMatcher[Unit] = PathMatcher("v2" / "ontologies") -} - /** * Provides a routing function for API v2 routes that deal with ontologies. */ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) with Authenticator { - import OntologiesRouteV2._ + val OntologiesBasePath: PathMatcher[Unit] = PathMatcher("v2" / "ontologies") private val ALL_LANGUAGES = "allLanguages" private val LAST_MODIFICATION_DATE = "lastModificationDate" diff --git a/webapi/src/main/scala/org/knora/webapi/routing/v2/ResourcesRouteV2.scala b/webapi/src/main/scala/org/knora/webapi/routing/v2/ResourcesRouteV2.scala index 63c8127da3..d0e2e62d0b 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/v2/ResourcesRouteV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/v2/ResourcesRouteV2.scala @@ -27,16 +27,12 @@ import org.knora.webapi.routing.KnoraRoute import org.knora.webapi.routing.KnoraRouteData import org.knora.webapi.routing.RouteUtilV2 -object ResourcesRouteV2 { - val ResourcesBasePath: PathMatcher[Unit] = PathMatcher("v2" / "resources") -} - /** * Provides a routing function for API v2 routes that deal with resources. */ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) with Authenticator { - import ResourcesRouteV2._ + val ResourcesBasePath: PathMatcher[Unit] = PathMatcher("v2" / "resources") private val Text_Property = "textProperty" private val Mapping_Iri = "mappingIri" diff --git a/webapi/src/main/scala/org/knora/webapi/routing/v2/ValuesRouteV2.scala b/webapi/src/main/scala/org/knora/webapi/routing/v2/ValuesRouteV2.scala index 19a928dd92..4378d280f6 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/v2/ValuesRouteV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/v2/ValuesRouteV2.scala @@ -26,16 +26,12 @@ import org.knora.webapi.routing.KnoraRoute import org.knora.webapi.routing.KnoraRouteData import org.knora.webapi.routing.RouteUtilV2 -object ValuesRouteV2 { - val ValuesBasePath: PathMatcher[Unit] = PathMatcher("v2" / "values") -} - /** * Provides a routing function for API v2 routes that deal with values. */ class ValuesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) with Authenticator { - import ValuesRouteV2._ + val ValuesBasePath: PathMatcher[Unit] = PathMatcher("v2" / "values") /** * Returns the route. From 0a69e20186862c4bedaaf576d6a6b2f0d9980758 Mon Sep 17 00:00:00 2001 From: irinaschubert Date: Thu, 25 Aug 2022 17:05:33 +0200 Subject: [PATCH 07/10] fix codacy issues --- .../admin/lists/CreateListItemsRouteADM.scala | 40 ++++++++++--------- .../admin/lists/UpdateListItemsRouteADM.scala | 6 ++- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/CreateListItemsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/CreateListItemsRouteADM.scala index 1988a35924..91243aa947 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/CreateListItemsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/CreateListItemsRouteADM.scala @@ -74,8 +74,11 @@ class CreateListItemsRouteADM(routeData: KnoraRouteData) private def createListRootNode(): Route = path(ListsBasePath) { post { entity(as[ListRootNodeCreateApiRequestADM]) { apiRequest => requestContext => - val maybeId: Validation[Throwable, Option[ListIri]] = ListIri.make(apiRequest.id) - val projectIri: Validation[Throwable, ProjectIri] = ProjectIri.make(apiRequest.projectIri) + val maybeId: Validation[Throwable, Option[ListIri]] = ListIri.make(apiRequest.id) + val projectIri: Validation[Throwable, ProjectIri] = ProjectIri.make(apiRequest.projectIri) + val validatedProjectIri: ProjectIri = ProjectIri + .make(apiRequest.projectIri) + .fold(e => throw e.head, v => v) val maybeName: Validation[Throwable, Option[ListName]] = ListName.make(apiRequest.name) val labels: Validation[Throwable, Labels] = Labels.make(apiRequest.labels) val comments: Validation[Throwable, Comments] = Comments.make(apiRequest.comments) @@ -87,14 +90,14 @@ class CreateListItemsRouteADM(routeData: KnoraRouteData) requestingUser <- getUserADM(requestContext) // check if the requesting user is allowed to perform operation - _ = if ( - !requestingUser.permissions.isProjectAdmin( - projectIri.toOption.get.value - ) && !requestingUser.permissions.isSystemAdmin - ) { - // not project or a system admin - throw ForbiddenException(ListErrorMessages.ListCreatePermission) - } + _ = + if ( + !requestingUser.permissions + .isProjectAdmin(validatedProjectIri.value) && !requestingUser.permissions.isSystemAdmin + ) { + // not project or a system admin + throw ForbiddenException(ListErrorMessages.ListCreatePermission) + } } yield ListRootNodeCreateRequestADM( createRootNode = payload, requestingUser = requestingUser, @@ -150,6 +153,7 @@ class CreateListItemsRouteADM(routeData: KnoraRouteData) val id: Validation[Throwable, Option[ListIri]] = ListIri.make(apiRequest.id) val projectIri: Validation[Throwable, ProjectIri] = ProjectIri.make(apiRequest.projectIri) + val validatedProjectIri: ProjectIri = projectIri.fold(e => throw e.head, v => v) val name: Validation[Throwable, Option[ListName]] = ListName.make(apiRequest.name) val position: Validation[Throwable, Option[Position]] = Position.make(apiRequest.position) val labels: Validation[Throwable, Labels] = Labels.make(apiRequest.labels) @@ -164,14 +168,14 @@ class CreateListItemsRouteADM(routeData: KnoraRouteData) requestingUser <- getUserADM(requestContext) // check if the requesting user is allowed to perform operation - _ = if ( - !requestingUser.permissions.isProjectAdmin( - projectIri.toOption.get.value - ) && !requestingUser.permissions.isSystemAdmin - ) { - // not project or a system admin - throw ForbiddenException(ListErrorMessages.ListCreatePermission) - } + _ = + if ( + !requestingUser.permissions + .isProjectAdmin(validatedProjectIri.value) && !requestingUser.permissions.isSystemAdmin + ) { + // not project or a system admin + throw ForbiddenException(ListErrorMessages.ListCreatePermission) + } } yield ListChildNodeCreateRequestADM( createChildNodeRequest = payload, requestingUser = requestingUser, diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala index c613967d04..590b18a0c1 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala @@ -301,8 +301,10 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) } else { Validation.fail(throw BadRequestException("Route and payload listIri mismatch.")) } + val validatedListIri: ListIri = listIri.fold(e => throw e.head, v => v) val projectIri: Validation[Throwable, ProjectIri] = ProjectIri.make(apiRequest.projectIri) + val validatedProjectIri: ProjectIri = projectIri.fold(e => throw e.head, v => v) val hasRootNode: Validation[Throwable, Option[ListIri]] = ListIri.make(apiRequest.hasRootNode) val position: Validation[Throwable, Option[Position]] = Position.make(apiRequest.position) val name: Validation[Throwable, Option[ListName]] = ListName.make(apiRequest.name) @@ -320,14 +322,14 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) // check if the requesting user is allowed to perform operation _ = if ( !requestingUser.permissions.isProjectAdmin( - projectIri.toOption.get.value + validatedProjectIri.value ) && !requestingUser.permissions.isSystemAdmin ) { // not project or a system admin throw ForbiddenException(ListErrorMessages.ListNodeCreatePermission) } } yield NodeInfoChangeRequestADM( - listIri = listIri.toOption.get.value, + listIri = validatedListIri.value, changeNodeRequest = payload, requestingUser = requestingUser, apiRequestID = UUID.randomUUID() From 31d97828b82a4a3ac25319a21c8add9853f48b32 Mon Sep 17 00:00:00 2001 From: irinaschubert Date: Thu, 25 Aug 2022 17:20:21 +0200 Subject: [PATCH 08/10] fix codacy issues --- .../webapi/routing/admin/GroupsRouteADM.scala | 16 +++--- .../routing/admin/ProjectsRouteADM.scala | 40 ++++++------- .../webapi/routing/admin/UsersRouteADM.scala | 40 ++++++------- .../admin/lists/CreateListItemsRouteADM.scala | 6 +- .../admin/lists/DeleteListItemsRouteADM.scala | 8 +-- .../admin/lists/GetListItemsRouteADM.scala | 10 ++-- .../admin/lists/UpdateListItemsRouteADM.scala | 12 ++-- .../CreatePermissionRouteADM.scala | 6 +- .../DeletePermissionRouteADM.scala | 4 +- .../UpdatePermissionRouteADM.scala | 10 ++-- .../webapi/routing/v2/OntologiesRouteV2.scala | 56 +++++++++---------- .../webapi/routing/v2/ResourcesRouteV2.scala | 22 ++++---- .../webapi/routing/v2/ValuesRouteV2.scala | 10 ++-- 13 files changed, 120 insertions(+), 120 deletions(-) diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/GroupsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/GroupsRouteADM.scala index 84c627462e..c4e5a3e3ec 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/GroupsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/GroupsRouteADM.scala @@ -34,7 +34,7 @@ class GroupsRouteADM(routeData: KnoraRouteData) with Authenticator with GroupsADMJsonProtocol { - val GroupsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "groups") + val groupsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "groups") override def makeRoute(): Route = getGroups() ~ @@ -48,7 +48,7 @@ class GroupsRouteADM(routeData: KnoraRouteData) /** * Returns all groups. */ - private def getGroups(): Route = path(GroupsBasePath) { + private def getGroups(): Route = path(groupsBasePath) { get { requestContext => val requestMessage = for { _ <- getUserADM(requestContext) @@ -67,7 +67,7 @@ class GroupsRouteADM(routeData: KnoraRouteData) /** * Returns a single group identified by IRI. */ - private def getGroup(): Route = path(GroupsBasePath / Segment) { value => + private def getGroup(): Route = path(groupsBasePath / Segment) { value => get { requestContext => val checkedGroupIri = stringFormatter.validateAndEscapeIri(value, throw BadRequestException(s"Invalid custom group IRI $value")) @@ -93,7 +93,7 @@ class GroupsRouteADM(routeData: KnoraRouteData) * Returns all members of single group. */ private def getGroupMembers(): Route = - path(GroupsBasePath / Segment / "members") { value => + path(groupsBasePath / Segment / "members") { value => get { requestContext => val checkedGroupIri = stringFormatter.validateAndEscapeIri(value, throw BadRequestException(s"Invalid group IRI $value")) @@ -118,7 +118,7 @@ class GroupsRouteADM(routeData: KnoraRouteData) /** * Creates a group. */ - private def createGroup(): Route = path(GroupsBasePath) { + private def createGroup(): Route = path(groupsBasePath) { post { entity(as[CreateGroupApiRequestADM]) { apiRequest => requestContext => val id: Validation[Throwable, Option[GroupIri]] = GroupIri.make(apiRequest.id) @@ -154,7 +154,7 @@ class GroupsRouteADM(routeData: KnoraRouteData) /** * Updates basic group information. */ - private def updateGroup(): Route = path(GroupsBasePath / Segment) { value => + private def updateGroup(): Route = path(groupsBasePath / Segment) { value => put { entity(as[ChangeGroupApiRequestADM]) { apiRequest => requestContext => val checkedGroupIri = @@ -204,7 +204,7 @@ class GroupsRouteADM(routeData: KnoraRouteData) * Updates the group's status. */ private def changeGroupStatus(): Route = - path(GroupsBasePath / Segment / "status") { value => + path(groupsBasePath / Segment / "status") { value => put { entity(as[ChangeGroupApiRequestADM]) { apiRequest => requestContext => val checkedGroupIri = @@ -244,7 +244,7 @@ class GroupsRouteADM(routeData: KnoraRouteData) /** * Deletes a group (sets status to false). */ - private def deleteGroup(): Route = path(GroupsBasePath / Segment) { value => + private def deleteGroup(): Route = path(groupsBasePath / Segment) { value => delete { requestContext => val checkedGroupIri = stringFormatter.validateAndEscapeIri(value, throw BadRequestException(s"Invalid group IRI $value")) diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/ProjectsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/ProjectsRouteADM.scala index 3c70192ea4..78d218e225 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/ProjectsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/ProjectsRouteADM.scala @@ -45,7 +45,7 @@ class ProjectsRouteADM(routeData: KnoraRouteData) with Authenticator with ProjectsADMJsonProtocol { - val ProjectsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "projects") + val projectsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "projects") /** * Returns the route. @@ -83,7 +83,7 @@ class ProjectsRouteADM(routeData: KnoraRouteData) new ApiResponse(code = 500, message = "Internal server error") ) ) - private def getProjects(): Route = path(ProjectsBasePath) { + private def getProjects(): Route = path(projectsBasePath) { get { requestContext => log.info("All projects requested.") val requestMessage: Future[ProjectsGetRequestADM] = for { @@ -127,7 +127,7 @@ class ProjectsRouteADM(routeData: KnoraRouteData) new ApiResponse(code = 500, message = "Internal server error") ) ) - private def addProject(): Route = path(ProjectsBasePath) { + private def addProject(): Route = path(projectsBasePath) { post { entity(as[CreateProjectApiRequestADM]) { apiRequest => requestContext => // zio prelude: validation @@ -167,7 +167,7 @@ class ProjectsRouteADM(routeData: KnoraRouteData) } /* returns all unique keywords for all projects as a list */ - private def getKeywords(): Route = path(ProjectsBasePath / "Keywords") { + private def getKeywords(): Route = path(projectsBasePath / "Keywords") { get { requestContext => val requestMessage: Future[ProjectsKeywordsGetRequestADM] = for { requestingUser <- getUserADM( @@ -189,7 +189,7 @@ class ProjectsRouteADM(routeData: KnoraRouteData) /* returns all keywords for a single project */ private def getProjectKeywords(): Route = - path(ProjectsBasePath / "iri" / Segment / "Keywords") { value => + path(projectsBasePath / "iri" / Segment / "Keywords") { value => get { requestContext => val checkedProjectIri = stringFormatter.validateAndEscapeProjectIri(value, throw BadRequestException(s"Invalid project IRI $value")) @@ -217,7 +217,7 @@ class ProjectsRouteADM(routeData: KnoraRouteData) * returns a single project identified through iri */ private def getProjectByIri(): Route = - path(ProjectsBasePath / "iri" / Segment) { value => + path(projectsBasePath / "iri" / Segment) { value => get { requestContext => val requestMessage: Future[ProjectGetRequestADM] = for { requestingUser <- getUserADM( @@ -245,7 +245,7 @@ class ProjectsRouteADM(routeData: KnoraRouteData) * returns a single project identified through shortname. */ private def getProjectByShortname(): Route = - path(ProjectsBasePath / "shortname" / Segment) { value => + path(projectsBasePath / "shortname" / Segment) { value => get { requestContext => val requestMessage: Future[ProjectGetRequestADM] = for { requestingUser <- getUserADM( @@ -275,7 +275,7 @@ class ProjectsRouteADM(routeData: KnoraRouteData) * returns a single project identified through shortcode. */ private def getProjectByShortcode(): Route = - path(ProjectsBasePath / "shortcode" / Segment) { value => + path(projectsBasePath / "shortcode" / Segment) { value => get { requestContext => val requestMessage: Future[ProjectGetRequestADM] = for { requestingUser <- getUserADM( @@ -305,7 +305,7 @@ class ProjectsRouteADM(routeData: KnoraRouteData) * update a project identified by iri */ private def changeProject(): Route = - path(ProjectsBasePath / "iri" / Segment) { value => + path(projectsBasePath / "iri" / Segment) { value => put { entity(as[ChangeProjectApiRequestADM]) { apiRequest => requestContext => val checkedProjectIri = @@ -340,7 +340,7 @@ class ProjectsRouteADM(routeData: KnoraRouteData) */ @ApiMayChange private def deleteProject(): Route = - path(ProjectsBasePath / "iri" / Segment) { value => + path(projectsBasePath / "iri" / Segment) { value => delete { requestContext => val checkedProjectIri = stringFormatter.validateAndEscapeProjectIri(value, throw BadRequestException(s"Invalid project IRI $value")) @@ -371,7 +371,7 @@ class ProjectsRouteADM(routeData: KnoraRouteData) */ @ApiMayChange private def getProjectMembersByIri(): Route = - path(ProjectsBasePath / "iri" / Segment / "members") { value => + path(projectsBasePath / "iri" / Segment / "members") { value => get { requestContext => val requestMessage: Future[ProjectMembersGetRequestADM] = for { requestingUser <- getUserADM( @@ -400,7 +400,7 @@ class ProjectsRouteADM(routeData: KnoraRouteData) */ @ApiMayChange private def getProjectMembersByShortname(): Route = - path(ProjectsBasePath / "shortname" / Segment / "members") { value => + path(projectsBasePath / "shortname" / Segment / "members") { value => get { requestContext => val requestMessage: Future[ProjectMembersGetRequestADM] = for { requestingUser <- getUserADM( @@ -431,7 +431,7 @@ class ProjectsRouteADM(routeData: KnoraRouteData) */ @ApiMayChange private def getProjectMembersByShortcode(): Route = - path(ProjectsBasePath / "shortcode" / Segment / "members") { value => + path(projectsBasePath / "shortcode" / Segment / "members") { value => get { requestContext => val requestMessage: Future[ProjectMembersGetRequestADM] = for { requestingUser <- getUserADM( @@ -462,7 +462,7 @@ class ProjectsRouteADM(routeData: KnoraRouteData) */ @ApiMayChange private def getProjectAdminMembersByIri(): Route = - path(ProjectsBasePath / "iri" / Segment / "admin-members") { value => + path(projectsBasePath / "iri" / Segment / "admin-members") { value => get { requestContext => val requestMessage: Future[ProjectAdminMembersGetRequestADM] = for { requestingUser <- getUserADM( @@ -491,7 +491,7 @@ class ProjectsRouteADM(routeData: KnoraRouteData) */ @ApiMayChange private def getProjectAdminMembersByShortname(): Route = - path(ProjectsBasePath / "shortname" / Segment / "admin-members") { value => + path(projectsBasePath / "shortname" / Segment / "admin-members") { value => get { requestContext => val requestMessage: Future[ProjectAdminMembersGetRequestADM] = for { requestingUser <- getUserADM( @@ -522,7 +522,7 @@ class ProjectsRouteADM(routeData: KnoraRouteData) */ @ApiMayChange private def getProjectAdminMembersByShortcode(): Route = - path(ProjectsBasePath / "shortcode" / Segment / "admin-members") { value => + path(projectsBasePath / "shortcode" / Segment / "admin-members") { value => get { requestContext => val requestMessage: Future[ProjectAdminMembersGetRequestADM] = for { requestingUser <- getUserADM( @@ -553,7 +553,7 @@ class ProjectsRouteADM(routeData: KnoraRouteData) */ @ApiMayChange private def getProjectRestrictedViewSettingsByIri(): Route = - path(ProjectsBasePath / "iri" / Segment / "RestrictedViewSettings") { value: String => + path(projectsBasePath / "iri" / Segment / "RestrictedViewSettings") { value: String => get { requestContext => val requestMessage: Future[ProjectRestrictedViewSettingsGetRequestADM] = for { requestingUser <- getUserADM( @@ -580,7 +580,7 @@ class ProjectsRouteADM(routeData: KnoraRouteData) */ @ApiMayChange private def getProjectRestrictedViewSettingsByShortname(): Route = - path(ProjectsBasePath / "shortname" / Segment / "RestrictedViewSettings") { value: String => + path(projectsBasePath / "shortname" / Segment / "RestrictedViewSettings") { value: String => get { requestContext => val requestMessage: Future[ProjectRestrictedViewSettingsGetRequestADM] = for { requestingUser <- getUserADM( @@ -608,7 +608,7 @@ class ProjectsRouteADM(routeData: KnoraRouteData) */ @ApiMayChange private def getProjectRestrictedViewSettingsByShortcode(): Route = - path(ProjectsBasePath / "shortcode" / Segment / "RestrictedViewSettings") { value: String => + path(projectsBasePath / "shortcode" / Segment / "RestrictedViewSettings") { value: String => get { requestContext => val requestMessage: Future[ProjectRestrictedViewSettingsGetRequestADM] = for { requestingUser <- getUserADM( @@ -636,7 +636,7 @@ class ProjectsRouteADM(routeData: KnoraRouteData) * Returns all ontologies, data, and configuration belonging to a project. */ private def getProjectData(): Route = - path(ProjectsBasePath / "iri" / Segment / "AllData") { projectIri: IRI => + path(projectsBasePath / "iri" / Segment / "AllData") { projectIri: IRI => get { respondWithHeaders(projectDataHeader) { getProjectDataEntity( diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/UsersRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/UsersRouteADM.scala index 70b229f282..cfd033b518 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/UsersRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/UsersRouteADM.scala @@ -35,7 +35,7 @@ import org.knora.webapi.routing.RouteUtilADM @Path("/admin/users") class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) with Authenticator { - val UsersBasePath: PathMatcher[Unit] = PathMatcher("admin" / "users") + val usersBasePath: PathMatcher[Unit] = PathMatcher("admin" / "users") /** * Returns the route. @@ -67,7 +67,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit ) ) /* return all users */ - def getUsers(): Route = path(UsersBasePath) { + def getUsers(): Route = path(usersBasePath) { get { requestContext => val requestMessage: Future[UsersGetRequestADM] = for { requestingUser <- getUserADM( @@ -110,7 +110,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit ) ) /* create a new user */ - def addUser(): Route = path(UsersBasePath) { + def addUser(): Route = path(usersBasePath) { post { entity(as[CreateUserApiRequestADM]) { apiRequest => requestContext => // get all values from request and make value objects from it @@ -164,7 +164,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit /** * return a single user identified by iri */ - private def getUserByIri(): Route = path(UsersBasePath / "iri" / Segment) { userIri => + private def getUserByIri(): Route = path(usersBasePath / "iri" / Segment) { userIri => get { requestContext => val requestMessage: Future[UserGetRequestADM] = for { requestingUser <- getUserADM( @@ -190,7 +190,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit * return a single user identified by email */ private def getUserByEmail(): Route = - path(UsersBasePath / "email" / Segment) { userIri => + path(usersBasePath / "email" / Segment) { userIri => get { requestContext => val requestMessage: Future[UserGetRequestADM] = for { requestingUser <- getUserADM( @@ -216,7 +216,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit * return a single user identified by username */ private def getUserByUsername(): Route = - path(UsersBasePath / "username" / Segment) { userIri => + path(usersBasePath / "username" / Segment) { userIri => get { requestContext => val requestMessage: Future[UserGetRequestADM] = for { requestingUser <- getUserADM( @@ -243,7 +243,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit */ @ApiMayChange private def changeUserBasicInformation(): Route = - path(UsersBasePath / "iri" / Segment / "BasicUserInformation") { userIri => + path(usersBasePath / "iri" / Segment / "BasicUserInformation") { userIri => put { entity(as[ChangeUserApiRequestADM]) { apiRequest => requestContext => if (userIri.isEmpty) throw BadRequestException("User IRI cannot be empty") @@ -321,7 +321,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit */ @ApiMayChange private def changeUserPassword(): Route = - path(UsersBasePath / "iri" / Segment / "Password") { userIri => + path(usersBasePath / "iri" / Segment / "Password") { userIri => put { entity(as[ChangeUserPasswordApiRequestADM]) { apiRequest => requestContext => if (userIri.isEmpty) throw BadRequestException("User IRI cannot be empty") @@ -373,7 +373,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit */ @ApiMayChange private def changeUserStatus(): Route = - path(UsersBasePath / "iri" / Segment / "Status") { userIri => + path(usersBasePath / "iri" / Segment / "Status") { userIri => put { entity(as[ChangeUserApiRequestADM]) { apiRequest => requestContext => if (userIri.isEmpty) throw BadRequestException("User IRI cannot be empty") @@ -420,7 +420,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit * API MAY CHANGE: delete a user identified by iri (change status to false). */ @ApiMayChange - private def deleteUser(): Route = path(UsersBasePath / "iri" / Segment) { userIri => + private def deleteUser(): Route = path(usersBasePath / "iri" / Segment) { userIri => delete { requestContext => if (userIri.isEmpty) throw BadRequestException("User IRI cannot be empty") @@ -464,7 +464,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit */ @ApiMayChange private def changeUserSystemAdminMembership(): Route = - path(UsersBasePath / "iri" / Segment / "SystemAdmin") { userIri => + path(usersBasePath / "iri" / Segment / "SystemAdmin") { userIri => put { entity(as[ChangeUserApiRequestADM]) { apiRequest => requestContext => if (userIri.isEmpty) throw BadRequestException("User IRI cannot be empty") @@ -512,7 +512,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit */ @ApiMayChange private def getUsersProjectMemberships(): Route = - path(UsersBasePath / "iri" / Segment / "project-memberships") { userIri => + path(usersBasePath / "iri" / Segment / "project-memberships") { userIri => get { requestContext => if (userIri.isEmpty) throw BadRequestException("User IRI cannot be empty") @@ -543,7 +543,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit */ @ApiMayChange private def addUserToProjectMembership(): Route = - path(UsersBasePath / "iri" / Segment / "project-memberships" / Segment) { (userIri, projectIri) => + path(usersBasePath / "iri" / Segment / "project-memberships" / Segment) { (userIri, projectIri) => post { requestContext => if (userIri.isEmpty) throw BadRequestException("User IRI cannot be empty") @@ -590,7 +590,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit */ @ApiMayChange private def removeUserFromProjectMembership(): Route = - path(UsersBasePath / "iri" / Segment / "project-memberships" / Segment) { (userIri, projectIri) => + path(usersBasePath / "iri" / Segment / "project-memberships" / Segment) { (userIri, projectIri) => delete { requestContext => if (userIri.isEmpty) throw BadRequestException("User IRI cannot be empty") @@ -637,7 +637,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit */ @ApiMayChange private def getUsersProjectAdminMemberships(): Route = - path(UsersBasePath / "iri" / Segment / "project-admin-memberships") { userIri => + path(usersBasePath / "iri" / Segment / "project-admin-memberships") { userIri => get { requestContext => if (userIri.isEmpty) throw BadRequestException("User IRI cannot be empty") @@ -669,7 +669,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit */ @ApiMayChange private def addUserToProjectAdminMembership(): Route = - path(UsersBasePath / "iri" / Segment / "project-admin-memberships" / Segment) { (userIri, projectIri) => + path(usersBasePath / "iri" / Segment / "project-admin-memberships" / Segment) { (userIri, projectIri) => post { requestContext => if (userIri.isEmpty) throw BadRequestException("User IRI cannot be empty") @@ -716,7 +716,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit */ @ApiMayChange private def removeUserFromProjectAdminMembership(): Route = - path(UsersBasePath / "iri" / Segment / "project-admin-memberships" / Segment) { (userIri, projectIri) => + path(usersBasePath / "iri" / Segment / "project-admin-memberships" / Segment) { (userIri, projectIri) => delete { requestContext => if (userIri.isEmpty) throw BadRequestException("User IRI cannot be empty") @@ -763,7 +763,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit */ @ApiMayChange private def getUsersGroupMemberships(): Route = - path(UsersBasePath / "iri" / Segment / "group-memberships") { userIri => + path(usersBasePath / "iri" / Segment / "group-memberships") { userIri => get { requestContext => if (userIri.isEmpty) throw BadRequestException("User IRI cannot be empty") @@ -794,7 +794,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit */ @ApiMayChange private def addUserToGroupMembership(): Route = - path(UsersBasePath / "iri" / Segment / "group-memberships" / Segment) { (userIri, groupIri) => + path(usersBasePath / "iri" / Segment / "group-memberships" / Segment) { (userIri, groupIri) => post { requestContext => if (userIri.isEmpty) throw BadRequestException("User IRI cannot be empty") @@ -838,7 +838,7 @@ class UsersRouteADM(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit */ @ApiMayChange private def removeUserFromGroupMembership(): Route = - path(UsersBasePath / "iri" / Segment / "group-memberships" / Segment) { (userIri, groupIri) => + path(usersBasePath / "iri" / Segment / "group-memberships" / Segment) { (userIri, groupIri) => delete { requestContext => if (userIri.isEmpty) throw BadRequestException("User IRI cannot be empty") diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/CreateListItemsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/CreateListItemsRouteADM.scala index 91243aa947..0cb370d898 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/CreateListItemsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/CreateListItemsRouteADM.scala @@ -40,7 +40,7 @@ class CreateListItemsRouteADM(routeData: KnoraRouteData) with Authenticator with ListADMJsonProtocol { - val ListsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "lists") + val listsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "lists") def makeRoute(): Route = createListRootNode() ~ @@ -71,7 +71,7 @@ class CreateListItemsRouteADM(routeData: KnoraRouteData) /** * Creates a new list (root node). */ - private def createListRootNode(): Route = path(ListsBasePath) { + private def createListRootNode(): Route = path(listsBasePath) { post { entity(as[ListRootNodeCreateApiRequestADM]) { apiRequest => requestContext => val maybeId: Validation[Throwable, Option[ListIri]] = ListIri.make(apiRequest.id) @@ -141,7 +141,7 @@ class CreateListItemsRouteADM(routeData: KnoraRouteData) /** * Creates a new list child node. */ - private def createListChildNode(): Route = path(ListsBasePath / Segment) { iri => + private def createListChildNode(): Route = path(listsBasePath / Segment) { iri => post { entity(as[ListChildNodeCreateApiRequestADM]) { apiRequest => requestContext => // check if requested ListIri matches the Iri passed in the route diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/DeleteListItemsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/DeleteListItemsRouteADM.scala index 74a24a5cb9..045a896654 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/DeleteListItemsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/DeleteListItemsRouteADM.scala @@ -29,7 +29,7 @@ class DeleteListItemsRouteADM(routeData: KnoraRouteData) with Authenticator with ListADMJsonProtocol { - val ListsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "lists") + val listsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "lists") def makeRoute(): Route = deleteListItem() ~ @@ -37,7 +37,7 @@ class DeleteListItemsRouteADM(routeData: KnoraRouteData) deleteListNodeComments() /* delete list (i.e. root node) or a child node which should also delete its children */ - private def deleteListItem(): Route = path(ListsBasePath / Segment) { iri => + private def deleteListItem(): Route = path(listsBasePath / Segment) { iri => delete { /* delete a list item root node or child if unused */ requestContext => @@ -66,7 +66,7 @@ class DeleteListItemsRouteADM(routeData: KnoraRouteData) * Checks if a list can be deleted (none of its nodes is used in data). */ private def canDeleteList(): Route = - path(ListsBasePath / "candelete" / Segment) { iri => + path(listsBasePath / "candelete" / Segment) { iri => get { requestContext => val listIri = stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid list IRI: $iri")) @@ -92,7 +92,7 @@ class DeleteListItemsRouteADM(routeData: KnoraRouteData) * Deletes all comments from requested list node (only child). */ private def deleteListNodeComments(): Route = - path(ListsBasePath / "comments" / Segment) { iri => + path(listsBasePath / "comments" / Segment) { iri => delete { requestContext => val listIri = stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid list IRI: $iri")) diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/GetListItemsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/GetListItemsRouteADM.scala index e15cea5bce..67d019e0ae 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/GetListItemsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/GetListItemsRouteADM.scala @@ -33,7 +33,7 @@ class GetListItemsRouteADM(routeData: KnoraRouteData) with Authenticator with ListADMJsonProtocol { - val ListsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "lists") + val listsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "lists") def makeRoute(): Route = getLists() ~ @@ -51,7 +51,7 @@ class GetListItemsRouteADM(routeData: KnoraRouteData) /** * Returns all lists optionally filtered by project. */ - private def getLists(): Route = path(ListsBasePath) { + private def getLists(): Route = path(listsBasePath) { get { parameters("projectIri".?) { maybeProjectIri: Option[IRI] => requestContext => val projectIri = @@ -90,7 +90,7 @@ class GetListItemsRouteADM(routeData: KnoraRouteData) /** * Returns a list node, root or child, with children (if exist). */ - private def getListNode(): Route = path(ListsBasePath / Segment) { iri => + private def getListNode(): Route = path(listsBasePath / Segment) { iri => get { requestContext => val listIri = stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid param list IRI: $iri")) @@ -118,7 +118,7 @@ class GetListItemsRouteADM(routeData: KnoraRouteData) * Returns basic information about list node, root or child, w/o children (if exist). */ private def getListOrNodeInfo(routeSwitch: String): Route = - path(ListsBasePath / routeSwitch / Segment) { iri => + path(listsBasePath / routeSwitch / Segment) { iri => get { requestContext => val listIri = stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid param list IRI: $iri")) @@ -144,7 +144,7 @@ class GetListItemsRouteADM(routeData: KnoraRouteData) */ private def getListInfo(): Route = // Brought from new lists route implementation, has the e functionality as getListOrNodeInfo - path(ListsBasePath / Segment / "info") { iri => + path(listsBasePath / Segment / "info") { iri => get { requestContext => val listIri = stringFormatter.validateAndEscapeIri(iri, throw BadRequestException(s"Invalid param list IRI: $iri")) diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala index 590b18a0c1..4be4c0209a 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/lists/UpdateListItemsRouteADM.scala @@ -36,7 +36,7 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) with Authenticator with ListADMJsonProtocol { - val ListsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "lists") + val listsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "lists") def makeRoute(): Route = updateNodeName() ~ @@ -72,7 +72,7 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) * Update name of an existing list node, either root or child. */ private def updateNodeName(): Route = - path(ListsBasePath / Segment / "name") { iri => + path(listsBasePath / Segment / "name") { iri => put { entity(as[ChangeNodeNameApiRequestADM]) { apiRequest => requestContext => val nodeIri = @@ -128,7 +128,7 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) * Update labels of an existing list node, either root or child. */ private def updateNodeLabels(): Route = - path(ListsBasePath / Segment / "labels") { iri => + path(listsBasePath / Segment / "labels") { iri => put { entity(as[ChangeNodeLabelsApiRequestADM]) { apiRequest => requestContext => val nodeIri = @@ -184,7 +184,7 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) * Updates comments of an existing list node, either root or child. */ private def updateNodeComments(): Route = - path(ListsBasePath / Segment / "comments") { iri => + path(listsBasePath / Segment / "comments") { iri => put { entity(as[ChangeNodeCommentsApiRequestADM]) { apiRequest => requestContext => val nodeIri = @@ -240,7 +240,7 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) * Updates position of an existing list child node. */ private def updateNodePosition(): Route = - path(ListsBasePath / Segment / "position") { iri => + path(listsBasePath / Segment / "position") { iri => put { entity(as[ChangeNodePositionApiRequestADM]) { apiRequest => requestContext => val nodeIri = @@ -292,7 +292,7 @@ class UpdateListItemsRouteADM(routeData: KnoraRouteData) /** * Updates existing list node, either root or child. */ - private def updateList(): Route = path(ListsBasePath / Segment) { iri => + private def updateList(): Route = path(listsBasePath / Segment) { iri => put { entity(as[ListNodeChangeApiRequestADM]) { apiRequest => requestContext => // check if requested Iri matches the route Iri diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/CreatePermissionRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/CreatePermissionRouteADM.scala index a3d02bb9d9..58e8a4c633 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/CreatePermissionRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/CreatePermissionRouteADM.scala @@ -27,7 +27,7 @@ class CreatePermissionRouteADM(routeData: KnoraRouteData) with Authenticator with PermissionsADMJsonProtocol { - val PermissionsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "permissions") + val permissionsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "permissions") /** * Returns the route. @@ -40,7 +40,7 @@ class CreatePermissionRouteADM(routeData: KnoraRouteData) * Create a new administrative permission */ private def createAdministrativePermission(): Route = - path(PermissionsBasePath / "ap") { + path(permissionsBasePath / "ap") { post { /* create a new administrative permission */ entity(as[CreateAdministrativePermissionAPIRequestADM]) { apiRequest => requestContext => @@ -67,7 +67,7 @@ class CreatePermissionRouteADM(routeData: KnoraRouteData) * Create default object access permission */ private def createDefaultObjectAccessPermission(): Route = - path(PermissionsBasePath / "doap") { + path(permissionsBasePath / "doap") { post { /* create a new default object access permission */ entity(as[CreateDefaultObjectAccessPermissionAPIRequestADM]) { apiRequest => requestContext => diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/DeletePermissionRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/DeletePermissionRouteADM.scala index 2339a3b4ab..dcb87ebe90 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/DeletePermissionRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/DeletePermissionRouteADM.scala @@ -26,7 +26,7 @@ class DeletePermissionRouteADM(routeData: KnoraRouteData) with Authenticator with PermissionsADMJsonProtocol { - val PermissionsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "permissions") + val permissionsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "permissions") /** * Returns the route. @@ -38,7 +38,7 @@ class DeletePermissionRouteADM(routeData: KnoraRouteData) * Delete a permission */ private def deletePermission(): Route = - path(PermissionsBasePath / Segment) { iri => + path(permissionsBasePath / Segment) { iri => delete { requestContext => val requestMessage = for { requestingUser <- getUserADM(requestContext) diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/UpdatePermissionRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/UpdatePermissionRouteADM.scala index e952eef859..9fc30947e2 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/UpdatePermissionRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/UpdatePermissionRouteADM.scala @@ -27,7 +27,7 @@ class UpdatePermissionRouteADM(routeData: KnoraRouteData) with Authenticator with PermissionsADMJsonProtocol { - val PermissionsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "permissions") + val permissionsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "permissions") /** * Returns the route. @@ -42,7 +42,7 @@ class UpdatePermissionRouteADM(routeData: KnoraRouteData) * Update a permission's group */ private def updatePermissionGroup(): Route = - path(PermissionsBasePath / Segment / "group") { iri => + path(permissionsBasePath / Segment / "group") { iri => put { entity(as[ChangePermissionGroupApiRequestADM]) { apiRequest => requestContext => val permissionIri = @@ -72,7 +72,7 @@ class UpdatePermissionRouteADM(routeData: KnoraRouteData) * Update a permission's set of hasPermissions. */ private def updatePermissionHasPermissions(): Route = - path(PermissionsBasePath / Segment / "hasPermissions") { iri => + path(permissionsBasePath / Segment / "hasPermissions") { iri => put { entity(as[ChangePermissionHasPermissionsApiRequestADM]) { apiRequest => requestContext => val permissionIri = @@ -102,7 +102,7 @@ class UpdatePermissionRouteADM(routeData: KnoraRouteData) * Update a doap permission by setting it for a new resource class */ private def updatePermissionResourceClass(): Route = - path(PermissionsBasePath / Segment / "resourceClass") { iri => + path(permissionsBasePath / Segment / "resourceClass") { iri => put { entity(as[ChangePermissionResourceClassApiRequestADM]) { apiRequest => requestContext => val permissionIri = @@ -132,7 +132,7 @@ class UpdatePermissionRouteADM(routeData: KnoraRouteData) * Update a doap permission by setting it for a new property class */ private def updatePermissionProperty(): Route = - path(PermissionsBasePath / Segment / "property") { iri => + path(permissionsBasePath / Segment / "property") { iri => put { entity(as[ChangePermissionPropertyApiRequestADM]) { apiRequest => requestContext => val permissionIri = diff --git a/webapi/src/main/scala/org/knora/webapi/routing/v2/OntologiesRouteV2.scala b/webapi/src/main/scala/org/knora/webapi/routing/v2/OntologiesRouteV2.scala index 2d412c71e9..cf57663848 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/v2/OntologiesRouteV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/v2/OntologiesRouteV2.scala @@ -42,7 +42,7 @@ import org.knora.webapi.routing.RouteUtilV2 */ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) with Authenticator { - val OntologiesBasePath: PathMatcher[Unit] = PathMatcher("v2" / "ontologies") + val ontologiesBasePath: PathMatcher[Unit] = PathMatcher("v2" / "ontologies") private val ALL_LANGUAGES = "allLanguages" private val LAST_MODIFICATION_DATE = "lastModificationDate" @@ -139,7 +139,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } private def getOntologyMetadata(): Route = - path(OntologiesBasePath / "metadata") { + path(ontologiesBasePath / "metadata") { get { requestContext => val maybeProjectIri: Option[SmartIri] = RouteUtilV2.getProject(requestContext) @@ -165,7 +165,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } private def updateOntologyMetadata(): Route = - path(OntologiesBasePath / "metadata") { + path(ontologiesBasePath / "metadata") { put { entity(as[String]) { jsonRequest => requestContext => { @@ -201,7 +201,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } private def getOntologyMetadataForProjects(): Route = - path(OntologiesBasePath / "metadata" / Segments) { projectIris: List[IRI] => + path(ontologiesBasePath / "metadata" / Segments) { projectIris: List[IRI] => get { requestContext => val requestMessageFuture: Future[OntologyMetadataGetByProjectRequestV2] = for { requestingUser <- getUserADM( @@ -230,7 +230,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } private def getOntology(): Route = - path(OntologiesBasePath / "allentities" / Segment) { externalOntologyIriStr: IRI => + path(ontologiesBasePath / "allentities" / Segment) { externalOntologyIriStr: IRI => get { requestContext => val requestedOntologyIri = externalOntologyIriStr.toSmartIriWithErr( throw BadRequestException(s"Invalid ontology IRI: $externalOntologyIriStr") @@ -272,7 +272,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def createClass(): Route = path(OntologiesBasePath / "classes") { + private def createClass(): Route = path(ontologiesBasePath / "classes") { post { // Create a new class. entity(as[String]) { jsonRequest => requestContext => @@ -309,7 +309,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } private def updateClass(): Route = - path(OntologiesBasePath / "classes") { + path(ontologiesBasePath / "classes") { put { // Change the labels or comments of a class. entity(as[String]) { jsonRequest => requestContext => @@ -347,7 +347,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) // delete the comment of a class definition private def deleteClassComment(): Route = - path(OntologiesBasePath / "classes" / "comment" / Segment) { classIriStr: IRI => + path(ontologiesBasePath / "classes" / "comment" / Segment) { classIriStr: IRI => delete { requestContext => val classIri = classIriStr.toSmartIri @@ -389,7 +389,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } private def addCardinalities(): Route = - path(OntologiesBasePath / "cardinalities") { + path(ontologiesBasePath / "cardinalities") { post { // Add cardinalities to a class. entity(as[String]) { jsonRequest => requestContext => @@ -426,7 +426,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } private def canReplaceCardinalities(): Route = - path(OntologiesBasePath / "canreplacecardinalities" / Segment) { classIriStr: IRI => + path(ontologiesBasePath / "canreplacecardinalities" / Segment) { classIriStr: IRI => get { requestContext => val classIri = classIriStr.toSmartIri stringFormatter.checkExternalOntologyName(classIri) @@ -459,7 +459,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) // Replaces all cardinalities with what was sent. Deleting means send empty // replace request. private def replaceCardinalities(): Route = - path(OntologiesBasePath / "cardinalities") { + path(ontologiesBasePath / "cardinalities") { put { entity(as[String]) { jsonRequest => requestContext => { @@ -495,7 +495,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } private def canDeleteCardinalitiesFromClass(): Route = - path(OntologiesBasePath / "candeletecardinalities") { + path(ontologiesBasePath / "candeletecardinalities") { post { entity(as[String]) { jsonRequest => requestContext => { @@ -534,7 +534,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) // delete a single cardinality from the specified class if the property is // not used in resources. private def deleteCardinalitiesFromClass(): Route = - path(OntologiesBasePath / "cardinalities") { + path(ontologiesBasePath / "cardinalities") { patch { entity(as[String]) { jsonRequest => requestContext => { @@ -570,7 +570,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } private def changeGuiOrder(): Route = - path(OntologiesBasePath / "guiorder") { + path(ontologiesBasePath / "guiorder") { put { // Change a class's cardinalities. entity(as[String]) { jsonRequest => requestContext => @@ -607,7 +607,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } private def getClasses(): Route = - path(OntologiesBasePath / "classes" / Segments) { externalResourceClassIris: List[IRI] => + path(ontologiesBasePath / "classes" / Segments) { externalResourceClassIris: List[IRI] => get { requestContext => val classesAndSchemas: Set[(SmartIri, ApiV2Schema)] = externalResourceClassIris.map { classIriStr: IRI => val requestedClassIri: SmartIri = @@ -671,7 +671,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } private def canDeleteClass(): Route = - path(OntologiesBasePath / "candeleteclass" / Segment) { classIriStr: IRI => + path(ontologiesBasePath / "candeleteclass" / Segment) { classIriStr: IRI => get { requestContext => val classIri = classIriStr.toSmartIri stringFormatter.checkExternalOntologyName(classIri) @@ -702,7 +702,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } private def deleteClass(): Route = - path(OntologiesBasePath / "classes" / Segments) { externalResourceClassIris: List[IRI] => + path(ontologiesBasePath / "classes" / Segments) { externalResourceClassIris: List[IRI] => delete { requestContext => val classIriStr = externalResourceClassIris match { case List(str) => str @@ -749,7 +749,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } private def deleteOntologyComment(): Route = - path(OntologiesBasePath / "comment" / Segment) { ontologyIriStr: IRI => + path(ontologiesBasePath / "comment" / Segment) { ontologyIriStr: IRI => delete { requestContext => val ontologyIri = ontologyIriStr.toSmartIri @@ -791,7 +791,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } private def createProperty(): Route = - path(OntologiesBasePath / "properties") { + path(ontologiesBasePath / "properties") { post { // Create a new property. entity(as[String]) { jsonRequest => requestContext => @@ -1004,7 +1004,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } private def updatePropertyLabelsOrComments(): Route = - path(OntologiesBasePath / "properties") { + path(ontologiesBasePath / "properties") { put { // Change the labels or comments of a property. entity(as[String]) { jsonRequest => requestContext => @@ -1043,7 +1043,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) // delete the comment of a property definition private def deletePropertyComment(): Route = - path(OntologiesBasePath / "properties" / "comment" / Segment) { propertyIriStr: IRI => + path(ontologiesBasePath / "properties" / "comment" / Segment) { propertyIriStr: IRI => delete { requestContext => val propertyIri = propertyIriStr.toSmartIri @@ -1085,7 +1085,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } private def updatePropertyGuiElement(): Route = - path(OntologiesBasePath / "properties" / "guielement") { + path(ontologiesBasePath / "properties" / "guielement") { put { // Change the salsah-gui:guiElement and/or salsah-gui:guiAttribute of a property. entity(as[String]) { jsonRequest => requestContext => @@ -1167,7 +1167,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } private def getProperties(): Route = - path(OntologiesBasePath / "properties" / Segments) { externalPropertyIris: List[IRI] => + path(ontologiesBasePath / "properties" / Segments) { externalPropertyIris: List[IRI] => get { requestContext => val propsAndSchemas: Set[(SmartIri, ApiV2Schema)] = externalPropertyIris.map { propIriStr: IRI => val requestedPropIri: SmartIri = @@ -1231,7 +1231,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } private def canDeleteProperty(): Route = - path(OntologiesBasePath / "candeleteproperty" / Segment) { propertyIriStr: IRI => + path(ontologiesBasePath / "candeleteproperty" / Segment) { propertyIriStr: IRI => get { requestContext => val propertyIri = propertyIriStr.toSmartIri stringFormatter.checkExternalOntologyName(propertyIri) @@ -1262,7 +1262,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } private def deleteProperty(): Route = - path(OntologiesBasePath / "properties" / Segments) { externalPropertyIris: List[IRI] => + path(ontologiesBasePath / "properties" / Segments) { externalPropertyIris: List[IRI] => delete { requestContext => val propertyIriStr = externalPropertyIris match { case List(str) => str @@ -1308,7 +1308,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def createOntology(): Route = path(OntologiesBasePath) { + private def createOntology(): Route = path(ontologiesBasePath) { // Create a new, empty ontology. post { entity(as[String]) { jsonRequest => requestContext => @@ -1345,7 +1345,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } private def canDeleteOntology(): Route = - path(OntologiesBasePath / "candeleteontology" / Segment) { ontologyIriStr: IRI => + path(ontologiesBasePath / "candeleteontology" / Segment) { ontologyIriStr: IRI => get { requestContext => val ontologyIri = ontologyIriStr.toSmartIri stringFormatter.checkExternalOntologyName(ontologyIri) @@ -1375,7 +1375,7 @@ class OntologiesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def deleteOntology(): Route = path(OntologiesBasePath / Segment) { ontologyIriStr => + private def deleteOntology(): Route = path(ontologiesBasePath / Segment) { ontologyIriStr => delete { requestContext => val ontologyIri = ontologyIriStr.toSmartIri stringFormatter.checkExternalOntologyName(ontologyIri) diff --git a/webapi/src/main/scala/org/knora/webapi/routing/v2/ResourcesRouteV2.scala b/webapi/src/main/scala/org/knora/webapi/routing/v2/ResourcesRouteV2.scala index d0e2e62d0b..ee47940ce5 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/v2/ResourcesRouteV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/v2/ResourcesRouteV2.scala @@ -32,7 +32,7 @@ import org.knora.webapi.routing.RouteUtilV2 */ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) with Authenticator { - val ResourcesBasePath: PathMatcher[Unit] = PathMatcher("v2" / "resources") + val resourcesBasePath: PathMatcher[Unit] = PathMatcher("v2" / "resources") private val Text_Property = "textProperty" private val Mapping_Iri = "mappingIri" @@ -64,7 +64,7 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) eraseResource() private def getIIIFManifest(): Route = - path(ResourcesBasePath / "iiifmanifest" / Segment) { resourceIriStr: IRI => + path(resourcesBasePath / "iiifmanifest" / Segment) { resourceIriStr: IRI => get { requestContext => val resourceIri: IRI = stringFormatter.validateAndEscapeIri( @@ -93,7 +93,7 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def createResource(): Route = path(ResourcesBasePath) { + private def createResource(): Route = path(resourcesBasePath) { post { entity(as[String]) { jsonRequest => requestContext => { @@ -128,7 +128,7 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def updateResourceMetadata(): Route = path(ResourcesBasePath) { + private def updateResourceMetadata(): Route = path(resourcesBasePath) { put { entity(as[String]) { jsonRequest => requestContext => { @@ -163,7 +163,7 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def getResourcesInProject(): Route = path(ResourcesBasePath) { + private def getResourcesInProject(): Route = path(resourcesBasePath) { get { requestContext => val projectIri: SmartIri = RouteUtilV2 .getProject(requestContext) @@ -230,7 +230,7 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } private def getResourceHistory(): Route = - path(ResourcesBasePath / "history" / Segment) { resourceIriStr: IRI => + path(resourcesBasePath / "history" / Segment) { resourceIriStr: IRI => get { requestContext => val resourceIri = stringFormatter.validateAndEscapeIri( @@ -274,7 +274,7 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } private def getResourceHistoryEvents(): Route = - path(ResourcesBasePath / "resourceHistoryEvents" / Segment) { resourceIri: IRI => + path(resourcesBasePath / "resourceHistoryEvents" / Segment) { resourceIri: IRI => get { requestContext => val requestMessageFuture: Future[ResourceHistoryEventsGetRequestV2] = for { requestingUser <- getUserADM( @@ -298,7 +298,7 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } private def getProjectResourceAndValueHistory(): Route = - path(ResourcesBasePath / "projectHistoryEvents" / Segment) { projectIri: IRI => + path(resourcesBasePath / "projectHistoryEvents" / Segment) { projectIri: IRI => get { requestContext => val requestMessageFuture: Future[ProjectResourcesWithHistoryGetRequestV2] = for { requestingUser <- getUserADM( @@ -321,7 +321,7 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def getResources(): Route = path(ResourcesBasePath / Segments) { resIris: Seq[String] => + private def getResources(): Route = path(resourcesBasePath / Segments) { resIris: Seq[String] => get { requestContext => if (resIris.size > settings.v2ResultsPerPage) throw BadRequestException(s"List of provided resource Iris exceeds limit of ${settings.v2ResultsPerPage}") @@ -503,7 +503,7 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def deleteResource(): Route = path(ResourcesBasePath / "delete") { + private def deleteResource(): Route = path(resourcesBasePath / "delete") { post { entity(as[String]) { jsonRequest => requestContext => { @@ -537,7 +537,7 @@ class ResourcesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) } } - private def eraseResource(): Route = path(ResourcesBasePath / "erase") { + private def eraseResource(): Route = path(resourcesBasePath / "erase") { post { entity(as[String]) { jsonRequest => requestContext => { diff --git a/webapi/src/main/scala/org/knora/webapi/routing/v2/ValuesRouteV2.scala b/webapi/src/main/scala/org/knora/webapi/routing/v2/ValuesRouteV2.scala index 4378d280f6..bb76000984 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/v2/ValuesRouteV2.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/v2/ValuesRouteV2.scala @@ -31,7 +31,7 @@ import org.knora.webapi.routing.RouteUtilV2 */ class ValuesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) with Authenticator { - val ValuesBasePath: PathMatcher[Unit] = PathMatcher("v2" / "values") + val valuesBasePath: PathMatcher[Unit] = PathMatcher("v2" / "values") /** * Returns the route. @@ -42,7 +42,7 @@ class ValuesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit updateValue() ~ deleteValue() - private def getValue(): Route = path(ValuesBasePath / Segment / Segment) { + private def getValue(): Route = path(valuesBasePath / Segment / Segment) { (resourceIriStr: IRI, valueUuidStr: String) => get { requestContext => val resourceIri: SmartIri = @@ -100,7 +100,7 @@ class ValuesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit } } - private def createValue(): Route = path(ValuesBasePath) { + private def createValue(): Route = path(valuesBasePath) { post { entity(as[String]) { jsonRequest => requestContext => { @@ -134,7 +134,7 @@ class ValuesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit } } - private def updateValue(): Route = path(ValuesBasePath) { + private def updateValue(): Route = path(valuesBasePath) { put { entity(as[String]) { jsonRequest => requestContext => { @@ -168,7 +168,7 @@ class ValuesRouteV2(routeData: KnoraRouteData) extends KnoraRoute(routeData) wit } } - private def deleteValue(): Route = path(ValuesBasePath / "delete") { + private def deleteValue(): Route = path(valuesBasePath / "delete") { post { entity(as[String]) { jsonRequest => requestContext => { From 6b0edf477df2f2ccc2046b08646162e1fe25c4ab Mon Sep 17 00:00:00 2001 From: irinaschubert Date: Thu, 25 Aug 2022 17:24:20 +0200 Subject: [PATCH 09/10] Update expected-client-test-data.txt --- webapi/scripts/expected-client-test-data.txt | 8 -------- 1 file changed, 8 deletions(-) diff --git a/webapi/scripts/expected-client-test-data.txt b/webapi/scripts/expected-client-test-data.txt index 9e493ea9e0..f50cff814e 100644 --- a/webapi/scripts/expected-client-test-data.txt +++ b/webapi/scripts/expected-client-test-data.txt @@ -55,14 +55,6 @@ test-data/admin/lists/update-childNode-position-request.json test-data/admin/lists/update-childNode-position-response.json test-data/admin/lists/update-childNode-position-to-end-request.json test-data/admin/lists/update-childNode-position-to-end-response.json -test-data/admin/lists/update-list-info-comment-label-multiple-languages-request.json -test-data/admin/lists/update-list-info-comment-label-multiple-languages-response.json -test-data/admin/lists/update-list-info-request.json -test-data/admin/lists/update-list-info-response.json -test-data/admin/lists/update-list-name-request.json -test-data/admin/lists/update-list-name-response.json -test-data/admin/lists/update-node-info-name-request.json -test-data/admin/lists/update-node-info-name-response.json test-data/admin/lists/update-rootNode-comments-request.json test-data/admin/lists/update-rootNode-comments-response.json test-data/admin/lists/update-rootNode-labels-request.json From d705e12dc0bdd94f1f790b1f33792ea6361d8e7c Mon Sep 17 00:00:00 2001 From: irinaschubert Date: Thu, 25 Aug 2022 18:02:27 +0200 Subject: [PATCH 10/10] add tests removed by accident --- webapi/scripts/expected-client-test-data.txt | 6 + .../permissions/GetPermissionsRouteADM.scala | 10 +- .../UpdateListItemsRouteADME2ESpec.scala | 246 +++++++++++++++++- 3 files changed, 254 insertions(+), 8 deletions(-) diff --git a/webapi/scripts/expected-client-test-data.txt b/webapi/scripts/expected-client-test-data.txt index f50cff814e..900413910e 100644 --- a/webapi/scripts/expected-client-test-data.txt +++ b/webapi/scripts/expected-client-test-data.txt @@ -55,6 +55,12 @@ test-data/admin/lists/update-childNode-position-request.json test-data/admin/lists/update-childNode-position-response.json test-data/admin/lists/update-childNode-position-to-end-request.json test-data/admin/lists/update-childNode-position-to-end-response.json +test-data/admin/lists/update-list-info-comment-label-multiple-languages-request.json +test-data/admin/lists/update-list-info-comment-label-multiple-languages-response.json +test-data/admin/lists/update-list-info-request.json +test-data/admin/lists/update-list-info-response.json +test-data/admin/lists/update-list-name-request.json +test-data/admin/lists/update-list-name-response.json test-data/admin/lists/update-rootNode-comments-request.json test-data/admin/lists/update-rootNode-comments-response.json test-data/admin/lists/update-rootNode-labels-request.json diff --git a/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/GetPermissionsRouteADM.scala b/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/GetPermissionsRouteADM.scala index b5f40de2f3..2596243508 100644 --- a/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/GetPermissionsRouteADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/routing/admin/permissions/GetPermissionsRouteADM.scala @@ -26,7 +26,7 @@ class GetPermissionsRouteADM(routeData: KnoraRouteData) with Authenticator with PermissionsADMJsonProtocol { - val PermissionsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "permissions") + val permissionsBasePath: PathMatcher[Unit] = PathMatcher("admin" / "permissions") /** * Returns the route. @@ -38,7 +38,7 @@ class GetPermissionsRouteADM(routeData: KnoraRouteData) getPermissionsForProject() private def getAdministrativePermissionForProjectGroup(): Route = - path(PermissionsBasePath / "ap" / Segment / Segment) { (projectIri, groupIri) => + path(permissionsBasePath / "ap" / Segment / Segment) { (projectIri, groupIri) => get { requestContext => val requestMessage = for { requestingUser <- getUserADM(requestContext) @@ -55,7 +55,7 @@ class GetPermissionsRouteADM(routeData: KnoraRouteData) } private def getAdministrativePermissionsForProject(): Route = - path(PermissionsBasePath / "ap" / Segment) { projectIri => + path(permissionsBasePath / "ap" / Segment) { projectIri => get { requestContext => val requestMessage = for { requestingUser <- getUserADM(requestContext) @@ -76,7 +76,7 @@ class GetPermissionsRouteADM(routeData: KnoraRouteData) } private def getDefaultObjectAccessPermissionsForProject(): Route = - path(PermissionsBasePath / "doap" / Segment) { projectIri => + path(permissionsBasePath / "doap" / Segment) { projectIri => get { requestContext => val requestMessage = for { requestingUser <- getUserADM(requestContext) @@ -97,7 +97,7 @@ class GetPermissionsRouteADM(routeData: KnoraRouteData) } private def getPermissionsForProject(): Route = - path(PermissionsBasePath / Segment) { projectIri => + path(permissionsBasePath / Segment) { projectIri => get { requestContext => val requestMessage = for { requestingUser <- getUserADM(requestContext) diff --git a/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/UpdateListItemsRouteADME2ESpec.scala b/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/UpdateListItemsRouteADME2ESpec.scala index 46abbff3d5..cf9bae054e 100644 --- a/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/UpdateListItemsRouteADME2ESpec.scala +++ b/webapi/src/test/scala/org/knora/webapi/e2e/admin/lists/UpdateListItemsRouteADME2ESpec.scala @@ -79,9 +79,10 @@ class UpdateListItemsRouteADME2ESpec "test" ) - private val treeListInfo: ListRootNodeInfoADM = SharedListsTestDataADM.treeListInfo - private val treeListNodes: Seq[ListChildNodeADM] = SharedListsTestDataADM.treeListChildNodes - private val treeChildNode = treeListNodes.head + val treeListInfo: ListRootNodeInfoADM = SharedListsTestDataADM.treeListInfo + val treeListNodes: Seq[ListChildNodeADM] = SharedListsTestDataADM.treeListChildNodes + val treeChildNode = treeListNodes.head + val newListIri: String = treeListInfo.id "The admin lists route (/admin/lists)" when { "updating list root node" should { @@ -602,5 +603,244 @@ class UpdateListItemsRouteADME2ESpec ) } } + + "updating basic list information" should { + "update basic list information" in { + val updateListInfo: String = + s"""{ + | "listIri": "${newListIri}", + | "projectIri": "${SharedTestDataADM.ANYTHING_PROJECT_IRI}", + | "labels": [{ "value": "Neue geänderte Liste", "language": "de"}, { "value": "Changed list", "language": "en"}], + | "comments": [{ "value": "Neuer Kommentar", "language": "de"}, { "value": "New comment", "language": "en"}] + |}""".stripMargin + + clientTestDataCollector.addFile( + TestDataFileContent( + filePath = TestDataFilePath( + directoryPath = clientTestDataPath, + filename = "update-list-info-request", + fileExtension = "json" + ), + text = updateListInfo + ) + ) + val encodedListUrl = java.net.URLEncoder.encode(newListIri, "utf-8") + + val request = Put( + baseApiUrl + s"/admin/lists/" + encodedListUrl, + HttpEntity(ContentTypes.`application/json`, updateListInfo) + ) ~> addCredentials(anythingAdminUserCreds.basicHttpCredentials) + val response: HttpResponse = singleAwaitingRequest(request) + response.status should be(StatusCodes.OK) + + val receivedListInfo: ListRootNodeInfoADM = + AkkaHttpUtils.httpResponseToJson(response).fields("listinfo").convertTo[ListRootNodeInfoADM] + + receivedListInfo.projectIri should be(SharedTestDataADM.ANYTHING_PROJECT_IRI) + + val labels: Seq[StringLiteralV2] = receivedListInfo.labels.stringLiterals + labels.size should be(2) + + val comments = receivedListInfo.comments.stringLiterals + comments.size should be(2) + + clientTestDataCollector.addFile( + TestDataFileContent( + filePath = TestDataFilePath( + directoryPath = clientTestDataPath, + filename = "update-list-info-response", + fileExtension = "json" + ), + text = responseToString(response) + ) + ) + } + + "update basic list information with a new name" in { + val updateListName = + s"""{ + | "listIri": "${newListIri}", + | "projectIri": "${SharedTestDataADM.ANYTHING_PROJECT_IRI}", + | "name": "a totally new name" + |}""".stripMargin + clientTestDataCollector.addFile( + TestDataFileContent( + filePath = TestDataFilePath( + directoryPath = clientTestDataPath, + filename = "update-list-name-request", + fileExtension = "json" + ), + text = updateListName + ) + ) + val encodedListUrl = java.net.URLEncoder.encode(newListIri, "utf-8") + + val request = Put( + baseApiUrl + s"/admin/lists/" + encodedListUrl, + HttpEntity(ContentTypes.`application/json`, updateListName) + ) ~> addCredentials(anythingAdminUserCreds.basicHttpCredentials) + val response: HttpResponse = singleAwaitingRequest(request) + response.status should be(StatusCodes.OK) + + val receivedListInfo: ListRootNodeInfoADM = + AkkaHttpUtils.httpResponseToJson(response).fields("listinfo").convertTo[ListRootNodeInfoADM] + + receivedListInfo.projectIri should be(SharedTestDataADM.ANYTHING_PROJECT_IRI) + + receivedListInfo.name should be(Some("a totally new name")) + + clientTestDataCollector.addFile( + TestDataFileContent( + filePath = TestDataFilePath( + directoryPath = clientTestDataPath, + filename = "update-list-name-response", + fileExtension = "json" + ), + text = responseToString(response) + ) + ) + } + + "update basic list information with repeated comment and label in different languages" in { + val updateListInfoWithRepeatedCommentAndLabelValuesRequest: String = + s"""{ + | "listIri": "http://rdfh.ch/lists/0001/treeList", + | "projectIri": "${SharedTestDataADM.ANYTHING_PROJECT_IRI}", + | "labels": [ + | {"language": "en", "value": "Test List"}, + | {"language": "se", "value": "Test List"} + | ], + | "comments": [ + | {"language": "en", "value": "test"}, + | {"language": "de", "value": "test"}, + | {"language": "fr", "value": "test"}, + | {"language": "it", "value": "test"} + | ] + |}""".stripMargin + + clientTestDataCollector.addFile( + TestDataFileContent( + filePath = TestDataFilePath( + directoryPath = clientTestDataPath, + filename = "update-list-info-comment-label-multiple-languages-request", + fileExtension = "json" + ), + text = updateListInfoWithRepeatedCommentAndLabelValuesRequest + ) + ) + + val encodedListUrl = java.net.URLEncoder.encode("http://rdfh.ch/lists/0001/treeList", "utf-8") + + val request = Put( + baseApiUrl + s"/admin/lists/" + encodedListUrl, + HttpEntity(ContentTypes.`application/json`, updateListInfoWithRepeatedCommentAndLabelValuesRequest) + ) ~> addCredentials(anythingAdminUserCreds.basicHttpCredentials) + val response: HttpResponse = singleAwaitingRequest(request) + response.status should be(StatusCodes.OK) + + val receivedListInfo: ListRootNodeInfoADM = + AkkaHttpUtils.httpResponseToJson(response).fields("listinfo").convertTo[ListRootNodeInfoADM] + + receivedListInfo.projectIri should be(SharedTestDataADM.ANYTHING_PROJECT_IRI) + + val labels: Seq[StringLiteralV2] = receivedListInfo.labels.stringLiterals + labels.size should be(2) + + val comments = receivedListInfo.comments.stringLiterals + comments.size should be(4) + + clientTestDataCollector.addFile( + TestDataFileContent( + filePath = TestDataFilePath( + directoryPath = clientTestDataPath, + filename = "update-list-info-comment-label-multiple-languages-response", + fileExtension = "json" + ), + text = responseToString(response) + ) + ) + } + + "return a ForbiddenException if the user updating the list is not project or system admin" in { + val params = + s""" + |{ + | "listIri": "${newListIri}", + | "projectIri": "${SharedTestDataADM.ANYTHING_PROJECT_IRI}", + | "labels": [{ "value": "Neue geönderte Liste", "language": "de"}, { "value": "Changed list", "language": "en"}], + | "comments": [{ "value": "Neuer Kommentar", "language": "de"}, { "value": "New comment", "language": "en"}] + |} + """.stripMargin + + val encodedListUrl = java.net.URLEncoder.encode(newListIri, "utf-8") + + val request = Put( + baseApiUrl + s"/admin/lists/" + encodedListUrl, + HttpEntity(ContentTypes.`application/json`, params) + ) ~> addCredentials(anythingUserCreds.basicHttpCredentials) + val response: HttpResponse = singleAwaitingRequest(request) + response.status should be(StatusCodes.Forbidden) + } + + "return a BadRequestException during list change when payload is not correct" in { + val encodedListUrl = java.net.URLEncoder.encode(newListIri, "utf-8") + + // empty list IRI + val params01 = + s""" + |{ + | "listIri": "", + | "projectIri": "${SharedTestDataADM.ANYTHING_PROJECT_IRI}", + | "labels": [{ "value": "Neue geönderte Liste", "language": "de"}, { "value": "Changed list", "language": "en"}], + | "comments": [{ "value": "Neuer Kommentar", "language": "de"}, { "value": "New comment", "language": "en"}] + |} + """.stripMargin + + val request01 = Put( + baseApiUrl + s"/admin/lists/" + encodedListUrl, + HttpEntity(ContentTypes.`application/json`, params01) + ) ~> addCredentials(anythingAdminUserCreds.basicHttpCredentials) + val response01: HttpResponse = singleAwaitingRequest(request01) + response01.status should be(StatusCodes.BadRequest) + + // empty project + val params02 = + s""" + |{ + | "listIri": "${newListIri}", + | "projectIri": "", + | "labels": [{ "value": "Neue geönderte Liste", "language": "de"}, { "value": "Changed list", "language": "en"}], + | "comments": [{ "value": "Neuer Kommentar", "language": "de"}, { "value": "New comment", "language": "en"}] + |} + """.stripMargin + + val request02 = Put( + baseApiUrl + s"/admin/lists/" + encodedListUrl, + HttpEntity(ContentTypes.`application/json`, params02) + ) ~> addCredentials(anythingAdminUserCreds.basicHttpCredentials) + val response02: HttpResponse = singleAwaitingRequest(request02) + response02.status should be(StatusCodes.BadRequest) + + // empty parameters + val params03 = + s""" + |{ + | "listIri": "${newListIri}", + | "projectIri": "${SharedTestDataADM.ANYTHING_PROJECT_IRI}", + | "labels": [], + | "comments": [{ "value": "XXXXX", "language": "en"}] + |} + """.stripMargin + + val request03 = Put( + baseApiUrl + s"/admin/lists/" + encodedListUrl, + HttpEntity(ContentTypes.`application/json`, params03) + ) ~> addCredentials(anythingAdminUserCreds.basicHttpCredentials) + val response03: HttpResponse = singleAwaitingRequest(request03) + response03.status should be(StatusCodes.BadRequest) + + } + + } } }