From debd0743882aa1b0c253042d914eeb67f0b3a4d9 Mon Sep 17 00:00:00 2001 From: MiniDigger | Martin Date: Fri, 17 Jun 2022 23:47:13 +0200 Subject: [PATCH] remove refresh hack --- pom.xml | 5 -- .../internal/projects/ProjectController.java | 44 ++++++++--------- .../internal/projects/HomeProjectService.java | 49 ------------------- .../internal/projects/ProjectFactory.java | 21 ++++---- .../internal/projects/ProjectService.java | 49 ++++++++++--------- .../versions/VersionDependencyService.java | 7 ++- .../internal/versions/VersionFactory.java | 46 +++++++++-------- .../visibility/ProjectVisibilityService.java | 10 ++-- .../io/papermc/hangar/tasks/DbUpdateTask.java | 14 +++--- 9 files changed, 97 insertions(+), 148 deletions(-) delete mode 100644 src/main/java/io/papermc/hangar/service/internal/projects/HomeProjectService.java diff --git a/pom.xml b/pom.xml index 748556dd..8eaf6bb3 100644 --- a/pom.xml +++ b/pom.xml @@ -180,11 +180,6 @@ org.postgresql postgresql - - com.impossibl.pgjdbc-ng - pgjdbc-ng - 0.8.9 - diff --git a/src/main/java/io/papermc/hangar/controller/internal/projects/ProjectController.java b/src/main/java/io/papermc/hangar/controller/internal/projects/ProjectController.java index 4c7eaefa..67284072 100644 --- a/src/main/java/io/papermc/hangar/controller/internal/projects/ProjectController.java +++ b/src/main/java/io/papermc/hangar/controller/internal/projects/ProjectController.java @@ -1,5 +1,24 @@ package io.papermc.hangar.controller.internal.projects; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.servlet.view.RedirectView; + +import java.util.List; +import java.util.stream.Collectors; +import javax.validation.Valid; + import io.papermc.hangar.HangarComponent; import io.papermc.hangar.exceptions.HangarApiException; import io.papermc.hangar.exceptions.InternalHangarException; @@ -24,30 +43,11 @@ import io.papermc.hangar.security.annotations.visibility.VisibilityRequired.Type import io.papermc.hangar.service.internal.admin.StatService; import io.papermc.hangar.service.internal.organizations.OrganizationService; import io.papermc.hangar.service.internal.perms.members.ProjectMemberService; -import io.papermc.hangar.service.internal.projects.HomeProjectService; import io.papermc.hangar.service.internal.projects.ProjectFactory; import io.papermc.hangar.service.internal.projects.ProjectService; import io.papermc.hangar.service.internal.uploads.ImageService; import io.papermc.hangar.service.internal.users.UserService; import io.papermc.hangar.service.internal.users.invites.ProjectInviteService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.multipart.MultipartFile; -import org.springframework.web.servlet.view.RedirectView; - -import javax.validation.Valid; -import java.util.List; -import java.util.stream.Collectors; @Controller @RateLimit(path = "project") @@ -62,10 +62,9 @@ public class ProjectController extends HangarComponent { private final OrganizationService organizationService; private final ImageService imageService; private final StatService statService; - private final HomeProjectService homeProjectService; @Autowired - public ProjectController(ProjectFactory projectFactory, ProjectService projectService, UserService userService, OrganizationService organizationService, ProjectMemberService projectMemberService, ProjectInviteService projectInviteService, ImageService imageService, StatService statService, HomeProjectService homeProjectService) { + public ProjectController(ProjectFactory projectFactory, ProjectService projectService, UserService userService, OrganizationService organizationService, ProjectMemberService projectMemberService, ProjectInviteService projectInviteService, ImageService imageService, StatService statService) { this.projectFactory = projectFactory; this.projectService = projectService; this.userService = userService; @@ -74,7 +73,6 @@ public class ProjectController extends HangarComponent { this.projectInviteService = projectInviteService; this.imageService = imageService; this.statService = statService; - this.homeProjectService = homeProjectService; } @LoggedIn @@ -98,7 +96,7 @@ public class ProjectController extends HangarComponent { public ResponseEntity createProject(@RequestBody @Valid NewProjectForm newProject) { ProjectTable projectTable = projectFactory.createProject(newProject); // need to do this here, outside of the transactional - homeProjectService.refreshHomeProjects(); + projectService.refreshHomeProjects(); return ResponseEntity.ok(projectTable.getUrl()); } diff --git a/src/main/java/io/papermc/hangar/service/internal/projects/HomeProjectService.java b/src/main/java/io/papermc/hangar/service/internal/projects/HomeProjectService.java deleted file mode 100644 index 3e403e1b..00000000 --- a/src/main/java/io/papermc/hangar/service/internal/projects/HomeProjectService.java +++ /dev/null @@ -1,49 +0,0 @@ -package io.papermc.hangar.service.internal.projects; - -import com.impossibl.postgres.jdbc.PGDataSource; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import java.sql.Connection; -import java.sql.SQLException; - -@Service -public class HomeProjectService { - - private static final Logger logger = LoggerFactory.getLogger(HomeProjectService.class); - - private final String url; - private final String username; - private final String password; - - public HomeProjectService(@Value("${spring.datasource.url}") String url, @Value("${spring.datasource.username}") String username, @Value("${spring.datasource.password}") String password) { - this.url = url.replace("postgresql", "pgsql"); - this.username = username; - this.password = password; - } - - private Connection getConnection() throws SQLException { - // force using pgjdbc-ng since that doesn't do dum begin queries that break cockroach - PGDataSource ds = new PGDataSource(); - ds.setDatabaseUrl(url); -// ds.setSqlTrace(true); - return ds.getConnection(username, password); - } - - // if it works, it's not wrong, right? - public void refreshHomeProjects() { - try (var con = getConnection(); - var stmt = con.createStatement()) { - stmt.execute("REFRESH MATERIALIZED VIEW home_projects"); - } catch (SQLException e) { - if (e.getMessage().contains("Unsupported database URL")) { - logger.warn("Unsupported database URL: {}", url); - } else { - e.printStackTrace(); - } - } - } -} diff --git a/src/main/java/io/papermc/hangar/service/internal/projects/ProjectFactory.java b/src/main/java/io/papermc/hangar/service/internal/projects/ProjectFactory.java index 42298725..4315f860 100644 --- a/src/main/java/io/papermc/hangar/service/internal/projects/ProjectFactory.java +++ b/src/main/java/io/papermc/hangar/service/internal/projects/ProjectFactory.java @@ -1,5 +1,11 @@ package io.papermc.hangar.service.internal.projects; +import org.jdbi.v3.core.enums.EnumByName; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + import io.papermc.hangar.HangarComponent; import io.papermc.hangar.db.dao.internal.table.projects.ProjectsDAO; import io.papermc.hangar.exceptions.HangarApiException; @@ -20,11 +26,6 @@ import io.papermc.hangar.service.internal.uploads.ProjectFiles; import io.papermc.hangar.service.internal.visibility.ProjectVisibilityService; import io.papermc.hangar.util.FileUtils; import io.papermc.hangar.util.StringUtils; -import org.jdbi.v3.core.enums.EnumByName; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; @Service public class ProjectFactory extends HangarComponent { @@ -39,10 +40,9 @@ public class ProjectFactory extends HangarComponent { private final JobService jobService; private final ProjectFiles projectFiles; private final ValidationService validationService; - private final HomeProjectService homeProjectService; @Autowired - public ProjectFactory(ProjectsDAO projectDAO, ProjectService projectService, ChannelService channelService, ProjectPageService projectPageService, ProjectMemberService projectMemberService, ProjectVisibilityService projectVisibilityService, UsersApiService usersApiService, JobService jobService, ProjectFiles projectFiles, ValidationService validationService, HomeProjectService homeProjectService) { + public ProjectFactory(ProjectsDAO projectDAO, ProjectService projectService, ChannelService channelService, ProjectPageService projectPageService, ProjectMemberService projectMemberService, ProjectVisibilityService projectVisibilityService, UsersApiService usersApiService, JobService jobService, ProjectFiles projectFiles, ValidationService validationService) { this.projectsDAO = projectDAO; this.projectService = projectService; this.channelService = channelService; @@ -53,7 +53,6 @@ public class ProjectFactory extends HangarComponent { this.jobService = jobService; this.projectFiles = projectFiles; this.validationService = validationService; - this.homeProjectService = homeProjectService; } @Transactional @@ -96,7 +95,7 @@ public class ProjectFactory extends HangarComponent { projectsDAO.update(projectTable); actionLogger.project(LogAction.PROJECT_RENAMED.create(ProjectContext.of(projectTable.getId()), author + "/" + compactNewName, author + "/" + oldName)); jobService.save(new UpdateDiscourseProjectTopicJob(projectTable.getId())); - homeProjectService.refreshHomeProjects(); + projectService.refreshHomeProjects(); return StringUtils.slugify(compactNewName); } @@ -133,7 +132,7 @@ public class ProjectFactory extends HangarComponent { } else { jobService.save(new UpdateDiscourseProjectTopicJob(projectTable.getId())); projectVisibilityService.changeVisibility(projectTable, Visibility.SOFTDELETE, comment); - homeProjectService.refreshHomeProjects(); + projectService.refreshHomeProjects(); } } @@ -142,6 +141,6 @@ public class ProjectFactory extends HangarComponent { FileUtils.deleteDirectory(projectFiles.getProjectDir(projectTable.getOwnerName(), projectTable.getName())); jobService.save(new DeleteDiscourseTopicJob(projectTable.getId())); projectsDAO.delete(projectTable); - homeProjectService.refreshHomeProjects(); + projectService.refreshHomeProjects(); } } diff --git a/src/main/java/io/papermc/hangar/service/internal/projects/ProjectService.java b/src/main/java/io/papermc/hangar/service/internal/projects/ProjectService.java index 1b57ca08..6ace93be 100644 --- a/src/main/java/io/papermc/hangar/service/internal/projects/ProjectService.java +++ b/src/main/java/io/papermc/hangar/service/internal/projects/ProjectService.java @@ -1,5 +1,25 @@ package io.papermc.hangar.service.internal.projects; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.Pair; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Base64; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.BiFunction; +import java.util.function.Function; + import io.papermc.hangar.HangarComponent; import io.papermc.hangar.db.dao.internal.HangarUsersDAO; import io.papermc.hangar.db.dao.internal.projects.HangarProjectsDAO; @@ -28,25 +48,6 @@ import io.papermc.hangar.service.internal.uploads.ProjectFiles; import io.papermc.hangar.service.internal.versions.RecommendedVersionService; import io.papermc.hangar.service.internal.visibility.ProjectVisibilityService; import io.papermc.hangar.util.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.tuple.Pair; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Base64; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.function.BiFunction; -import java.util.function.Function; @Service public class ProjectService extends HangarComponent { @@ -60,10 +61,9 @@ public class ProjectService extends HangarComponent { private final ProjectFiles projectFiles; private final PermissionService permissionService; private final RecommendedVersionService recommendedVersionService; - private final HomeProjectService homeProjectService; @Autowired - public ProjectService(ProjectsDAO projectDAO, HangarUsersDAO hangarUsersDAO, HangarProjectsDAO hangarProjectsDAO, ProjectVisibilityService projectVisibilityService, OrganizationService organizationService, ProjectPageService projectPageService, ProjectFiles projectFiles, PermissionService permissionService, RecommendedVersionService recommendedVersionService, HomeProjectService homeProjectService) { + public ProjectService(ProjectsDAO projectDAO, HangarUsersDAO hangarUsersDAO, HangarProjectsDAO hangarProjectsDAO, ProjectVisibilityService projectVisibilityService, OrganizationService organizationService, ProjectPageService projectPageService, ProjectFiles projectFiles, PermissionService permissionService, RecommendedVersionService recommendedVersionService) { this.projectsDAO = projectDAO; this.hangarUsersDAO = hangarUsersDAO; this.hangarProjectsDAO = hangarProjectsDAO; @@ -73,7 +73,6 @@ public class ProjectService extends HangarComponent { this.projectFiles = projectFiles; this.permissionService = permissionService; this.recommendedVersionService = recommendedVersionService; - this.homeProjectService = homeProjectService; } @Nullable @@ -139,7 +138,7 @@ public class ProjectService extends HangarComponent { projectTable.setDonationEnabled(settingsForm.getSettings().getDonation().isEnable()); projectTable.setDonationSubject(settingsForm.getSettings().getDonation().getSubject()); projectsDAO.update(projectTable); - homeProjectService.refreshHomeProjects(); + refreshHomeProjects(); // TODO what settings changed projectTable.logAction(this.actionLogger, LogAction.PROJECT_SETTINGS_CHANGED, "", ""); } @@ -207,6 +206,10 @@ public class ProjectService extends HangarComponent { return projectsDAO.getProjectWatchers(projectId); } + public void refreshHomeProjects() { + hangarProjectsDAO.refreshHomeProjects(); + } + @Nullable private ProjectTable getProjectTable(@Nullable T identifier, @NotNull Function projectTableFunction) { if (identifier == null) { diff --git a/src/main/java/io/papermc/hangar/service/internal/versions/VersionDependencyService.java b/src/main/java/io/papermc/hangar/service/internal/versions/VersionDependencyService.java index 0271a50d..5343fb4f 100644 --- a/src/main/java/io/papermc/hangar/service/internal/versions/VersionDependencyService.java +++ b/src/main/java/io/papermc/hangar/service/internal/versions/VersionDependencyService.java @@ -23,6 +23,8 @@ import io.papermc.hangar.model.internal.api.requests.versions.UpdatePluginDepend import io.papermc.hangar.model.internal.logs.LogAction; import io.papermc.hangar.model.internal.logs.contexts.VersionContext; import io.papermc.hangar.service.internal.projects.ChannelService; +import io.papermc.hangar.service.internal.projects.ProjectService; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; @@ -45,9 +47,10 @@ public class VersionDependencyService extends HangarComponent { private final PlatformVersionDAO platformVersionDAO; private final ChannelService channelService; private final VersionTagService versionTagService; + private final ProjectService projectService; @Autowired - public VersionDependencyService(ProjectVersionDependenciesDAO projectVersionDependencyDAO, VersionsApiDAO versionsApiDAO, ProjectsDAO projectsDAO, ProjectVersionPlatformDependenciesDAO projectVersionPlatformDependencyDAO, PlatformVersionDAO platformVersionDAO, ChannelService channelService, VersionTagService versionTagService) { + public VersionDependencyService(ProjectVersionDependenciesDAO projectVersionDependencyDAO, VersionsApiDAO versionsApiDAO, ProjectsDAO projectsDAO, ProjectVersionPlatformDependenciesDAO projectVersionPlatformDependencyDAO, PlatformVersionDAO platformVersionDAO, ChannelService channelService, VersionTagService versionTagService, ProjectService projectService) { this.projectVersionDependenciesDAO = projectVersionDependencyDAO; this.versionsApiDAO = versionsApiDAO; this.projectsDAO = projectsDAO; @@ -55,6 +58,7 @@ public class VersionDependencyService extends HangarComponent { this.platformVersionDAO = platformVersionDAO; this.channelService = channelService; this.versionTagService = versionTagService; + this.projectService = projectService; } public List getProjectVersionDependencyTables(long versionId) { @@ -114,6 +118,7 @@ public class VersionDependencyService extends HangarComponent { } projectVersionTagTable.setData(form.getVersions()); versionTagService.updateTag(projectVersionTagTable); + projectService.refreshHomeProjects(); } @Transactional diff --git a/src/main/java/io/papermc/hangar/service/internal/versions/VersionFactory.java b/src/main/java/io/papermc/hangar/service/internal/versions/VersionFactory.java index 6ad63f65..fd77d880 100644 --- a/src/main/java/io/papermc/hangar/service/internal/versions/VersionFactory.java +++ b/src/main/java/io/papermc/hangar/service/internal/versions/VersionFactory.java @@ -1,5 +1,25 @@ package io.papermc.hangar.service.internal.versions; +import org.spongepowered.configurate.ConfigurateException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.util.ArrayList; +import java.util.Collection; +import java.util.EnumMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.SortedSet; + import io.papermc.hangar.HangarComponent; import io.papermc.hangar.db.dao.internal.table.PlatformVersionDAO; import io.papermc.hangar.db.dao.internal.table.versions.ProjectVersionsDAO; @@ -28,7 +48,6 @@ import io.papermc.hangar.service.api.UsersApiService; import io.papermc.hangar.service.internal.JobService; import io.papermc.hangar.service.internal.PlatformService; import io.papermc.hangar.service.internal.projects.ChannelService; -import io.papermc.hangar.service.internal.projects.HomeProjectService; import io.papermc.hangar.service.internal.projects.ProjectService; import io.papermc.hangar.service.internal.uploads.ProjectFiles; import io.papermc.hangar.service.internal.users.NotificationService; @@ -37,25 +56,6 @@ import io.papermc.hangar.service.internal.versions.plugindata.PluginFileWithData import io.papermc.hangar.service.internal.visibility.ProjectVisibilityService; import io.papermc.hangar.util.CryptoUtils; import io.papermc.hangar.util.StringUtils; -import org.spongepowered.configurate.ConfigurateException; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.StandardCopyOption; -import java.util.ArrayList; -import java.util.Collection; -import java.util.EnumMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.SortedSet; @Service public class VersionFactory extends HangarComponent { @@ -77,10 +77,9 @@ public class VersionFactory extends HangarComponent { private final UsersApiService usersApiService; private final JobService jobService; private final ValidationService validationService; - private final HomeProjectService homeProjectService; @Autowired - public VersionFactory(ProjectVersionPlatformDependenciesDAO projectVersionPlatformDependencyDAO, ProjectVersionDependenciesDAO projectVersionDependencyDAO, PlatformVersionDAO platformVersionDAO, ProjectVersionsDAO projectVersionDAO, VersionsApiDAO versionsApiDAO, ProjectFiles projectFiles, PluginDataService pluginDataService, ChannelService channelService, ProjectVisibilityService projectVisibilityService, RecommendedVersionService recommendedVersionService, ProjectService projectService, NotificationService notificationService, VersionTagService versionTagService, PlatformService platformService, UsersApiService usersApiService, JobService jobService, ValidationService validationService, HomeProjectService homeProjectService) { + public VersionFactory(ProjectVersionPlatformDependenciesDAO projectVersionPlatformDependencyDAO, ProjectVersionDependenciesDAO projectVersionDependencyDAO, PlatformVersionDAO platformVersionDAO, ProjectVersionsDAO projectVersionDAO, VersionsApiDAO versionsApiDAO, ProjectFiles projectFiles, PluginDataService pluginDataService, ChannelService channelService, ProjectVisibilityService projectVisibilityService, RecommendedVersionService recommendedVersionService, ProjectService projectService, NotificationService notificationService, VersionTagService versionTagService, PlatformService platformService, UsersApiService usersApiService, JobService jobService, ValidationService validationService) { this.projectVersionPlatformDependenciesDAO = projectVersionPlatformDependencyDAO; this.projectVersionDependenciesDAO = projectVersionDependencyDAO; this.platformVersionDAO = platformVersionDAO; @@ -98,7 +97,6 @@ public class VersionFactory extends HangarComponent { this.usersApiService = usersApiService; this.jobService = jobService; this.validationService = validationService; - this.homeProjectService = homeProjectService; } public PendingVersion createPendingVersion(long projectId, MultipartFile file) { @@ -301,7 +299,7 @@ public class VersionFactory extends HangarComponent { jobService.save(new UpdateDiscourseVersionPostJob(projectVersionTable.getId())); } - homeProjectService.refreshHomeProjects(); + projectService.refreshHomeProjects(); usersApiService.clearAuthorsCache(); } catch (IOException e) { logger.error("Unable to create version {} for {}", pendingVersion.getVersionString(), getHangarPrincipal().getName(), e); diff --git a/src/main/java/io/papermc/hangar/service/internal/visibility/ProjectVisibilityService.java b/src/main/java/io/papermc/hangar/service/internal/visibility/ProjectVisibilityService.java index 2282b3df..2ac72016 100644 --- a/src/main/java/io/papermc/hangar/service/internal/visibility/ProjectVisibilityService.java +++ b/src/main/java/io/papermc/hangar/service/internal/visibility/ProjectVisibilityService.java @@ -6,6 +6,7 @@ import org.springframework.stereotype.Service; import java.util.Map.Entry; +import io.papermc.hangar.db.dao.internal.projects.HangarProjectsDAO; import io.papermc.hangar.db.dao.internal.table.VisibilityDAO; import io.papermc.hangar.db.dao.internal.table.projects.ProjectsDAO; import io.papermc.hangar.model.db.projects.ProjectTable; @@ -14,7 +15,6 @@ import io.papermc.hangar.model.internal.job.UpdateDiscourseProjectTopicJob; import io.papermc.hangar.model.internal.logs.LogAction; import io.papermc.hangar.model.internal.logs.contexts.ProjectContext; import io.papermc.hangar.service.internal.JobService; -import io.papermc.hangar.service.internal.projects.HomeProjectService; @Service public class ProjectVisibilityService extends VisibilityService { @@ -22,15 +22,15 @@ public class ProjectVisibilityService extends VisibilityService