fixed NPE on projects that have no recommended version

* tiny formatting fix for ProjectList component
This commit is contained in:
Jake Potrebic 2020-12-22 11:25:21 -08:00
parent 8bc9cc76d3
commit b5ff4d064a
No known key found for this signature in database
GPG Key ID: 7C58557EC9C421F8
4 changed files with 44 additions and 20 deletions

View File

@ -14,8 +14,8 @@
:key="project.namespace.owner + project.namespace.slug"
>
<div class="container-fluid">
<div class="row flex-lg-nowrap flex-md-wrap">
<div class="flex-shrink-0 pl-3">
<div class="row flex-lg-nowrap flex-md-wrap px-3">
<div class="flex-shrink-0">
<Icon :name="project.namespace.owner" :src="project.icon_url" extra-classes="user-avatar-sm"></Icon>
</div>
<div class="flex-lg-shrink-0 ml-2">

View File

@ -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> projectDao, ProjectFiles projectFiles, HangarDao<ProjectVersionDownloadWarningDao> downloadWarningDao, MessageSource messageSource, ObjectMapper mapper, HttpServletRequest request, HttpServletResponse response, Supplier<ProjectVersionsTable> projectVersionsTable, Supplier<VersionData> versionData, Supplier<ProjectsTable> projectsTable, Supplier<ProjectData> 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> projectDao, ProjectFiles projectFiles, HangarDao<ProjectVersionDownloadWarningDao> downloadWarningDao, MessageSource messageSource, ObjectMapper mapper, HttpServletRequest request, HttpServletResponse response, Supplier<ProjectVersionsTable> projectVersionsTable, Supplier<VersionData> versionData, Supplier<ProjectsTable> projectsTable, Supplier<ProjectData> 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 {

View File

@ -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<ProjectVersionDao> versionDao, HangarDao<ProjectDao> projectDao, HangarDao<VisibilityDao> visibilityDao, ProjectService projectService, ChannelService channelService, VisibilityService visibilityService, UserService userService, HttpServletRequest request) {
public VersionService(HangarDao<ProjectVersionDao> versionDao, HangarDao<ProjectDao> projectDao, HangarDao<VisibilityDao> 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> versionData() {
@Autowired
public Supplier<VersionData> versionData(Supplier<ProjectData> projectDataSupplier) {
//noinspection SpringConfigurationProxyMethods
return () -> this.getVersionData(projectService.projectData().get(), projectVersionsTable().get());
return () -> this.getVersionData(projectDataSupplier.get(), projectVersionsTable().get());
}
public ProjectVersionsTable getMostRelevantVersion(ProjectsTable project) {
Optional<ProjectVersionsTable> version = Optional.ofNullable(getRecommendedVersion(project));
Optional<ProjectVersionsTable> 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<ProjectVersionVisibilityChangesTable, String> getVersionVisibilityChanges(long versionId) {
return visibilityDao.get().getProjectVersionVisibilityChanges(versionId);
}
@Service
public static class RecommendedVersionService {
private final VisibilityService visibilityService;
private final HangarDao<ProjectVersionDao> versionDao;
@Autowired
public RecommendedVersionService(VisibilityService visibilityService, HangarDao<ProjectVersionDao> 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);
}
}
}

View File

@ -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> projectDao;
private final HangarDao<UserDao> userDao;
private final HangarDao<VisibilityDao> visibilityDao;
private final HangarDao<ProjectVersionDao> versionDao;
private final HangarDao<GeneralDao> 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> projectDao, HangarDao<UserDao> userDao, HangarDao<VisibilityDao> visibilityDao, HangarDao<ProjectVersionDao> versionDao, HangarDao<GeneralDao> generalDao, ProjectFiles projectFiles, FlagService flagService, VisibilityService visibilityService, PermissionService permissionService, HttpServletRequest request) {
public ProjectService(HangarConfig hangarConfig, HangarDao<ProjectDao> projectDao, HangarDao<UserDao> userDao, HangarDao<VisibilityDao> visibilityDao, HangarDao<GeneralDao> 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<String, ProjectVisibilityChangesTable> 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();