Readd preloading of previous version

This commit is contained in:
Nassim Jahnke 2022-08-01 19:11:37 +02:00 committed by MiniDigger | Martin
parent 62b1d92b91
commit 0c893e061b
6 changed files with 63 additions and 84 deletions

View File

@ -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") }}

View File

@ -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>

View File

@ -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));
}
}

View File

@ -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) {
}

View File

@ -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;
}

View File

@ -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) {