feat: add download functionality for licenses and enhance plugin detail view
This commit is contained in:
65
server/lib/downloadService.js
Normal file
65
server/lib/downloadService.js
Normal file
@@ -0,0 +1,65 @@
|
||||
import { fetchRepo, fetchReleases, normalizeRepoInput } from "./pluginService.js";
|
||||
|
||||
export function buildDownloadUrl(repoEntry, version, sourceType = "release") {
|
||||
const ownerRepo = repoEntry.repo;
|
||||
if (repoEntry.provider === "gitea") {
|
||||
const sanitizedBase = (repoEntry.baseUrl || "").replace(/\/$/, "");
|
||||
const [owner, repo] = ownerRepo.split("/");
|
||||
return `${sanitizedBase}/repos/${owner}/${repo}/archive/${version}.zip`;
|
||||
}
|
||||
const refType = sourceType === "release" ? "tags" : "heads";
|
||||
return `https://codeload.github.com/${ownerRepo}/zip/refs/${refType}/${version}`;
|
||||
}
|
||||
|
||||
export async function resolveRepoDownload(repoEntry, requestedVersion = "latest") {
|
||||
const normalizedEntry = normalizeRepoInput(repoEntry, {
|
||||
repo: repoEntry.repo,
|
||||
provider: repoEntry.provider,
|
||||
baseUrl: repoEntry.baseUrl
|
||||
});
|
||||
if (!normalizedEntry) {
|
||||
throw new Error("Kon repository gegevens niet bepalen.");
|
||||
}
|
||||
|
||||
const repoInfo = await fetchRepo(normalizedEntry);
|
||||
const releases = await fetchReleases(normalizedEntry).catch(() => []);
|
||||
|
||||
let targetVersion = requestedVersion || "latest";
|
||||
let sourceType = "release";
|
||||
|
||||
if (targetVersion === "latest") {
|
||||
if (releases.length > 0) {
|
||||
targetVersion = releases[0].tag;
|
||||
} else {
|
||||
targetVersion = repoInfo.defaultBranch || "main";
|
||||
sourceType = "branch";
|
||||
}
|
||||
} else {
|
||||
const found = releases.find((release) => release.tag === targetVersion || release.name === targetVersion);
|
||||
if (!found) {
|
||||
sourceType = "branch";
|
||||
} else {
|
||||
targetVersion = found.tag;
|
||||
}
|
||||
}
|
||||
|
||||
const downloadUrl = buildDownloadUrl(normalizedEntry, targetVersion, sourceType);
|
||||
const filenameBase = repoInfo.name || normalizedEntry.repo.split("/").pop() || "plugin";
|
||||
return {
|
||||
url: downloadUrl,
|
||||
version: targetVersion,
|
||||
sourceType,
|
||||
filename: `${filenameBase}-${targetVersion}.zip`,
|
||||
repoEntry: normalizedEntry,
|
||||
repoInfo
|
||||
};
|
||||
}
|
||||
|
||||
export async function getDownloadSourceForLicense(licenseRow, requestedVersion = "latest") {
|
||||
const repoEntry = {
|
||||
repo: licenseRow.repo_name,
|
||||
provider: licenseRow.repo_provider,
|
||||
baseUrl: licenseRow.repo_base_url
|
||||
};
|
||||
return resolveRepoDownload(repoEntry, requestedVersion);
|
||||
}
|
||||
Reference in New Issue
Block a user