diff --git a/myndla-api/src/main/scala/no/ndla/myndlaapi/controller/FolderController.scala b/myndla-api/src/main/scala/no/ndla/myndlaapi/controller/FolderController.scala index 508323693b..7751f189c0 100644 --- a/myndla-api/src/main/scala/no/ndla/myndlaapi/controller/FolderController.scala +++ b/myndla-api/src/main/scala/no/ndla/myndlaapi/controller/FolderController.scala @@ -186,6 +186,18 @@ class FolderController(using folderWriteService.newFolderResourceConnection(folderId, newResource, feideHeader) } + private def getFolderResources: ServerEndpoint[Any, Eff] = endpoint + .get + .summary("Fetch resources in a folder") + .description("Fetch resources in a folder") + .in(feideHeader) + .in(pathFolderId / "resources") + .errorOut(errorOutputsFor(400, 401, 403, 404)) + .out(jsonBody[List[ResourceDTO]]) + .serverLogicPure { case (feideHeader, folderId) => + folderReadService.getFolderResources(folderId, feideHeader) + } + private def updateResource(): ServerEndpoint[Any, Eff] = endpoint .patch .summary("Updated selected resource") @@ -326,6 +338,7 @@ class FolderController(using updateFolder(), removeFolder(), createFolderResource, + getFolderResources, updateResource(), deleteResource(), fetchSharedFolder, diff --git a/myndla-api/src/main/scala/no/ndla/myndlaapi/service/FolderReadService.scala b/myndla-api/src/main/scala/no/ndla/myndlaapi/service/FolderReadService.scala index 4ed01eb68d..bb3f89ec21 100644 --- a/myndla-api/src/main/scala/no/ndla/myndlaapi/service/FolderReadService.scala +++ b/myndla-api/src/main/scala/no/ndla/myndlaapi/service/FolderReadService.scala @@ -228,6 +228,18 @@ class FolderReadService(using } yield convertedResources } + def getFolderResources(folderId: UUID, feideAccessToken: Option[FeideAccessToken]): Try[List[ResourceDTO]] = { + for { + feideId <- feideApiClient.getFeideID(feideAccessToken) + resources <- folderRepository.getFolderResources(folderId) + _ <- resources.traverse(r => r.isOwner(feideId)) + convertedResources <- folderConverterService.domainToApiModel( + resources, + resource => folderConverterService.toApiResource(resource, isOwner = true), + ) + } yield convertedResources + } + private def createFavorite(feideId: FeideID): Try[domain.Folder] = { val favoriteFolder = domain.NewFolderData( parentId = None, diff --git a/myndla-api/src/test/scala/no/ndla/myndlaapi/controller/FolderControllerTest.scala b/myndla-api/src/test/scala/no/ndla/myndlaapi/controller/FolderControllerTest.scala index 09bf74f6b5..f075dfabf1 100644 --- a/myndla-api/src/test/scala/no/ndla/myndlaapi/controller/FolderControllerTest.scala +++ b/myndla-api/src/test/scala/no/ndla/myndlaapi/controller/FolderControllerTest.scala @@ -9,8 +9,9 @@ package no.ndla.myndlaapi.controller import no.ndla.common.Clock +import no.ndla.common.model.domain.ResourceType.Article import no.ndla.common.model.domain.myndla.{MyNDLAUser, UserRole} -import no.ndla.myndlaapi.model.api.FolderDTO +import no.ndla.myndlaapi.model.api.{FolderDTO, ResourceDTO} import no.ndla.myndlaapi.{TestData, TestEnvironment} import no.ndla.network.tapir.{ErrorHelpers, Routes, TapirController} import no.ndla.scalatestsuite.UnitTestSuite @@ -94,4 +95,31 @@ class FolderControllerTest extends UnitTestSuite with TestEnvironment with Tapir verify(folderReadService, times(1)).getSingleFolder(eqTo(someId), any, any, any) response.code.code should be(200) } + + test("That fetching resources for a single folder works") { + val someId = UUID.randomUUID() + when(folderReadService.getFolderResources(eqTo(someId), any)).thenReturn( + Success( + List( + ResourceDTO( + id = UUID.randomUUID(), + resourceType = Article, + path = "/some/path", + created = TestData.today, + tags = List.empty, + resourceId = "123", + rank = Some(1), + ) + ) + ) + ) + val request = quickRequest + .get(uri"http://localhost:$serverPort/myndla-api/v1/folders/${someId.toString}/resources") + .header("FeideAuthorization", s"Bearer $feideToken") + val response = simpleHttpClient.send(request) + + verify(folderReadService, times(0)).getAllResources(any, any) + verify(folderReadService, times(1)).getFolderResources(eqTo(someId), any) + response.code.code should be(200) + } }