move downloads from UI to the cdn

This commit is contained in:
MiniDigger | Martin 2022-08-17 07:30:49 +02:00
parent 5100beb755
commit ebe04a3dd5
13 changed files with 42 additions and 21 deletions

View File

@ -38,14 +38,7 @@ const props = withDefaults(
);
function downloadLink(platform: Platform, version: DownloadableVersion) {
if (version && version.downloads[platform]?.externalUrl) {
return version.downloads[platform].externalUrl;
}
const versionString = version.name;
//TODO as normal path then using the api
const path = `/api/v1/projects/${props.project.namespace.owner}/${props.project.namespace.slug}/versions/${versionString}/${platform.toLowerCase()}/download`;
return import.meta.env.SSR ? path : `${window.location.protocol}//${window.location.host}${path}`;
return version && version.downloads[platform]?.externalUrl ? version.downloads[platform].externalUrl : version.downloads[platform].downloadUrl;
}
const external = computed(() => false);

View File

@ -23,6 +23,7 @@ public class StorageConfig {
private String secretKey;
private String bucket;
private String objectStorageEndpoint;
private String cdnEndpoint;
@Bean
public StaticCredentialsProvider credProvider() {
@ -81,4 +82,12 @@ public class StorageConfig {
public void setBucket(String bucket) {
this.bucket = bucket;
}
public String getCdnEndpoint() {
return cdnEndpoint;
}
public void setCdnEndpoint(String cdnEndpoint) {
this.cdnEndpoint = cdnEndpoint;
}
}

View File

@ -2,5 +2,5 @@ package io.papermc.hangar.model.api.project.version;
import org.jetbrains.annotations.Nullable;
public record PlatformVersionDownload(@Nullable FileInfo fileInfo, @Nullable String externalUrl) {
public record PlatformVersionDownload(@Nullable FileInfo fileInfo, @Nullable String externalUrl, @Nullable String downloadUrl) {
}

View File

@ -38,7 +38,7 @@ public class VersionsApiService extends HangarComponent {
if (version == null) {
throw new HangarApiException(HttpStatus.NOT_FOUND);
}
versionDependencyService.addDownloadsAndDependencies(version.getKey(), version.getValue());
versionDependencyService.addDownloadsAndDependencies(author, slug, versionString, version.getKey(), version.getValue());
return version.getValue();
}
@ -46,7 +46,7 @@ public class VersionsApiService extends HangarComponent {
public PaginatedResult<Version> getVersions(String author, String slug, RequestPagination pagination) {
boolean canSeeHidden = getGlobalPermissions().has(Permission.SeeHidden);
List<Version> versions = versionsApiDAO.getVersions(author, slug, canSeeHidden, getHangarUserId(), pagination).entrySet().stream()
.map(entry -> versionDependencyService.addDownloadsAndDependencies(entry.getKey(), entry.getValue()))
.map(entry -> versionDependencyService.addDownloadsAndDependencies(author, slug, entry.getValue().getName(), entry.getKey(), entry.getValue()))
.sorted((v1, v2) -> v2.getCreatedAt().compareTo(v1.getCreatedAt()))
.collect(Collectors.toList());
Long versionCount = versionsApiDAO.getVersionCount(author, slug, canSeeHidden, getHangarUserId(), pagination);

View File

@ -3,6 +3,7 @@ package io.papermc.hangar.service.internal.file;
import org.springframework.core.io.Resource;
import java.io.IOException;
import java.io.InputStream;
import io.papermc.hangar.model.common.Platform;
public interface FileService {
@ -25,4 +26,6 @@ public interface FileService {
String resolve(String path, String fileName);
String getRoot();
String getDownloadUrl(String user, String project, String version, Platform platform, String fileName);
}

View File

@ -1,6 +1,8 @@
package io.papermc.hangar.service.internal.file;
import io.papermc.hangar.config.hangar.HangarConfig;
import io.papermc.hangar.config.hangar.StorageConfig;
import io.papermc.hangar.model.common.Platform;
import io.papermc.hangar.util.FileUtils;
import java.io.IOException;
import java.io.InputStream;
@ -17,9 +19,11 @@ import org.springframework.stereotype.Service;
public class LocalStorageFileService implements FileService {
private final StorageConfig config;
private final HangarConfig hangarConfig;
public LocalStorageFileService(StorageConfig config) {
public LocalStorageFileService(StorageConfig config, HangarConfig hangarConfig) {
this.config = config;
this.hangarConfig = hangarConfig;
}
@Override
@ -89,4 +93,9 @@ public class LocalStorageFileService implements FileService {
public String getRoot() {
return config.getPluginUploadDir();
}
@Override
public String getDownloadUrl(String user, String project, String version, Platform platform, String fileName) {
return hangarConfig.getBaseUrl() + "/api/v1/projects/" + user + "/" + project + "/versions/" + version + "/" + platform.name() + "/download";
}
}

View File

@ -3,6 +3,7 @@ package io.papermc.hangar.service.internal.file;
import io.awspring.cloud.s3.S3Resource;
import io.awspring.cloud.s3.S3Template;
import io.papermc.hangar.config.hangar.StorageConfig;
import io.papermc.hangar.model.common.Platform;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@ -88,4 +89,9 @@ public class S3FileService implements FileService {
public String getRoot() {
return "s3://" + config.getBucket() + "/";
}
@Override
public String getDownloadUrl(String user, String project, String version, Platform platform, String fileName) {
return config.getCdnEndpoint() + "/" + config.getBucket() + "/plugins/" + user + "/" + project + "/versions/" + version + "/" + platform.name() + "/" + fileName;
}
}

View File

@ -137,7 +137,7 @@ public class ProjectService extends HangarComponent {
}
HangarProjectInfo info = hangarProjectsDAO.getHangarProjectInfo(project.getLeft());
Map<Long, HangarProjectPage> pages = projectPageService.getProjectPages(project.getLeft());
final List<HangarProject.PinnedVersion> pinnedVersions = this.pinnedVersionService.getPinnedVersions(project.getLeft());
final List<HangarProject.PinnedVersion> pinnedVersions = this.pinnedVersionService.getPinnedVersions(project.getRight().getNamespace().getOwner(), project.getRight().getNamespace().getSlug(), project.getLeft());
final Map<Platform, HangarVersion> mainChannelVersions = new EnumMap<>(Platform.class);
for (final Platform platform : Platform.getValues()) {
@ -149,7 +149,7 @@ public class ProjectService extends HangarComponent {
for (final Map.Entry<Platform, SortedSet<String>> entry : platformDependencies.entrySet()) {
version.getPlatformDependenciesFormatted().put(entry.getKey(), io.papermc.hangar.util.StringUtils.formatVersionNumbers(new ArrayList<>(entry.getValue())));
}
downloadService.addDownloads(version.getId(), version.getDownloads());
downloadService.addDownloads(project.getRight().getNamespace().getOwner(), project.getRight().getNamespace().getSlug(), version.getName(), version.getId(), version.getDownloads());
}
mainChannelVersions.put(platform, version);

View File

@ -174,7 +174,7 @@ public class DownloadService extends HangarComponent {
return true;
}
public void addDownloads(long versionId, Map<Platform, PlatformVersionDownload> versionDownloadsMap) {
public void addDownloads(String user, String project, String version, long versionId, Map<Platform, PlatformVersionDownload> versionDownloadsMap) {
// TODO into one query
final List<ProjectVersionDownloadTable> versionDownloads = downloadsDAO.getDownloads(versionId);
final List<ProjectVersionPlatformDownloadTable> platformDownloads = downloadsDAO.getPlatformDownloads(versionId);
@ -188,7 +188,7 @@ public class DownloadService extends HangarComponent {
final ProjectVersionDownloadTable downloadTable = versionDownloads.stream().filter(table -> table.getId() == platformDownload.getDownloadId()).findAny().orElseThrow(NullPointerException::new);
final FileInfo fileInfo = downloadTable.getFileName() != null ? new FileInfo(downloadTable.getFileName(), downloadTable.getFileSize(), downloadTable.getHash()) : null;
download = new PlatformVersionDownload(fileInfo, downloadTable.getExternalUrl());
download = new PlatformVersionDownload(fileInfo, downloadTable.getExternalUrl(), fileService.getDownloadUrl(user, project, version, platformDownload.getPlatform(), fileInfo != null ? fileInfo.getName() : null));
downloads.put(platformDownload.getDownloadId(), download);
versionDownloadsMap.put(platformDownload.getPlatform(), download);
}

View File

@ -42,14 +42,14 @@ public class PinnedVersionService extends HangarComponent {
this.pinnedProjectVersionsDAO.deleteVersion(projectId, versionId);
}
public List<HangarProject.PinnedVersion> getPinnedVersions(final long projectId) {
public List<HangarProject.PinnedVersion> getPinnedVersions(final String user, final String project, final long projectId) {
final List<HangarProject.PinnedVersion> versions = this.hangarVersionsDAO.getPinnedVersions(projectId);
for (final HangarProject.PinnedVersion version : versions) {
final Map<Platform, SortedSet<String>> platformDependencies = versionsApiDAO.getPlatformDependencies(version.getVersionId());
for (final Map.Entry<Platform, SortedSet<String>> entry : platformDependencies.entrySet()) {
version.getPlatformDependenciesFormatted().put(entry.getKey(), StringUtils.formatVersionNumbers(new ArrayList<>(entry.getValue())));
}
downloadService.addDownloads(version.getVersionId(), version.getDownloads());
downloadService.addDownloads(user, project, version.getName(), version.getVersionId(), version.getDownloads());
}
return versions;
}

View File

@ -63,7 +63,7 @@ public class VersionDependencyService extends HangarComponent {
return projectVersionPlatformDependenciesDAO.getForVersion(versionId);
}
public <T extends Version> T addDownloadsAndDependencies(final long versionId, final T version) {
public <T extends Version> T addDownloadsAndDependencies(final String user, final String project, final String versionName, final long versionId, final T version) {
final Map<Platform, SortedSet<String>> platformDependencies = versionsApiDAO.getPlatformDependencies(versionId);
version.getPlatformDependencies().putAll(platformDependencies);
for (final Map.Entry<Platform, SortedSet<String>> entry : platformDependencies.entrySet()) {
@ -78,7 +78,7 @@ public class VersionDependencyService extends HangarComponent {
}
}
downloadService.addDownloads(versionId, version.getDownloads());
downloadService.addDownloads(user, project, versionName, versionId, version.getDownloads());
return version;
}

View File

@ -74,7 +74,7 @@ public class VersionService extends HangarComponent {
throw new HangarApiException(HttpStatus.NOT_FOUND);
}
versionDependencyService.addDownloadsAndDependencies(version.getId(), version);
versionDependencyService.addDownloadsAndDependencies(author, slug, versionString, version.getId(), version);
return version;
}

View File

@ -192,6 +192,7 @@ hangar:
secret-key: "toOBAwlz3ZC6c4dvbFh7Ywk8Y2J4b3kS"
bucket: "test"
object-storage-endpoint: "http://127.0.0.1:9000"
cdn-endpoint: "http://127.0.0.1:9000"
#################
# Debug Logging #