From 1468d2cfa58df3fb2abdce9e1acaeb75726939fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Kleinb=C3=B6lting?= Date: Tue, 30 Jan 2024 16:09:28 +0100 Subject: [PATCH] refactor: Remove needless `ProjectsResponderRequestADM` classes (#3008) --- .../admin/ProjectsResponderADMSpec.scala | 260 ++++++++---------- .../admin/UsersResponderADMSpec.scala | 69 ++--- .../knora/webapi/util/ZioScalaTestUtil.scala | 5 +- .../ProjectsMessagesADM.scala | 55 +--- .../admin/ProjectsResponderADM.scala | 50 +--- .../api/service/ProjectsADMRestService.scala | 2 +- 6 files changed, 158 insertions(+), 283 deletions(-) diff --git a/integration/src/test/scala/org/knora/webapi/responders/admin/ProjectsResponderADMSpec.scala b/integration/src/test/scala/org/knora/webapi/responders/admin/ProjectsResponderADMSpec.scala index ebc85f3b9c..5dfb1c18aa 100644 --- a/integration/src/test/scala/org/knora/webapi/responders/admin/ProjectsResponderADMSpec.scala +++ b/integration/src/test/scala/org/knora/webapi/responders/admin/ProjectsResponderADMSpec.scala @@ -24,7 +24,6 @@ import org.knora.webapi.messages.OntologyConstants import org.knora.webapi.messages.admin.responder.permissionsmessages.* import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM.* import org.knora.webapi.messages.admin.responder.projectsmessages.* -import org.knora.webapi.messages.admin.responder.usersmessages.UserInformationTypeADM import org.knora.webapi.routing.UnsafeZioRun import org.knora.webapi.sharedtestdata.SharedTestDataADM import org.knora.webapi.slice.admin.api.model.ProjectsEndpointsRequestsAndResponses.ProjectCreateRequest @@ -43,9 +42,7 @@ class ProjectsResponderADMSpec extends CoreSpec with ImplicitSender { "The ProjectsResponderADM" when { "used to query for project information" should { "return information for every project excluding system projects" in { - appActor ! ProjectsGetRequestADM() - - val received = expectMsgType[ProjectsGetResponseADM](timeout) + val received = UnsafeZioRun.runOrThrow(ProjectsResponderADM.getNonSystemProjects) assert(received.projects.contains(SharedTestDataADM.imagesProject)) assert(received.projects.contains(SharedTestDataADM.incunabulaProject)) assert(!received.projects.map(_.id).contains(SharedTestDataADM.systemProjectIri)) @@ -106,9 +103,7 @@ class ProjectsResponderADMSpec extends CoreSpec with ImplicitSender { "return restricted view settings using project IRI" in { val actual = UnsafeZioRun.runOrThrow( ProjectsResponderADM.projectRestrictedViewSettingsGetADM( - IriIdentifier - .fromString(SharedTestDataADM.imagesProject.id) - .getOrElseWith(e => throw BadRequestException(e.head.getMessage)) + IriIdentifier.unsafeFrom(SharedTestDataADM.imagesProject.id) ) ) actual shouldEqual Some(expectedResult) @@ -117,9 +112,7 @@ class ProjectsResponderADMSpec extends CoreSpec with ImplicitSender { "return restricted view settings using project SHORTNAME" in { val actual = UnsafeZioRun.runOrThrow( ProjectsResponderADM.projectRestrictedViewSettingsGetADM( - ShortnameIdentifier - .fromString(SharedTestDataADM.imagesProject.shortname) - .getOrElseWith(e => throw BadRequestException(e.head.getMessage)) + ShortnameIdentifier.unsafeFrom(SharedTestDataADM.imagesProject.shortname) ) ) actual shouldEqual Some(expectedResult) @@ -137,9 +130,7 @@ class ProjectsResponderADMSpec extends CoreSpec with ImplicitSender { "return 'NotFoundException' when the project IRI is unknown" in { val exit = UnsafeZioRun.run( ProjectsResponderADM.projectRestrictedViewSettingsGetRequestADM( - IriIdentifier - .fromString(notExistingProjectButValidProjectIri) - .getOrElseWith(e => throw BadRequestException(e.head.getMessage)) + IriIdentifier.unsafeFrom(notExistingProjectButValidProjectIri) ) ) assertFailsWithA[NotFoundException](exit, s"Project '$notExistingProjectButValidProjectIri' not found.") @@ -147,11 +138,7 @@ class ProjectsResponderADMSpec extends CoreSpec with ImplicitSender { "return 'NotFoundException' when the project SHORTCODE is unknown" in { val exit = UnsafeZioRun.run( - ProjectsResponderADM.projectRestrictedViewSettingsGetRequestADM( - ShortcodeIdentifier - .fromString("9999") - .getOrElseWith(e => throw BadRequestException(e.head.getMessage)) - ) + ProjectsResponderADM.projectRestrictedViewSettingsGetRequestADM(ShortcodeIdentifier.unsafeFrom("9999")) ) assertFailsWithA[NotFoundException](exit, s"Project '9999' not found.") } @@ -159,9 +146,7 @@ class ProjectsResponderADMSpec extends CoreSpec with ImplicitSender { "return 'NotFoundException' when the project SHORTNAME is unknown" in { val exit = UnsafeZioRun.run( ProjectsResponderADM.projectRestrictedViewSettingsGetRequestADM( - ShortnameIdentifier - .fromString("wrongshortname") - .getOrElseWith(e => throw BadRequestException(e.head.getMessage)) + ShortnameIdentifier.unsafeFrom("wrongshortname") ) ) assertFailsWithA[NotFoundException](exit, s"Project 'wrongshortname' not found.") @@ -423,208 +408,199 @@ class ProjectsResponderADMSpec extends CoreSpec with ImplicitSender { "used to query members" should { "return all members of a project identified by IRI" in { - appActor ! ProjectMembersGetRequestADM( - IriIdentifier - .fromString(SharedTestDataADM.imagesProject.id) - .getOrElseWith(e => throw BadRequestException(e.head.getMessage)), - SharedTestDataADM.rootUser + val actual = UnsafeZioRun.runOrThrow( + ProjectsResponderADM + .projectMembersGetRequestADM( + IriIdentifier.unsafeFrom(SharedTestDataADM.imagesProject.id), + SharedTestDataADM.rootUser + ) ) - val received: ProjectMembersGetResponseADM = expectMsgType[ProjectMembersGetResponseADM](timeout) - val members = received.members + val members = actual.members members.size should be(4) - members.map(_.id) should contain allElementsOf Seq( - SharedTestDataADM.imagesUser01.ofType(UserInformationTypeADM.Restricted), - SharedTestDataADM.imagesUser02.ofType(UserInformationTypeADM.Restricted), - SharedTestDataADM.multiuserUser.ofType(UserInformationTypeADM.Restricted), - SharedTestDataADM.imagesReviewerUser.ofType(UserInformationTypeADM.Restricted) - ).map(_.id) + SharedTestDataADM.imagesUser01.id, + SharedTestDataADM.imagesUser02.id, + SharedTestDataADM.multiuserUser.id, + SharedTestDataADM.imagesReviewerUser.id + ) } "return all members of a project identified by shortname" in { - appActor ! ProjectMembersGetRequestADM( - ShortnameIdentifier - .fromString(SharedTestDataADM.imagesProject.shortname) - .getOrElseWith(e => throw BadRequestException(e.head.getMessage)), - requestingUser = SharedTestDataADM.rootUser + val actual = UnsafeZioRun.runOrThrow( + ProjectsResponderADM + .projectMembersGetRequestADM( + ShortnameIdentifier.unsafeFrom(SharedTestDataADM.imagesProject.shortname), + SharedTestDataADM.rootUser + ) ) - val received: ProjectMembersGetResponseADM = expectMsgType[ProjectMembersGetResponseADM](timeout) - val members = received.members + val members = actual.members members.size should be(4) - members.map(_.id) should contain allElementsOf Seq( - SharedTestDataADM.imagesUser01.ofType(UserInformationTypeADM.Short), - SharedTestDataADM.imagesUser02.ofType(UserInformationTypeADM.Short), - SharedTestDataADM.multiuserUser.ofType(UserInformationTypeADM.Short), - SharedTestDataADM.imagesReviewerUser.ofType(UserInformationTypeADM.Short) - ).map(_.id) + SharedTestDataADM.imagesUser01.id, + SharedTestDataADM.imagesUser02.id, + SharedTestDataADM.multiuserUser.id, + SharedTestDataADM.imagesReviewerUser.id + ) } "return all members of a project identified by shortcode" in { - appActor ! ProjectMembersGetRequestADM( - ShortcodeIdentifier - .fromString(SharedTestDataADM.imagesProject.shortcode) - .getOrElseWith(e => throw BadRequestException(e.head.getMessage)), - requestingUser = SharedTestDataADM.rootUser + val actual = UnsafeZioRun.runOrThrow( + ProjectsResponderADM + .projectMembersGetRequestADM( + ShortcodeIdentifier.unsafeFrom(SharedTestDataADM.imagesProject.shortcode), + SharedTestDataADM.rootUser + ) ) - val received: ProjectMembersGetResponseADM = expectMsgType[ProjectMembersGetResponseADM](timeout) - val members = received.members + val members = actual.members members.size should be(4) - members.map(_.id) should contain allElementsOf Seq( - SharedTestDataADM.imagesUser01.ofType(UserInformationTypeADM.Short), - SharedTestDataADM.imagesUser02.ofType(UserInformationTypeADM.Short), - SharedTestDataADM.multiuserUser.ofType(UserInformationTypeADM.Short), - SharedTestDataADM.imagesReviewerUser.ofType(UserInformationTypeADM.Short) - ).map(_.id) + SharedTestDataADM.imagesUser01.id, + SharedTestDataADM.imagesUser02.id, + SharedTestDataADM.multiuserUser.id, + SharedTestDataADM.imagesReviewerUser.id + ) } "return 'NotFound' when the project IRI is unknown (project membership)" in { - appActor ! ProjectMembersGetRequestADM( - IriIdentifier - .fromString(notExistingProjectButValidProjectIri) - .getOrElseWith(e => throw BadRequestException(e.head.getMessage)), - SharedTestDataADM.rootUser + val exit = UnsafeZioRun.run( + ProjectsResponderADM.projectMembersGetRequestADM( + IriIdentifier.unsafeFrom(notExistingProjectButValidProjectIri), + SharedTestDataADM.rootUser + ) ) - expectMsg(Failure(NotFoundException(s"Project '$notExistingProjectButValidProjectIri' not found."))) + assertFailsWithA[NotFoundException](exit, s"Project '$notExistingProjectButValidProjectIri' not found.") } "return 'NotFound' when the project shortname is unknown (project membership)" in { - appActor ! ProjectMembersGetRequestADM( - ShortnameIdentifier - .fromString("wrongshortname") - .getOrElseWith(e => throw BadRequestException(e.head.getMessage)), - requestingUser = SharedTestDataADM.rootUser + val exit = UnsafeZioRun.run( + ProjectsResponderADM.projectMembersGetRequestADM( + ShortnameIdentifier.unsafeFrom("wrongshortname"), + SharedTestDataADM.rootUser + ) ) - expectMsg(Failure(NotFoundException(s"Project 'wrongshortname' not found."))) + assertFailsWithA[NotFoundException](exit, s"Project 'wrongshortname' not found.") } "return 'NotFound' when the project shortcode is unknown (project membership)" in { - appActor ! ProjectMembersGetRequestADM( - ShortcodeIdentifier - .fromString("9999") - .getOrElseWith(e => throw BadRequestException(e.head.getMessage)), - requestingUser = SharedTestDataADM.rootUser + val exit = UnsafeZioRun.run( + ProjectsResponderADM.projectMembersGetRequestADM( + ShortcodeIdentifier.unsafeFrom("9999"), + SharedTestDataADM.rootUser + ) ) - expectMsg(Failure(NotFoundException(s"Project '9999' not found."))) + assertFailsWithA[NotFoundException](exit, s"Project '9999' not found.") } "return all project admin members of a project identified by IRI" in { - appActor ! ProjectAdminMembersGetRequestADM( - IriIdentifier - .fromString(SharedTestDataADM.imagesProject.id) - .getOrElseWith(e => throw BadRequestException(e.head.getMessage)), - SharedTestDataADM.rootUser + val received = UnsafeZioRun.runOrThrow( + ProjectsResponderADM.projectAdminMembersGetRequestADM( + IriIdentifier.unsafeFrom(SharedTestDataADM.imagesProject.id), + SharedTestDataADM.rootUser + ) ) - val received: ProjectAdminMembersGetResponseADM = expectMsgType[ProjectAdminMembersGetResponseADM](timeout) - val members = received.members + val members = received.members members.size should be(2) - members.map(_.id) should contain allElementsOf Seq( - SharedTestDataADM.imagesUser01.ofType(UserInformationTypeADM.Short), - SharedTestDataADM.multiuserUser.ofType(UserInformationTypeADM.Short) - ).map(_.id) + SharedTestDataADM.imagesUser01.id, + SharedTestDataADM.multiuserUser.id + ) } "return all project admin members of a project identified by shortname" in { - appActor ! ProjectAdminMembersGetRequestADM( - ShortnameIdentifier - .fromString(SharedTestDataADM.imagesProject.shortname) - .getOrElseWith(e => throw BadRequestException(e.head.getMessage)), - requestingUser = SharedTestDataADM.rootUser + val received = UnsafeZioRun.runOrThrow( + ProjectsResponderADM.projectAdminMembersGetRequestADM( + ShortnameIdentifier.unsafeFrom(SharedTestDataADM.imagesProject.shortname), + SharedTestDataADM.rootUser + ) ) - val received: ProjectAdminMembersGetResponseADM = expectMsgType[ProjectAdminMembersGetResponseADM](timeout) - val members = received.members + val members = received.members members.size should be(2) - members.map(_.id) should contain allElementsOf Seq( - SharedTestDataADM.imagesUser01.ofType(UserInformationTypeADM.Short), - SharedTestDataADM.multiuserUser.ofType(UserInformationTypeADM.Short) - ).map(_.id) + SharedTestDataADM.imagesUser01.id, + SharedTestDataADM.multiuserUser.id + ) } "return all project admin members of a project identified by shortcode" in { - appActor ! ProjectAdminMembersGetRequestADM( - ShortcodeIdentifier - .fromString(SharedTestDataADM.imagesProject.shortcode) - .getOrElseWith(e => throw BadRequestException(e.head.getMessage)), - requestingUser = SharedTestDataADM.rootUser + val received = UnsafeZioRun.runOrThrow( + ProjectsResponderADM.projectAdminMembersGetRequestADM( + ShortcodeIdentifier.unsafeFrom(SharedTestDataADM.imagesProject.shortcode), + SharedTestDataADM.rootUser + ) ) - val received: ProjectAdminMembersGetResponseADM = expectMsgType[ProjectAdminMembersGetResponseADM](timeout) - val members = received.members + val members = received.members members.size should be(2) - members.map(_.id) should contain allElementsOf Seq( - SharedTestDataADM.imagesUser01.ofType(UserInformationTypeADM.Short), - SharedTestDataADM.multiuserUser.ofType(UserInformationTypeADM.Short) - ).map(_.id) + SharedTestDataADM.imagesUser01.id, + SharedTestDataADM.multiuserUser.id + ) } "return 'NotFound' when the project IRI is unknown (project admin membership)" in { - appActor ! ProjectAdminMembersGetRequestADM( - IriIdentifier - .fromString(notExistingProjectButValidProjectIri) - .getOrElseWith(e => throw BadRequestException(e.head.getMessage)), - SharedTestDataADM.rootUser + val exit = UnsafeZioRun.run( + ProjectsResponderADM.projectAdminMembersGetRequestADM( + IriIdentifier.unsafeFrom(notExistingProjectButValidProjectIri), + SharedTestDataADM.rootUser + ) ) - expectMsg(Failure(NotFoundException(s"Project '$notExistingProjectButValidProjectIri' not found."))) + + assertFailsWithA[NotFoundException](exit, s"Project '$notExistingProjectButValidProjectIri' not found.") } "return 'NotFound' when the project shortname is unknown (project admin membership)" in { - appActor ! ProjectAdminMembersGetRequestADM( - ShortnameIdentifier - .fromString("wrongshortname") - .getOrElseWith(e => throw BadRequestException(e.head.getMessage)), - requestingUser = SharedTestDataADM.rootUser + val exit = UnsafeZioRun.run( + ProjectsResponderADM.projectAdminMembersGetRequestADM( + ShortnameIdentifier.unsafeFrom("wrongshortname"), + SharedTestDataADM.rootUser + ) ) - expectMsg(Failure(NotFoundException(s"Project 'wrongshortname' not found."))) + assertFailsWithA[NotFoundException](exit, s"Project 'wrongshortname' not found.") } "return 'NotFound' when the project shortcode is unknown (project admin membership)" in { - appActor ! ProjectAdminMembersGetRequestADM( - ShortcodeIdentifier - .fromString("9999") - .getOrElseWith(e => throw BadRequestException(e.head.getMessage)), - requestingUser = SharedTestDataADM.rootUser + val exit = UnsafeZioRun.run( + ProjectsResponderADM.projectAdminMembersGetRequestADM( + ShortcodeIdentifier.unsafeFrom("9999"), + SharedTestDataADM.rootUser + ) ) - expectMsg(Failure(NotFoundException(s"Project '9999' not found."))) + assertFailsWithA[NotFoundException](exit, s"Project '9999' not found.") } } "used to query keywords" should { "return all unique keywords for all projects" in { - appActor ! ProjectsKeywordsGetRequestADM() - - val received: ProjectsKeywordsGetResponseADM = expectMsgType[ProjectsKeywordsGetResponseADM](timeout) + val received = UnsafeZioRun.runOrThrow(ProjectsResponderADM.projectsKeywordsGetRequestADM()) received.keywords.size should be(21) } "return all keywords for a single project" in { - appActor ! ProjectKeywordsGetRequestADM(projectIri = - ProjectIri.unsafeFrom(SharedTestDataADM.incunabulaProject.id) + val received = UnsafeZioRun.runOrThrow( + ProjectsResponderADM.projectKeywordsGetRequestADM( + ProjectIri.unsafeFrom(SharedTestDataADM.incunabulaProject.id) + ) ) - - val received: ProjectKeywordsGetResponseADM = expectMsgType[ProjectKeywordsGetResponseADM](timeout) received.keywords should be(SharedTestDataADM.incunabulaProject.keywords) } "return empty list for a project without keywords" in { - appActor ! ProjectKeywordsGetRequestADM(ProjectIri.unsafeFrom(SharedTestDataADM.dokubibProject.id)) - - val received: ProjectKeywordsGetResponseADM = expectMsgType[ProjectKeywordsGetResponseADM](timeout) + val received = UnsafeZioRun.runOrThrow( + ProjectsResponderADM.projectKeywordsGetRequestADM(ProjectIri.unsafeFrom(SharedTestDataADM.dokubibProject.id)) + ) received.keywords should be(Seq.empty[String]) } "return 'NotFound' when the project IRI is unknown" in { - appActor ! ProjectKeywordsGetRequestADM(ProjectIri.unsafeFrom(notExistingProjectButValidProjectIri)) - - expectMsg(Failure(NotFoundException(s"Project '$notExistingProjectButValidProjectIri' not found."))) + val exit = UnsafeZioRun.run( + ProjectsResponderADM.projectKeywordsGetRequestADM(ProjectIri.unsafeFrom(notExistingProjectButValidProjectIri)) + ) + assertFailsWithA[NotFoundException](exit, s"Project '$notExistingProjectButValidProjectIri' not found.") } } } diff --git a/integration/src/test/scala/org/knora/webapi/responders/admin/UsersResponderADMSpec.scala b/integration/src/test/scala/org/knora/webapi/responders/admin/UsersResponderADMSpec.scala index 4b0282c886..465d6d807e 100644 --- a/integration/src/test/scala/org/knora/webapi/responders/admin/UsersResponderADMSpec.scala +++ b/integration/src/test/scala/org/knora/webapi/responders/admin/UsersResponderADMSpec.scala @@ -18,11 +18,7 @@ import dsp.valueobjects.LanguageCode import org.knora.webapi.* import org.knora.webapi.messages.StringFormatter import org.knora.webapi.messages.admin.responder.groupsmessages.GroupMembersGetRequestADM -import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectAdminMembersGetRequestADM -import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectAdminMembersGetResponseADM import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectIdentifierADM.* -import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectMembersGetRequestADM -import org.knora.webapi.messages.admin.responder.projectsmessages.ProjectMembersGetResponseADM import org.knora.webapi.messages.admin.responder.usersmessages.* import org.knora.webapi.messages.util.KnoraSystemInstances import org.knora.webapi.messages.v2.routing.authenticationmessages.CredentialsIdentifier @@ -509,15 +505,12 @@ class UsersResponderADMSpec extends CoreSpec with ImplicitSender { val membershipsAfterUpdate = expectMsgType[UserProjectMembershipsGetResponseADM](timeout) membershipsAfterUpdate.projects should equal(Seq(imagesProject)) - appActor ! ProjectMembersGetRequestADM( - IriIdentifier - .fromString(imagesProject.id) - .getOrElseWith(e => throw BadRequestException(e.head.getMessage)), - requestingUser = KnoraSystemInstances.Users.SystemUser + val received = UnsafeZioRun.runOrThrow( + ProjectsResponderADM.projectMembersGetRequestADM( + IriIdentifier.unsafeFrom(imagesProject.id), + KnoraSystemInstances.Users.SystemUser + ) ) - - val received: ProjectMembersGetResponseADM = expectMsgType[ProjectMembersGetResponseADM](timeout) - received.members.map(_.id) should contain(normalUser.id) } @@ -549,14 +542,12 @@ class UsersResponderADMSpec extends CoreSpec with ImplicitSender { membershipsAfterUpdate.projects.map(_.id).sorted should equal(Seq(imagesProject.id).sorted) // check that the user was not added to the project - appActor ! ProjectMembersGetRequestADM( - IriIdentifier - .fromString(incunabulaProject.id) - .getOrElseWith(e => throw BadRequestException(e.head.getMessage)), - requestingUser = KnoraSystemInstances.Users.SystemUser + val received = UnsafeZioRun.runOrThrow( + ProjectsResponderADM.projectMembersGetRequestADM( + IriIdentifier.unsafeFrom(incunabulaProject.id), + KnoraSystemInstances.Users.SystemUser + ) ) - val received = expectMsgType[ProjectMembersGetResponseADM](timeout) - received.members.map(_.id) should not contain normalUser.id } @@ -583,14 +574,12 @@ class UsersResponderADMSpec extends CoreSpec with ImplicitSender { Seq(imagesProject.id, incunabulaProject.id).sorted ) - appActor ! ProjectMembersGetRequestADM( - IriIdentifier - .fromString(incunabulaProject.id) - .getOrElseWith(e => throw BadRequestException(e.head.getMessage)), - requestingUser = KnoraSystemInstances.Users.SystemUser + val received = UnsafeZioRun.runOrThrow( + ProjectsResponderADM.projectMembersGetRequestADM( + IriIdentifier.unsafeFrom(incunabulaProject.id), + KnoraSystemInstances.Users.SystemUser + ) ) - val received = expectMsgType[ProjectMembersGetResponseADM](timeout) - received.members.map(_.id) should contain(normalUser.id) } @@ -647,16 +636,10 @@ class UsersResponderADMSpec extends CoreSpec with ImplicitSender { projectAdminMembershipsAfterUpdate.projects should equal(Seq()) // also check that the user has been removed from the project's list of users - appActor ! ProjectMembersGetRequestADM( - IriIdentifier - .fromString(imagesProject.id) - .getOrElseWith(e => throw BadRequestException(e.head.getMessage)), - requestingUser = rootUser + val received = UnsafeZioRun.runOrThrow( + ProjectsResponderADM.projectMembersGetRequestADM(IriIdentifier.unsafeFrom(imagesProject.id), rootUser) ) - val received: ProjectMembersGetResponseADM = expectMsgType[ProjectMembersGetResponseADM](timeout) - received.members should not contain normalUser.ofType(UserInformationTypeADM.Restricted) - } "return a 'ForbiddenException' if the user requesting update is not the project or system admin" in { @@ -758,14 +741,9 @@ class UsersResponderADMSpec extends CoreSpec with ImplicitSender { membershipsAfterUpdate.projects should equal(Seq(imagesProject)) // get project admins for images project (should contain normal user) - appActor ! ProjectAdminMembersGetRequestADM( - IriIdentifier - .fromString(imagesProject.id) - .getOrElseWith(e => throw BadRequestException(e.head.getMessage)), - requestingUser = rootUser + val received = UnsafeZioRun.runOrThrow( + ProjectsResponderADM.projectAdminMembersGetRequestADM(IriIdentifier.unsafeFrom(imagesProject.id), rootUser) ) - val received: ProjectAdminMembersGetResponseADM = expectMsgType[ProjectAdminMembersGetResponseADM](timeout) - received.members.map(_.id) should contain(normalUser.id) } @@ -794,14 +772,9 @@ class UsersResponderADMSpec extends CoreSpec with ImplicitSender { val membershipsAfterUpdate = expectMsgType[UserProjectAdminMembershipsGetResponseADM](timeout) membershipsAfterUpdate.projects should equal(Seq()) - appActor ! ProjectAdminMembersGetRequestADM( - IriIdentifier - .fromString(imagesProject.id) - .getOrElseWith(e => throw BadRequestException(e.head.getMessage)), - requestingUser = rootUser + val received = UnsafeZioRun.runOrThrow( + ProjectsResponderADM.projectAdminMembersGetRequestADM(IriIdentifier.unsafeFrom(imagesProject.id), rootUser) ) - val received: ProjectAdminMembersGetResponseADM = expectMsgType[ProjectAdminMembersGetResponseADM](timeout) - received.members should not contain normalUser.ofType(UserInformationTypeADM.Restricted) } diff --git a/integration/src/test/scala/org/knora/webapi/util/ZioScalaTestUtil.scala b/integration/src/test/scala/org/knora/webapi/util/ZioScalaTestUtil.scala index b650c83138..d10b6b3025 100644 --- a/integration/src/test/scala/org/knora/webapi/util/ZioScalaTestUtil.scala +++ b/integration/src/test/scala/org/knora/webapi/util/ZioScalaTestUtil.scala @@ -14,11 +14,12 @@ import scala.reflect.ClassTag object ZioScalaTestUtil { - def assertFailsWithA[T <: Throwable: ClassTag](actual: Exit[Throwable, _]) = actual match { + def assertFailsWithA[T <: Throwable: ClassTag](actual: Exit[Throwable, ?]) = actual match { case Exit.Failure(err) => err.squash shouldBe a[T] case _ => Assertions.fail(s"Expected Exit.Failure with specific T.") } - def assertFailsWithA[T <: Throwable: ClassTag](actual: Exit[Throwable, _], expectedError: String) = actual match { + + def assertFailsWithA[T <: Throwable: ClassTag](actual: Exit[Throwable, ?], expectedError: String) = actual match { case Exit.Failure(err) => { err.squash shouldBe a[T] err.squash.getMessage shouldEqual (expectedError) diff --git a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/projectsmessages/ProjectsMessagesADM.scala b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/projectsmessages/ProjectsMessagesADM.scala index a8be1d85ad..0ad77ffc4c 100644 --- a/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/projectsmessages/ProjectsMessagesADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/messages/admin/responder/projectsmessages/ProjectsMessagesADM.scala @@ -44,15 +44,6 @@ import org.knora.webapi.slice.admin.domain.model.User sealed trait ProjectsResponderRequestADM extends KnoraRequestADM with RelayedMessage // Requests - -/** - * Get all information about all projects in form of [[ProjectsGetResponseADM]]. The ProjectsGetRequestV1 returns either - * something or a NotFound exception if there are no projects found. Administration permission checking is performed. - * - * @param withSystemProjects includes system projcets in response. - */ -case class ProjectsGetRequestADM(withSystemProjects: Boolean = false) extends ProjectsResponderRequestADM - /** * Get info about a single project identified either through its IRI, shortname or shortcode. The response is in form * of [[ProjectGetResponseADM]]. External use. @@ -69,51 +60,6 @@ case class ProjectGetRequestADM(identifier: ProjectIdentifierADM) extends Projec */ case class ProjectGetADM(identifier: ProjectIdentifierADM) extends ProjectsResponderRequestADM -/** - * Returns all users belonging to a project identified either through its IRI, shortname or shortcode. - * - * @param identifier the IRI, email, or username of the project. - * @param requestingUser the user making the request. - */ -case class ProjectMembersGetRequestADM( - identifier: ProjectIdentifierADM, - requestingUser: User -) extends ProjectsResponderRequestADM - -/** - * Returns all admin users of a project identified either through its IRI, shortname or shortcode. - * - * @param identifier the IRI, email, or username of the project. - * @param requestingUser the user making the request. - */ -case class ProjectAdminMembersGetRequestADM( - identifier: ProjectIdentifierADM, - requestingUser: User -) extends ProjectsResponderRequestADM - -/** - * Returns all unique keywords for all projects. - */ -case class ProjectsKeywordsGetRequestADM() extends ProjectsResponderRequestADM - -/** - * Returns all keywords for a project identified through IRI. - * - * @param projectIri the IRI of the project. - */ -case class ProjectKeywordsGetRequestADM( - projectIri: ProjectIri -) extends ProjectsResponderRequestADM - -/** - * Return project's RestrictedView settings. A successful response will be a [[ProjectRestrictedViewSettingsGetResponseADM]]. - * - * @param identifier the identifier of the project. - */ -case class ProjectRestrictedViewSettingsGetRequestADM( - identifier: ProjectIdentifierADM -) extends ProjectsResponderRequestADM - /** * Requests the creation of a new project. * @@ -392,6 +338,7 @@ object ProjectIdentifierADM { final case class ShortnameIdentifier private (value: Shortname) extends ProjectIdentifierADM object ShortnameIdentifier { def from(shortname: Shortname): ShortnameIdentifier = ShortnameIdentifier(shortname) + def unsafeFrom(value: String): ShortnameIdentifier = fromString(value).fold(err => throw err.head, identity) def fromString(value: String): Validation[ValidationException, ShortnameIdentifier] = Validation .fromEither(Shortname.from(value).map(ShortnameIdentifier.from)) diff --git a/webapi/src/main/scala/org/knora/webapi/responders/admin/ProjectsResponderADM.scala b/webapi/src/main/scala/org/knora/webapi/responders/admin/ProjectsResponderADM.scala index 4bae695056..4d1f91842d 100644 --- a/webapi/src/main/scala/org/knora/webapi/responders/admin/ProjectsResponderADM.scala +++ b/webapi/src/main/scala/org/knora/webapi/responders/admin/ProjectsResponderADM.scala @@ -60,12 +60,10 @@ trait ProjectsResponderADM { /** * Gets all the projects and returns them as a [[ProjectADM]]. * - * @param withSystemProjects includes system projcets in response. * @return all the projects as a [[ProjectADM]]. - * - * NotFoundException if no projects are found. + * [[NotFoundException]] if no projects are found. */ - def projectsGetRequestADM(withSystemProjects: Boolean): Task[ProjectsGetResponseADM] + def getNonSystemProjects: Task[ProjectsGetResponseADM] /** * Gets the project with the given project IRI, shortname, shortcode or UUID and returns the information @@ -200,18 +198,8 @@ final case class ProjectsResponderADMLive( * Receives a message extending [[ProjectsResponderRequestADM]], and returns an appropriate response message. */ override def handle(msg: ResponderRequest): Task[Any] = msg match { - case ProjectsGetRequestADM(withSystemProjects) => projectsGetRequestADM(withSystemProjects) - case ProjectGetADM(identifier) => getProjectFromCacheOrTriplestore(identifier) - case ProjectGetRequestADM(identifier) => getSingleProjectADMRequest(identifier) - case ProjectMembersGetRequestADM(identifier, requestingUser) => - projectMembersGetRequestADM(identifier, requestingUser) - case ProjectAdminMembersGetRequestADM(identifier, requestingUser) => - projectAdminMembersGetRequestADM(identifier, requestingUser) - case ProjectsKeywordsGetRequestADM() => projectsKeywordsGetRequestADM() - case ProjectKeywordsGetRequestADM(projectIri) => - projectKeywordsGetRequestADM(projectIri) - case ProjectRestrictedViewSettingsGetRequestADM(identifier) => - projectRestrictedViewSettingsGetRequestADM(identifier) + case ProjectGetADM(identifier) => getProjectFromCacheOrTriplestore(identifier) + case ProjectGetRequestADM(identifier) => getSingleProjectADMRequest(identifier) case ProjectCreateRequestADM(createRequest, requestingUser, apiRequestID) => projectCreateRequestADM(createRequest, requestingUser, apiRequestID) case ProjectChangeRequestADM( @@ -230,24 +218,17 @@ final case class ProjectsResponderADMLive( } /** - * Gets all the projects but not system projects and returns them as a [[ProjectADM]]. - * - * @param withSystemProjects includes system projcets in response. - * @return all the projects as a [[ProjectADM]]. + * Gets all the projects but not system projects. + * Filters out system projects in response. * + * @return all non-system projects as a [[ProjectsGetResponseADM]]. * [[NotFoundException]] if no projects are found. */ - override def projectsGetRequestADM(withSystemProjects: Boolean): Task[ProjectsGetResponseADM] = - projectService.findAll - .flatMap(projects => - (projects, withSystemProjects) match { - case (Nil, _) => ZIO.fail(NotFoundException(s"No projects found")) - case (_, true) => ZIO.succeed(ProjectsGetResponseADM(projects)) - case _ => - val noSystemProjects: List[ProjectADM] = projects.filter(p => p.id.startsWith("http://rdfh.ch/projects/")) - ZIO.succeed(ProjectsGetResponseADM(noSystemProjects)) - } - ) + override def getNonSystemProjects: Task[ProjectsGetResponseADM] = + projectService.findAll.map(_.filter(_.id.startsWith("http://rdfh.ch/projects/"))).flatMap { + case Nil => ZIO.fail(NotFoundException(s"No projects found")) + case projects => ZIO.succeed(ProjectsGetResponseADM(projects)) + } /** * Gets the project with the given project IRI, shortname, shortcode or UUID and returns the information @@ -455,11 +436,8 @@ final case class ProjectsResponderADMLive( id: ProjectIdentifierADM ): Task[ProjectRestrictedViewSettingsGetResponseADM] = projectRestrictedViewSettingsGetADM(id) - .flatMap(ZIO.fromOption(_)) - .mapBoth( - _ => NotFoundException(s"Project '${getId(id)}' not found."), - ProjectRestrictedViewSettingsGetResponseADM - ) + .someOrFail(NotFoundException(s"Project '${getId(id)}' not found.")) + .map(ProjectRestrictedViewSettingsGetResponseADM) /** * Update project's basic information. diff --git a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/service/ProjectsADMRestService.scala b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/service/ProjectsADMRestService.scala index 6ededcdadb..063fd9b8ed 100644 --- a/webapi/src/main/scala/org/knora/webapi/slice/admin/api/service/ProjectsADMRestService.scala +++ b/webapi/src/main/scala/org/knora/webapi/slice/admin/api/service/ProjectsADMRestService.scala @@ -97,7 +97,7 @@ final case class ProjectsADMRestServiceLive( * '''failure''': [[dsp.errors.NotFoundException]] when no project was found */ def listAllProjects(): Task[ProjectsGetResponseADM] = for { - internal <- responder.projectsGetRequestADM(withSystemProjects = false) + internal <- responder.getNonSystemProjects external <- format.toExternal(internal) } yield external