From 8b05aeb1dc6a56ac887fadcad1fa0548a31818e8 Mon Sep 17 00:00:00 2001 From: this-Aditya Date: Mon, 5 Aug 2024 12:05:16 +0530 Subject: [PATCH] Added public endpoint for fetching subset of projects info --- .../config/OAuth2ServerConfiguration.kt | 2 + .../management/service/ProjectService.kt | 11 ++++ .../management/service/dto/ProjectLiteDTO.kt | 55 +++++++++++++++++++ .../service/mapper/ProjectMapper.kt | 3 + .../web/rest/ProjectLiteResource.kt | 43 +++++++++++++++ 5 files changed, 114 insertions(+) create mode 100644 src/main/java/org/radarbase/management/service/dto/ProjectLiteDTO.kt create mode 100644 src/main/java/org/radarbase/management/web/rest/ProjectLiteResource.kt diff --git a/src/main/java/org/radarbase/management/config/OAuth2ServerConfiguration.kt b/src/main/java/org/radarbase/management/config/OAuth2ServerConfiguration.kt index 2586beaf3..6be8c8e00 100644 --- a/src/main/java/org/radarbase/management/config/OAuth2ServerConfiguration.kt +++ b/src/main/java/org/radarbase/management/config/OAuth2ServerConfiguration.kt @@ -129,6 +129,7 @@ class OAuth2ServerConfiguration( .skipUrlPattern(HttpMethod.GET, "/management/health") .skipUrlPattern(HttpMethod.POST, "/oauth/token") .skipUrlPattern(HttpMethod.GET, "/api/meta-token/*") + .skipUrlPattern(HttpMethod.GET, "/api/lite-projects") .skipUrlPattern(HttpMethod.GET, "/api/sitesettings") .skipUrlPattern(HttpMethod.GET, "/api/redirect/**") .skipUrlPattern(HttpMethod.GET, "/api/logout-url") @@ -173,6 +174,7 @@ class OAuth2ServerConfiguration( .hasAnyAuthority(RoleAuthority.SYS_ADMIN_AUTHORITY) .antMatchers("/api/profile-info").permitAll() .antMatchers("/api/sitesettings").permitAll() + .antMatchers("/api/lite-projects").permitAll() .antMatchers("/api/logout-url").permitAll() .antMatchers("/api/**") .authenticated() // Allow management/health endpoint to all to allow kubernetes to be able to diff --git a/src/main/java/org/radarbase/management/service/ProjectService.kt b/src/main/java/org/radarbase/management/service/ProjectService.kt index d8b28a075..fd30afe05 100644 --- a/src/main/java/org/radarbase/management/service/ProjectService.kt +++ b/src/main/java/org/radarbase/management/service/ProjectService.kt @@ -69,6 +69,17 @@ class ProjectService( } } + /** + *Get all the projects for the public endpoint. + * + *@return the list of ProjectLiteDTO + */ + @Transactional(readOnly = true) + fun findProjectsForPublicEndpoint(pageable: Pageable): Page<*> { + val projects: Page = projectRepository.findAllWithEagerRelationships(pageable) + return projects.map { project: Project -> projectMapper.projectToProjectLiteDTO(project) } + } + /** * Get one project by id. * diff --git a/src/main/java/org/radarbase/management/service/dto/ProjectLiteDTO.kt b/src/main/java/org/radarbase/management/service/dto/ProjectLiteDTO.kt new file mode 100644 index 000000000..66bcec9ff --- /dev/null +++ b/src/main/java/org/radarbase/management/service/dto/ProjectLiteDTO.kt @@ -0,0 +1,55 @@ +package org.radarbase.management.service.dto + +import com.fasterxml.jackson.annotation.JsonInclude +import org.radarbase.management.domain.enumeration.ProjectStatus +import reactor.util.annotation.NonNull +import java.io.Serializable +import javax.validation.constraints.NotNull + +@JsonInclude(JsonInclude.Include.NON_NULL) +class ProjectLiteDTO : Serializable { + @NonNull + var projectName: String? = null + + @NonNull + var description: String? = null + + @NotNull + var location: String? = null + var projectStatus: ProjectStatus? = null + + + override fun toString() = "PublicProjectDTO(" + + "projectName=$projectName, " + + "description=$description, " + + "location=$location, " + + "projectStatus=$projectStatus" + + ")" + + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as ProjectLiteDTO + + if (projectName != other.projectName) return false + if (description != other.description) return false + if (location != other.location) return false + if (projectStatus != other.projectStatus) return false + + return true + } + + override fun hashCode(): Int { + var result = projectName?.hashCode() ?: 0 + result = 31 * result + (description?.hashCode() ?: 0) + result = 31 * result + (location?.hashCode() ?: 0) + result = 31 * result + (projectStatus?.hashCode() ?: 0) + return result + } + + companion object { + private const val serialVersionUID = 1L + } +} diff --git a/src/main/java/org/radarbase/management/service/mapper/ProjectMapper.kt b/src/main/java/org/radarbase/management/service/mapper/ProjectMapper.kt index dfba59d60..a5a0f752f 100644 --- a/src/main/java/org/radarbase/management/service/mapper/ProjectMapper.kt +++ b/src/main/java/org/radarbase/management/service/mapper/ProjectMapper.kt @@ -8,6 +8,7 @@ import org.mapstruct.Named import org.radarbase.management.domain.Project import org.radarbase.management.service.dto.MinimalProjectDetailsDTO import org.radarbase.management.service.dto.ProjectDTO +import org.radarbase.management.service.dto.ProjectLiteDTO import org.radarbase.management.service.mapper.decorator.ProjectMapperDecorator /** @@ -48,6 +49,8 @@ interface ProjectMapper { fun projectToMinimalProjectDetailsDTO(project: Project): MinimalProjectDetailsDTO fun projectsToMinimalProjectDetailsDTOs(projects: List): List + fun projectToProjectLiteDTO(project: Project): ProjectLiteDTO + @Mapping(target = "description", ignore = true) @Mapping(target = "roles", ignore = true) @Mapping(target = "organizationName", ignore = true) diff --git a/src/main/java/org/radarbase/management/web/rest/ProjectLiteResource.kt b/src/main/java/org/radarbase/management/web/rest/ProjectLiteResource.kt new file mode 100644 index 000000000..13a323ed3 --- /dev/null +++ b/src/main/java/org/radarbase/management/web/rest/ProjectLiteResource.kt @@ -0,0 +1,43 @@ +package org.radarbase.management.web.rest + +import io.micrometer.core.annotation.Timed +import org.radarbase.management.service.ProjectService +import org.radarbase.management.web.rest.util.PaginationUtil +import org.slf4j.LoggerFactory +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.data.domain.Pageable +import org.springframework.data.web.PageableDefault +import org.springframework.http.HttpStatus +import org.springframework.http.ResponseEntity +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +/** + * GET /lite-projects : get all the projects. + * + * @return the ResponseEntity with status 200 (OK) and the list of ProjectLiteDTO + */ + +@RestController +@RequestMapping("/api") +class ProjectLiteResource( + @Autowired private val projectService: ProjectService +) { + + @GetMapping("lite-projects") + @Timed + fun getProjectsInfo( + @PageableDefault(size = Int.MAX_VALUE) pageable: Pageable, + ): ResponseEntity<*> { + log.debug("REST request to get Projects for public endpoint") + val page = projectService.findProjectsForPublicEndpoint(pageable) + val headers = PaginationUtil + .generatePaginationHttpHeaders(page, "/api/lite-projects") + return ResponseEntity(page.content, headers, HttpStatus.OK) + } + + companion object { + private val log = LoggerFactory.getLogger(ProjectLiteResource::class.java) + } +}