mirror of
https://github.com/HangarMC/Hangar.git
synced 2025-02-11 14:52:01 +08:00
Readd preloading of previous version
This commit is contained in:
parent
62b1d92b91
commit
0c893e061b
@ -97,7 +97,7 @@ defineExpose({ dependencies, reset: reset });
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<Table>
|
||||
<Table v-if="dependencies.length !== 0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{{ t("general.name") }}</th>
|
||||
@ -152,7 +152,7 @@ defineExpose({ dependencies, reset: reset });
|
||||
</tr>
|
||||
</tbody>
|
||||
</Table>
|
||||
<div v-if="!noEditing" class="m-2">
|
||||
<div v-if="!noEditing" class="m-2" :class="dependencies.length !== 0 ? '-mt-2' : ''">
|
||||
<Button block @click="addDep">
|
||||
<IconMdiPlus />
|
||||
{{ t("general.add") }}
|
||||
|
@ -365,19 +365,19 @@ useHead(
|
||||
<template #dependencies>
|
||||
<p class="mb-4">{{ i18n.t("version.new.form.platformVersionsDescription") }}</p>
|
||||
<h2 class="text-xl mt-2 mb-2">{{ t("version.new.form.platformVersions") }}</h2>
|
||||
<div class="flex flex-wrap gap-y-3 mb-5">
|
||||
<div class="flex flex-wrap space-y-5 mb-8">
|
||||
<div v-for="platform in selectedPlatformsData" :key="platform.enumName" class="basis-full">
|
||||
<div>{{ platform.name }}</div>
|
||||
<span class="text-lg inline-flex items-center"><PlatformLogo :platform="platform.enumName" :size="25" class="mr-1" /> {{ platform.name }}</span>
|
||||
<div class="mt-2">
|
||||
<InputTag v-model="pendingVersion.platformDependencies[platform.enumName]" :options="platform.possibleVersions" :rules="platformVersionRules" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h2 class="text-xl mb-2">{{ t("version.new.form.dependencies") }}</h2>
|
||||
<div class="flex flex-wrap gap-y-3">
|
||||
<h2 class="text-xl mb-3">{{ t("version.new.form.dependencies") }}</h2>
|
||||
<div class="flex flex-wrap space-y-7">
|
||||
<div v-for="platform in selectedPlatformsData" :key="platform.enumName" class="basis-full">
|
||||
<div>{{ platform.name }}</div>
|
||||
<span class="text-lg inline-flex items-center"><PlatformLogo :platform="platform.enumName" :size="25" class="mr-1" /> {{ platform.name }}</span>
|
||||
<DependencyTable ref="dependencyTables" :key="`${platform.name}-deps-table`" :platform="platform.enumName" :version="pendingVersion" is-new />
|
||||
</div>
|
||||
</div>
|
||||
|
@ -13,7 +13,6 @@ 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.model.internal.versions.HangarVersion;
|
||||
import io.papermc.hangar.model.internal.versions.LastDependencies;
|
||||
import io.papermc.hangar.model.internal.versions.MultipartFileOrUrl;
|
||||
import io.papermc.hangar.model.internal.versions.PendingVersion;
|
||||
import io.papermc.hangar.security.annotations.permission.PermissionRequired;
|
||||
@ -193,11 +192,4 @@ public class VersionController extends HangarComponent {
|
||||
}
|
||||
return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
|
||||
}
|
||||
|
||||
@VisibilityRequired(type = Type.PROJECT, args = "{#author, #slug}")
|
||||
@RateLimit(overdraft = 7, refillTokens = 3, greedy = true)
|
||||
@GetMapping(path = "/version/{author}/{slug}/lastdependencies")
|
||||
public ResponseEntity<LastDependencies> getLastVersionDependencies(@PathVariable String author, @PathVariable String slug, @RequestParam(required = false) String channel, @RequestParam String platform) {
|
||||
return ResponseEntity.ok(versionService.getLastVersionDependencies(author, slug, channel, platform));
|
||||
}
|
||||
}
|
||||
|
@ -2,31 +2,8 @@ package io.papermc.hangar.model.internal.versions;
|
||||
|
||||
import io.papermc.hangar.model.api.project.version.PluginDependency;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.SortedSet;
|
||||
|
||||
public class LastDependencies {
|
||||
public static final LastDependencies EMPTY = new LastDependencies(List.of(), List.of());
|
||||
private final List<String> platformDependencies;
|
||||
private final List<PluginDependency> pluginDependencies;
|
||||
|
||||
public LastDependencies(List<String> platformDependencies, List<PluginDependency> pluginDependencies) {
|
||||
this.platformDependencies = platformDependencies;
|
||||
this.pluginDependencies = pluginDependencies;
|
||||
}
|
||||
|
||||
public List<String> getPlatformDependencies() {
|
||||
return platformDependencies;
|
||||
}
|
||||
|
||||
public List<PluginDependency> getPluginDependencies() {
|
||||
return pluginDependencies;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "LastDependencies{" +
|
||||
"platformDependencies=" + platformDependencies +
|
||||
", pluginDependencies=" + pluginDependencies +
|
||||
'}';
|
||||
}
|
||||
public record LastDependencies(SortedSet<String> platformDependencies, Set<PluginDependency> pluginDependencies) {
|
||||
}
|
||||
|
@ -4,14 +4,18 @@ import com.github.benmanes.caffeine.cache.Cache;
|
||||
import com.github.benmanes.caffeine.cache.Caffeine;
|
||||
import com.github.benmanes.caffeine.cache.RemovalCause;
|
||||
import io.papermc.hangar.HangarComponent;
|
||||
import io.papermc.hangar.controller.extras.pagination.filters.versions.VersionChannelFilter;
|
||||
import io.papermc.hangar.controller.extras.pagination.filters.versions.VersionPlatformFilter;
|
||||
import io.papermc.hangar.db.dao.internal.table.PlatformVersionDAO;
|
||||
import io.papermc.hangar.db.dao.internal.table.versions.ProjectVersionsDAO;
|
||||
import io.papermc.hangar.db.dao.internal.table.versions.dependencies.ProjectVersionDependenciesDAO;
|
||||
import io.papermc.hangar.db.dao.internal.table.versions.dependencies.ProjectVersionPlatformDependenciesDAO;
|
||||
import io.papermc.hangar.db.dao.internal.table.versions.downloads.ProjectVersionDownloadsDAO;
|
||||
import io.papermc.hangar.db.dao.v1.VersionsApiDAO;
|
||||
import io.papermc.hangar.exceptions.HangarApiException;
|
||||
import io.papermc.hangar.model.api.project.version.FileInfo;
|
||||
import io.papermc.hangar.model.api.project.version.PluginDependency;
|
||||
import io.papermc.hangar.model.api.requests.RequestPagination;
|
||||
import io.papermc.hangar.model.common.ChannelFlag;
|
||||
import io.papermc.hangar.model.common.Platform;
|
||||
import io.papermc.hangar.model.common.projects.Visibility;
|
||||
@ -27,6 +31,7 @@ import io.papermc.hangar.model.internal.job.UpdateDiscourseProjectTopicJob;
|
||||
import io.papermc.hangar.model.internal.job.UpdateDiscourseVersionPostJob;
|
||||
import io.papermc.hangar.model.internal.logs.LogAction;
|
||||
import io.papermc.hangar.model.internal.logs.contexts.VersionContext;
|
||||
import io.papermc.hangar.model.internal.versions.LastDependencies;
|
||||
import io.papermc.hangar.model.internal.versions.MultipartFileOrUrl;
|
||||
import io.papermc.hangar.model.internal.versions.PendingVersion;
|
||||
import io.papermc.hangar.model.internal.versions.PendingVersionFile;
|
||||
@ -97,9 +102,10 @@ public class VersionFactory extends HangarComponent {
|
||||
private final JobService jobService;
|
||||
private final ValidationService validationService;
|
||||
private final ProjectVersionDownloadsDAO downloadsDAO;
|
||||
private final VersionsApiDAO versionsApiDAO;
|
||||
|
||||
@Autowired
|
||||
public VersionFactory(ProjectVersionPlatformDependenciesDAO projectVersionPlatformDependencyDAO, ProjectVersionDependenciesDAO projectVersionDependencyDAO, PlatformVersionDAO platformVersionDAO, ProjectVersionsDAO projectVersionDAO, ProjectFiles projectFiles, PluginDataService pluginDataService, ChannelService channelService, ProjectVisibilityService projectVisibilityService, ProjectService projectService, NotificationService notificationService, PlatformService platformService, UsersApiService usersApiService, JobService jobService, ValidationService validationService, final ProjectVersionDownloadsDAO downloadsDAO) {
|
||||
public VersionFactory(ProjectVersionPlatformDependenciesDAO projectVersionPlatformDependencyDAO, ProjectVersionDependenciesDAO projectVersionDependencyDAO, PlatformVersionDAO platformVersionDAO, ProjectVersionsDAO projectVersionDAO, ProjectFiles projectFiles, PluginDataService pluginDataService, ChannelService channelService, ProjectVisibilityService projectVisibilityService, ProjectService projectService, NotificationService notificationService, PlatformService platformService, UsersApiService usersApiService, JobService jobService, ValidationService validationService, final ProjectVersionDownloadsDAO downloadsDAO, final VersionsApiDAO versionsApiDAO) {
|
||||
this.projectVersionPlatformDependenciesDAO = projectVersionPlatformDependencyDAO;
|
||||
this.projectVersionDependenciesDAO = projectVersionDependencyDAO;
|
||||
this.platformVersionDAO = platformVersionDAO;
|
||||
@ -115,9 +121,15 @@ public class VersionFactory extends HangarComponent {
|
||||
this.jobService = jobService;
|
||||
this.validationService = validationService;
|
||||
this.downloadsDAO = downloadsDAO;
|
||||
this.versionsApiDAO = versionsApiDAO;
|
||||
}
|
||||
|
||||
public PendingVersion createPendingVersion(final long projectId, final List<MultipartFileOrUrl> data, final List<MultipartFile> files) {
|
||||
final ProjectTable projectTable = projectService.getProjectTable(projectId);
|
||||
if (projectTable == null) {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
|
||||
final ProjectChannelTable projectChannelTable = channelService.getFirstChannel(projectId);
|
||||
final Map<Platform, Set<PluginDependency>> pluginDependencies = new EnumMap<>(Platform.class);
|
||||
final Map<Platform, SortedSet<String>> platformDependencies = new EnumMap<>(Platform.class);
|
||||
@ -141,6 +153,13 @@ public class VersionFactory extends HangarComponent {
|
||||
if (fileOrUrl.isUrl()) {
|
||||
// Handle external url
|
||||
pendingFiles.add(new PendingVersionFile(fileOrUrl.platforms(), null, fileOrUrl.externalUrl()));
|
||||
for (final Platform platform : fileOrUrl.platforms()) {
|
||||
final LastDependencies lastDependencies = getLastVersionDependencies(projectTable.getOwnerName(), projectTable.getSlug(), null, platform);
|
||||
if (lastDependencies != null) {
|
||||
pluginDependencies.put(platform, lastDependencies.pluginDependencies());
|
||||
platformDependencies.put(platform, lastDependencies.platformDependencies());
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -179,7 +198,15 @@ public class VersionFactory extends HangarComponent {
|
||||
final FileInfo fileInfo = new FileInfo(pluginDataFile.getPath().getFileName().toString(), pluginDataFile.getPath().toFile().length(), pluginDataFile.getMd5());
|
||||
pendingFiles.add(new PendingVersionFile(fileOrUrl.platforms(), fileInfo, null));
|
||||
for (final Platform platform : fileOrUrl.platforms()) {
|
||||
//TODO add last version data if present, if not present the file data
|
||||
//TODO include channel in last dep search - currently only in the step after jar uploading
|
||||
final LastDependencies lastDependencies = getLastVersionDependencies(projectTable.getOwnerName(), projectTable.getSlug(), null, platform);
|
||||
if (lastDependencies != null) {
|
||||
pluginDependencies.put(platform, lastDependencies.pluginDependencies());
|
||||
platformDependencies.put(platform, lastDependencies.platformDependencies());
|
||||
continue;
|
||||
}
|
||||
|
||||
// If no previous version present, use uploaded version data
|
||||
final Set<PluginDependency> loadedPluginDependencies = pluginDataFile.getData().getDependencies().get(platform);
|
||||
if (loadedPluginDependencies != null) {
|
||||
pluginDependencies.put(platform, loadedPluginDependencies);
|
||||
@ -194,11 +221,6 @@ public class VersionFactory extends HangarComponent {
|
||||
|
||||
tempDirCache.put(userTempDir, DUMMY);
|
||||
|
||||
final ProjectTable projectTable = projectService.getProjectTable(projectId);
|
||||
if (projectTable == null) {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
|
||||
for (final Platform platform : processedPlatforms) {
|
||||
platformDependencies.putIfAbsent(platform, Collections.emptySortedSet());
|
||||
pluginDependencies.putIfAbsent(platform, Collections.emptySet());
|
||||
@ -381,6 +403,29 @@ public class VersionFactory extends HangarComponent {
|
||||
}
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public @Nullable LastDependencies getLastVersionDependencies(final String author, final String slug, @Nullable final String channel, final Platform platform) {
|
||||
//TODO optimize with specific query
|
||||
final RequestPagination pagination = new RequestPagination(1L, 0L);
|
||||
pagination.getFilters().add(new VersionPlatformFilter.VersionPlatformFilterInstance(new Platform[]{platform}));
|
||||
if (channel != null) {
|
||||
// Find the last version with the specified channel
|
||||
pagination.getFilters().add(new VersionChannelFilter.VersionChannelFilterInstance(new String[]{channel}));
|
||||
}
|
||||
|
||||
final Long versionId = versionsApiDAO.getVersions(author, slug, false, getHangarUserId(), pagination).keySet().stream().findAny().orElse(null);
|
||||
if (versionId != null) {
|
||||
final SortedSet<String> platformDependency = versionsApiDAO.getPlatformDependencies(versionId).get(platform);
|
||||
if (platformDependency != null) {
|
||||
return new LastDependencies(platformDependency, versionsApiDAO.getPluginDependencies(versionId, platform));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// Try again with any channel, else empty
|
||||
return channel != null ? getLastVersionDependencies(author, slug, null, platform) : null;
|
||||
}
|
||||
|
||||
private boolean exists(long projectId, String versionString) {
|
||||
return projectVersionsDAO.getProjectVersion(projectId, versionString) != null;
|
||||
}
|
||||
|
@ -1,23 +1,17 @@
|
||||
package io.papermc.hangar.service.internal.versions;
|
||||
|
||||
import io.papermc.hangar.HangarComponent;
|
||||
import io.papermc.hangar.controller.extras.pagination.filters.versions.VersionChannelFilter;
|
||||
import io.papermc.hangar.controller.extras.pagination.filters.versions.VersionPlatformFilter;
|
||||
import io.papermc.hangar.db.dao.internal.table.projects.ProjectsDAO;
|
||||
import io.papermc.hangar.db.dao.internal.table.versions.ProjectVersionsDAO;
|
||||
import io.papermc.hangar.db.dao.internal.versions.HangarVersionsDAO;
|
||||
import io.papermc.hangar.db.dao.v1.VersionsApiDAO;
|
||||
import io.papermc.hangar.exceptions.HangarApiException;
|
||||
import io.papermc.hangar.model.api.requests.RequestPagination;
|
||||
import io.papermc.hangar.model.common.Permission;
|
||||
import io.papermc.hangar.model.common.Platform;
|
||||
import io.papermc.hangar.model.common.projects.Visibility;
|
||||
import io.papermc.hangar.model.db.projects.ProjectTable;
|
||||
import io.papermc.hangar.model.db.versions.ProjectVersionTable;
|
||||
import io.papermc.hangar.model.internal.logs.LogAction;
|
||||
import io.papermc.hangar.model.internal.logs.contexts.VersionContext;
|
||||
import io.papermc.hangar.model.internal.versions.HangarVersion;
|
||||
import io.papermc.hangar.model.internal.versions.LastDependencies;
|
||||
import io.papermc.hangar.service.internal.projects.ProjectFactory;
|
||||
import io.papermc.hangar.service.internal.uploads.ProjectFiles;
|
||||
import io.papermc.hangar.service.internal.visibility.ProjectVersionVisibilityService;
|
||||
@ -30,15 +24,12 @@ import org.springframework.http.HttpStatus;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.SortedSet;
|
||||
|
||||
@Service
|
||||
public class VersionService extends HangarComponent {
|
||||
|
||||
private final ProjectVersionsDAO projectVersionsDAO;
|
||||
private final VersionsApiDAO versionsApiDAO;
|
||||
private final HangarVersionsDAO hangarVersionsDAO;
|
||||
private final ProjectVisibilityService projectVisibilityService;
|
||||
private final ProjectVersionVisibilityService projectVersionVisibilityService;
|
||||
@ -47,9 +38,8 @@ public class VersionService extends HangarComponent {
|
||||
private final ProjectsDAO projectsDAO;
|
||||
|
||||
@Autowired
|
||||
public VersionService(ProjectVersionsDAO projectVersionDAO, VersionsApiDAO versionsApiDAO, HangarVersionsDAO hangarProjectsDAO, ProjectVisibilityService projectVisibilityService, ProjectVersionVisibilityService projectVersionVisibilityService, VersionDependencyService versionDependencyService, ProjectFiles projectFiles, final ProjectsDAO projectsDAO) {
|
||||
public VersionService(ProjectVersionsDAO projectVersionDAO, HangarVersionsDAO hangarProjectsDAO, ProjectVisibilityService projectVisibilityService, ProjectVersionVisibilityService projectVersionVisibilityService, VersionDependencyService versionDependencyService, ProjectFiles projectFiles, final ProjectsDAO projectsDAO) {
|
||||
this.projectVersionsDAO = projectVersionDAO;
|
||||
this.versionsApiDAO = versionsApiDAO;
|
||||
this.hangarVersionsDAO = hangarProjectsDAO;
|
||||
this.projectVisibilityService = projectVisibilityService;
|
||||
this.projectVersionVisibilityService = projectVersionVisibilityService;
|
||||
@ -85,31 +75,6 @@ public class VersionService extends HangarComponent {
|
||||
return version;
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public LastDependencies getLastVersionDependencies(String author, String slug, @Nullable String channel, String platformName) {
|
||||
//TODO optimize with specific query
|
||||
Platform platform = Platform.valueOf(platformName.toUpperCase());
|
||||
|
||||
RequestPagination pagination = new RequestPagination(1L, 0L);
|
||||
pagination.getFilters().add(new VersionPlatformFilter.VersionPlatformFilterInstance(new Platform[]{platform}));
|
||||
if (channel != null) {
|
||||
// Find the last version with the specified channel
|
||||
pagination.getFilters().add(new VersionChannelFilter.VersionChannelFilterInstance(new String[]{channel}));
|
||||
}
|
||||
|
||||
Long versionId = versionsApiDAO.getVersions(author, slug, false, getHangarUserId(), pagination).keySet().stream().findAny().orElse(null);
|
||||
if (versionId != null) {
|
||||
SortedSet<String> platformDependency = versionsApiDAO.getPlatformDependencies(versionId).get(platform);
|
||||
if (platformDependency != null) {
|
||||
return new LastDependencies(new ArrayList<>(platformDependency), new ArrayList<>(versionsApiDAO.getPluginDependencies(versionId, platform)));
|
||||
}
|
||||
return LastDependencies.EMPTY;
|
||||
}
|
||||
|
||||
// Try again with any channel, else empty
|
||||
return channel != null ? getLastVersionDependencies(author, slug, null, platformName) : LastDependencies.EMPTY;
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void softDeleteVersion(long projectId, ProjectVersionTable pvt, String comment) {
|
||||
if (pvt.getVisibility() == Visibility.SOFTDELETE) {
|
||||
|
Loading…
Reference in New Issue
Block a user