Files
siti-plugin-repo/server/lib/downloadService.js

66 lines
2.3 KiB
JavaScript

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}/${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);
}