From f3ac95b54f9e94a7db1389509a9fb2a0b0db220d Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Tue, 20 Jun 2023 09:10:14 +0200 Subject: [PATCH] pagination in community-projects api --- .../community/CommunityApiController.java | 16 ++++--- .../community/db/CommunityService.java | 42 ++++++++++++------- .../db/repository/DbProjectRepository.java | 6 +-- 3 files changed, 41 insertions(+), 23 deletions(-) diff --git a/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/community/CommunityApiController.java b/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/community/CommunityApiController.java index d986876f..4d04c401 100644 --- a/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/community/CommunityApiController.java +++ b/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/community/CommunityApiController.java @@ -12,11 +12,13 @@ import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import eu.dnetlib.openaire.community.db.CommunityService; @@ -93,7 +95,7 @@ public class CommunityApiController { communityService.setCommunity(id, properties); } - @RequestMapping(value = "/community/{id}/projects", produces = { + @RequestMapping(value = "/community/{id}/projects/{page}/{size}", produces = { "application/json" }, method = RequestMethod.GET) @Operation(summary = "get community projects", description = "get community projects", tags = { @@ -104,8 +106,9 @@ public class CommunityApiController { @ApiResponse(responseCode = "404", description = "not found"), @ApiResponse(responseCode = "500", description = "unexpected error") }) - public List getCommunityProjects(@PathVariable final String id) throws CommunityException, ResourceNotFoundException { - return communityService.getCommunityProjects(id); + public Page getCommunityProjects(@PathVariable final String id, @PathVariable final int page, final int size) + throws CommunityException, ResourceNotFoundException { + return communityService.getCommunityProjects(id, page, size); } @RequestMapping(value = "/community/{id}/projects", produces = { @@ -477,9 +480,10 @@ public class CommunityApiController { }) public CommunityDetails addCommunityZenodoCommunity( @PathVariable final String id, + @RequestParam(required = false, defaultValue = "false") final boolean main, @RequestBody final String zenodocommunity) throws CommunityException, ResourceNotFoundException { - return communityService.addCommunityZenodoCommunity(id, zenodocommunity); + return communityService.addCommunityZenodoCommunity(id, zenodocommunity, main); } @@ -496,10 +500,10 @@ public class CommunityApiController { }) public void removeCommunityZenodoCommunity( @PathVariable final String id, + @RequestParam(required = false, defaultValue = "false") final boolean main, @RequestBody final String zenodoCommId) throws CommunityException, ResourceNotFoundException { - communityService.removeCommunityZenodoCommunity(id, zenodoCommId); - + communityService.removeCommunityZenodoCommunity(id, zenodoCommId, main); } @RequestMapping(value = "/community/{zenodoId}/openairecommunities", produces = { diff --git a/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/community/db/CommunityService.java b/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/community/db/CommunityService.java index 34f4550e..dd6f1e53 100644 --- a/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/community/db/CommunityService.java +++ b/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/community/db/CommunityService.java @@ -12,6 +12,8 @@ import javax.transaction.Transactional; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import eu.dnetlib.openaire.community.db.model.DbCommunity; @@ -44,9 +46,7 @@ public class CommunityService { // 1) Subcommunities: modello e repository // 2) Subcommunities: importazione tramite profili // 3) Subcommunities: visualizzazione tramite le context api - // 4) nuova api per settare the mainzenodocommunity // 5) ricontrollare se tutti i campi del database sono esposti dalle api (modello + mapping) - // 6) Gestire paginazione dei progetti -- getCommunityProjects deve ritornare una pagina @Autowired private DbCommunityRepository dbCommunityRepository; @@ -81,11 +81,8 @@ public class CommunityService { // TODO Auto-generated method stub } - public List getCommunityProjects(final String id) throws CommunityException, ResourceNotFoundException { - return dbProjectRepository.findByCommunity(id) - .stream() - .map(ConvertionUtils::toCommunityProject) - .collect(Collectors.toList()); + public Page getCommunityProjects(final String id, final int page, final int size) throws CommunityException, ResourceNotFoundException { + return dbProjectRepository.findByCommunity(id, PageRequest.of(page, size)).map(ConvertionUtils::toCommunityProject); } public CommunityProject addCommunityProject(final String id, final CommunityProject project) throws CommunityException, ResourceNotFoundException { @@ -103,7 +100,7 @@ public class CommunityService { dbProjectRepository.saveAll(list); - return getCommunityProjects(id); + return projectList; } public void removeCommunityProject(final String id, final String projectId) throws CommunityException, ResourceNotFoundException { @@ -140,7 +137,7 @@ public class CommunityService { dbDatasourceRepository.saveAll(list); - return getCommunityContentproviders(id); + return contentprovidersList; } public void removeCommunityContentProvider(final String id, final String contentproviderId) throws CommunityException, ResourceNotFoundException { @@ -182,7 +179,7 @@ public class CommunityService { dbSupportOrgRepository.saveAll(list); - return getCommunityOrganizations(id); + return orgList; } @Transactional @@ -232,13 +229,30 @@ public class CommunityService { return getCommunity(id); } - public CommunityDetails removeCommunityZenodoCommunity(final String id, final String zenodoCommunity) throws CommunityException, ResourceNotFoundException { - return modifyElementToArrayField(id, c -> c.getOtherZenodoCommunities(), (c, arr) -> c.setOtherZenodoCommunities(arr), true, zenodoCommunity); + public CommunityDetails removeCommunityZenodoCommunity(final String id, final String zenodoCommunity, final boolean isMain) + throws CommunityException, ResourceNotFoundException { + if (isMain) { + return updateElementToSimpleField(id, c -> c.getMainZenodoCommunity(), (c, val) -> c.setMainZenodoCommunity(val), null); + } else { + return modifyElementToArrayField(id, c -> c.getOtherZenodoCommunities(), (c, arr) -> c.setOtherZenodoCommunities(arr), true, zenodoCommunity); + } } - public CommunityDetails addCommunityZenodoCommunity(final String id, final String zenodoCommunity) + public CommunityDetails addCommunityZenodoCommunity(final String id, final String zenodoCommunity, final boolean isMain) throws CommunityException, ResourceNotFoundException { - return modifyElementToArrayField(id, c -> c.getOtherZenodoCommunities(), (c, arr) -> c.setOtherZenodoCommunities(arr), false, zenodoCommunity); + if (isMain) { + return updateElementToSimpleField(id, c -> c.getMainZenodoCommunity(), (c, val) -> c.setMainZenodoCommunity(val), zenodoCommunity); + } else { + return modifyElementToArrayField(id, c -> c.getOtherZenodoCommunities(), (c, arr) -> c.setOtherZenodoCommunities(arr), false, zenodoCommunity); + } + } + + private CommunityDetails updateElementToSimpleField(final String id, + final Function getter, + final BiConsumer setter, + final String value) { + // TODO Auto-generated method stub + return null; } private CommunityDetails modifyElementToArrayField(final String id, diff --git a/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/community/db/repository/DbProjectRepository.java b/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/community/db/repository/DbProjectRepository.java index 1c7e59ba..9b85d919 100644 --- a/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/community/db/repository/DbProjectRepository.java +++ b/apps/dnet-exporter-api/src/main/java/eu/dnetlib/openaire/community/db/repository/DbProjectRepository.java @@ -1,8 +1,8 @@ package eu.dnetlib.openaire.community.db.repository; -import java.util.List; - import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; import org.springframework.data.jpa.repository.JpaRepository; import eu.dnetlib.openaire.community.db.model.DbProject; @@ -11,6 +11,6 @@ import eu.dnetlib.openaire.community.db.model.DbProjectPK; @ConditionalOnProperty(value = "openaire.exporter.enable.community", havingValue = "true") public interface DbProjectRepository extends JpaRepository { - List findByCommunity(String community); + Page findByCommunity(String community, PageRequest page); }