From b5ff4d064a67cff2930c2562ac0ec7f2c4cad5a6 Mon Sep 17 00:00:00 2001 From: Jake Potrebic Date: Tue, 22 Dec 2020 11:25:21 -0800 Subject: [PATCH] fixed NPE on projects that have no recommended version * tiny formatting fix for ProjectList component --- .../frontend/src/components/ProjectList.vue | 4 +- .../hangar/controller/VersionsController.java | 9 ++-- .../hangar/service/VersionService.java | 41 ++++++++++++++----- .../service/project/ProjectService.java | 10 ++--- 4 files changed, 44 insertions(+), 20 deletions(-) diff --git a/src/main/frontend/src/components/ProjectList.vue b/src/main/frontend/src/components/ProjectList.vue index c488086b7..faf5a154b 100644 --- a/src/main/frontend/src/components/ProjectList.vue +++ b/src/main/frontend/src/components/ProjectList.vue @@ -14,8 +14,8 @@ :key="project.namespace.owner + project.namespace.slug" >
-
-
+
+
diff --git a/src/main/java/io/papermc/hangar/controller/VersionsController.java b/src/main/java/io/papermc/hangar/controller/VersionsController.java index d912dd178..da6b65cb0 100644 --- a/src/main/java/io/papermc/hangar/controller/VersionsController.java +++ b/src/main/java/io/papermc/hangar/controller/VersionsController.java @@ -31,6 +31,7 @@ import io.papermc.hangar.service.DownloadsService; import io.papermc.hangar.service.StatsService; import io.papermc.hangar.service.UserActionLogService; import io.papermc.hangar.service.VersionService; +import io.papermc.hangar.service.VersionService.RecommendedVersionService; import io.papermc.hangar.service.pluginupload.PendingVersion; import io.papermc.hangar.service.pluginupload.PluginUploadService; import io.papermc.hangar.service.pluginupload.ProjectFiles; @@ -86,6 +87,7 @@ public class VersionsController extends HangarController { private final ProjectService projectService; private final VersionService versionService; + private final RecommendedVersionService recommendedVersionService; private final ProjectFactory projectFactory; private final StatsService statsService; private final PluginUploadService pluginUploadService; @@ -109,9 +111,10 @@ public class VersionsController extends HangarController { @Autowired - public VersionsController(ProjectService projectService, VersionService versionService, ProjectFactory projectFactory, StatsService statsService, PluginUploadService pluginUploadService, ChannelService channelService, DownloadsService downloadsService, UserActionLogService userActionLogService, CacheManager cacheManager, HangarConfig hangarConfig, HangarDao projectDao, ProjectFiles projectFiles, HangarDao downloadWarningDao, MessageSource messageSource, ObjectMapper mapper, HttpServletRequest request, HttpServletResponse response, Supplier projectVersionsTable, Supplier versionData, Supplier projectsTable, Supplier projectData) { + public VersionsController(ProjectService projectService, VersionService versionService, RecommendedVersionService recommendedVersionService, ProjectFactory projectFactory, StatsService statsService, PluginUploadService pluginUploadService, ChannelService channelService, DownloadsService downloadsService, UserActionLogService userActionLogService, CacheManager cacheManager, HangarConfig hangarConfig, HangarDao projectDao, ProjectFiles projectFiles, HangarDao downloadWarningDao, MessageSource messageSource, ObjectMapper mapper, HttpServletRequest request, HttpServletResponse response, Supplier projectVersionsTable, Supplier versionData, Supplier projectsTable, Supplier projectData) { this.projectService = projectService; this.versionService = versionService; + this.recommendedVersionService = recommendedVersionService; this.projectFactory = projectFactory; this.statsService = statsService; this.pluginUploadService = pluginUploadService; @@ -261,7 +264,7 @@ public class VersionsController extends HangarController { @ResponseBody public Object downloadRecommended(@PathVariable String author, @PathVariable String slug, @RequestParam(required = false) String token) { ProjectsTable project = projectsTable.get(); - ProjectVersionsTable recommendedVersion = versionService.getRecommendedVersion(project); + ProjectVersionsTable recommendedVersion = recommendedVersionService.getRecommendedVersion(project); if (recommendedVersion == null) { throw new ResponseStatusException(HttpStatus.NOT_FOUND); } else { @@ -273,7 +276,7 @@ public class VersionsController extends HangarController { @ResponseBody public Object downloadRecommendedJar(@PathVariable String author, @PathVariable String slug, @RequestParam(required = false) String token) { ProjectsTable project = projectsTable.get(); - ProjectVersionsTable recommendedVersion = versionService.getRecommendedVersion(project); + ProjectVersionsTable recommendedVersion = recommendedVersionService.getRecommendedVersion(project); if (recommendedVersion == null) { throw new ResponseStatusException(HttpStatus.NOT_FOUND); } else { diff --git a/src/main/java/io/papermc/hangar/service/VersionService.java b/src/main/java/io/papermc/hangar/service/VersionService.java index 8c666e42f..63ac0cf3d 100644 --- a/src/main/java/io/papermc/hangar/service/VersionService.java +++ b/src/main/java/io/papermc/hangar/service/VersionService.java @@ -24,6 +24,7 @@ import io.papermc.hangar.service.project.ChannelService; import io.papermc.hangar.service.project.ProjectService; import io.papermc.hangar.util.RequestUtil; import io.papermc.hangar.util.StringUtils; +import org.jetbrains.annotations.Nullable; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.http.HttpStatus; @@ -49,18 +50,20 @@ public class VersionService extends HangarService { private final ProjectService projectService; private final ChannelService channelService; private final VisibilityService visibilityService; + private final RecommendedVersionService recommendedVersionService; private final UserService userService; private final HttpServletRequest request; @Autowired - public VersionService(HangarDao versionDao, HangarDao projectDao, HangarDao visibilityDao, ProjectService projectService, ChannelService channelService, VisibilityService visibilityService, UserService userService, HttpServletRequest request) { + public VersionService(HangarDao versionDao, HangarDao projectDao, HangarDao visibilityDao, ProjectService projectService, ChannelService channelService, VisibilityService visibilityService, RecommendedVersionService recommendedVersionService, UserService userService, HttpServletRequest request) { this.versionDao = versionDao; this.projectDao = projectDao; this.visibilityDao = visibilityDao; this.projectService = projectService; this.channelService = channelService; this.visibilityService = visibilityService; + this.recommendedVersionService = recommendedVersionService; this.userService = userService; this.request = request; } @@ -82,13 +85,14 @@ public class VersionService extends HangarService { @Bean @RequestScope - public Supplier versionData() { + @Autowired + public Supplier versionData(Supplier projectDataSupplier) { //noinspection SpringConfigurationProxyMethods - return () -> this.getVersionData(projectService.projectData().get(), projectVersionsTable().get()); + return () -> this.getVersionData(projectDataSupplier.get(), projectVersionsTable().get()); } public ProjectVersionsTable getMostRelevantVersion(ProjectsTable project) { - Optional version = Optional.ofNullable(getRecommendedVersion(project)); + Optional version = Optional.ofNullable(recommendedVersionService.getRecommendedVersion(project)); return version.or(() -> Optional.ofNullable(getMostRecentVersion(project))).orElse(null); } @@ -96,12 +100,7 @@ public class VersionService extends HangarService { return versionDao.get().getMostRecentVersion(project.getId()); } - public ProjectVersionsTable getRecommendedVersion(ProjectsTable project) { - if (project.getRecommendedVersionId() == null) { - return null; - } - return visibilityService.checkVisibility(versionDao.get().getProjectVersion(project.getId(), "", project.getRecommendedVersionId()), ProjectVersionsTable::getProjectId); - } + public ProjectVersionsTable getVersion(long projectId, long versionId) { return visibilityService.checkVisibility(versionDao.get().getProjectVersion(projectId, "", versionId), ProjectVersionsTable::getProjectId); @@ -198,4 +197,26 @@ public class VersionService extends HangarService { public Map getVersionVisibilityChanges(long versionId) { return visibilityDao.get().getProjectVersionVisibilityChanges(versionId); } + + @Service + public static class RecommendedVersionService { + + private final VisibilityService visibilityService; + private final HangarDao versionDao; + + @Autowired + public RecommendedVersionService(VisibilityService visibilityService, HangarDao versionDao) { + this.visibilityService = visibilityService; + this.versionDao = versionDao; + } + + @Nullable + public ProjectVersionsTable getRecommendedVersion(ProjectsTable project) { + if (project.getRecommendedVersionId() == null) { + return null; + } + return visibilityService.checkVisibility(versionDao.get().getProjectVersion(project.getId(), "", project.getRecommendedVersionId()), ProjectVersionsTable::getProjectId); + } + + } } diff --git a/src/main/java/io/papermc/hangar/service/project/ProjectService.java b/src/main/java/io/papermc/hangar/service/project/ProjectService.java index c1248829f..8089e0363 100644 --- a/src/main/java/io/papermc/hangar/service/project/ProjectService.java +++ b/src/main/java/io/papermc/hangar/service/project/ProjectService.java @@ -5,7 +5,6 @@ import io.papermc.hangar.config.hangar.HangarConfig; import io.papermc.hangar.db.dao.GeneralDao; import io.papermc.hangar.db.dao.HangarDao; import io.papermc.hangar.db.dao.ProjectDao; -import io.papermc.hangar.db.dao.ProjectVersionDao; import io.papermc.hangar.db.dao.UserDao; import io.papermc.hangar.db.dao.VisibilityDao; import io.papermc.hangar.db.model.ProjectVersionsTable; @@ -25,6 +24,7 @@ import io.papermc.hangar.model.viewhelpers.UnhealthyProject; import io.papermc.hangar.model.viewhelpers.UserRole; import io.papermc.hangar.service.HangarService; import io.papermc.hangar.service.PermissionService; +import io.papermc.hangar.service.VersionService.RecommendedVersionService; import io.papermc.hangar.service.VisibilityService; import io.papermc.hangar.service.pluginupload.ProjectFiles; import io.papermc.hangar.util.RequestUtil; @@ -53,26 +53,26 @@ public class ProjectService extends HangarService { private final HangarDao projectDao; private final HangarDao userDao; private final HangarDao visibilityDao; - private final HangarDao versionDao; private final HangarDao generalDao; private final FlagService flagService; private final VisibilityService visibilityService; + private final RecommendedVersionService recommendedVersionService; private final PermissionService permissionService; private final ProjectFiles projectFiles; private final HttpServletRequest request; @Autowired - public ProjectService(HangarConfig hangarConfig, HangarDao projectDao, HangarDao userDao, HangarDao visibilityDao, HangarDao versionDao, HangarDao generalDao, ProjectFiles projectFiles, FlagService flagService, VisibilityService visibilityService, PermissionService permissionService, HttpServletRequest request) { + public ProjectService(HangarConfig hangarConfig, HangarDao projectDao, HangarDao userDao, HangarDao visibilityDao, HangarDao generalDao, ProjectFiles projectFiles, FlagService flagService, VisibilityService visibilityService, RecommendedVersionService recommendedVersionService, PermissionService permissionService, HttpServletRequest request) { this.hangarConfig = hangarConfig; this.projectDao = projectDao; this.userDao = userDao; this.visibilityDao = visibilityDao; - this.versionDao = versionDao; this.generalDao = generalDao; this.projectFiles = projectFiles; this.flagService = flagService; this.visibilityService = visibilityService; + this.recommendedVersionService = recommendedVersionService; this.permissionService = permissionService; this.request = request; } @@ -122,7 +122,7 @@ public class ProjectService extends HangarService { noteCount = messages.size(); } Map.Entry latestProjectVisibilityChangeWithUser = visibilityDao.get().getLatestProjectVisibilityChange(projectsTable.getId()); - ProjectVersionsTable recommendedVersion = visibilityService.checkVisibility(versionDao.get().getProjectVersion(projectsTable.getId(), "", projectsTable.getRecommendedVersionId()), ProjectVersionsTable::getProjectId); + ProjectVersionsTable recommendedVersion = recommendedVersionService.getRecommendedVersion(projectsTable); String iconUrl = Routes.PROJECTS_SHOW_ICON.getRouteUrl(projectsTable.getOwnerName(), projectsTable.getSlug()); long starCount = userDao.get().getProjectStargazers(projectsTable.getId(), 0, null).size(); long watcherCount = userDao.get().getProjectWatchers(projectsTable.getId(), 0, null).size();