From f1ed790cab6fff2e43471aeb8849d79160659745 Mon Sep 17 00:00:00 2001 From: Roberto Guagliardo Date: Sun, 1 Feb 2026 04:20:35 +0000 Subject: [PATCH] feat: enhance repository metadata resolution and build URL for plugin licenses --- server/index.js | 61 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/server/index.js b/server/index.js index 9d6ad02..21163ec 100644 --- a/server/index.js +++ b/server/index.js @@ -34,6 +34,52 @@ try { process.exit(1); } +function buildRepoUrl(repoEntry) { + if (!repoEntry) return null; + if (repoEntry.provider === "gitea") { + const base = (repoEntry.baseUrl || "").replace(/\/$/, ""); + return base && repoEntry.repo ? `${base}/${repoEntry.repo}` : null; + } + return `https://github.com/${repoEntry.repo}`; +} + +async function resolveRepoMetaFromRequest(body = {}) { + const owner = typeof body.owner === "string" ? body.owner.trim() : ""; + const repository = typeof body.repository === "string" ? body.repository.trim() : ""; + if (!owner || !repository) { + return null; + } + + const provider = (body.provider || body.repoProvider || "github").toLowerCase(); + const baseUrl = body.baseUrl || body.repoBaseUrl || (provider === "github" ? "https://github.com" : null); + + const repoEntry = normalizeRepoInput( + { repo: `${owner}/${repository}`, provider, baseUrl }, + { repo: `${owner}/${repository}`, provider, baseUrl } + ); + + if (!repoEntry) { + return null; + } + + try { + const info = await fetchRepo(repoEntry); + const manifest = await fetchManifest(repoEntry, info.defaultBranch).catch(() => null); + const releases = await fetchReleases(repoEntry).catch(() => []); + const latestRelease = releases[0]; + const version = manifest?.version || latestRelease?.tag || latestRelease?.name || info.defaultBranch || null; + const pluginName = manifest?.plugin_name || info.name || repository; + + return { + repoEntry, + pluginName, + version + }; + } catch (error) { + return null; + } +} + app.post("/api/auth/register", async (req, res) => { try { const { username, name, email, password } = req.body || {}; @@ -388,7 +434,20 @@ app.post("/api/licenses/verify", async (req, res) => { } const license = await findLicenseByKey(String(key).trim()); if (!license) { - return res.status(404).json({ valid: false, error: "Licentie niet gevonden." }); + const repoMeta = await resolveRepoMetaFromRequest(req.body); + const fallbackPayload = repoMeta + ? { + pluginVersion: repoMeta.version, + license: { + pluginName: repoMeta.pluginName, + pluginVersion: repoMeta.version, + repoFullName: repoMeta.repoEntry.repo, + repoUrl: buildRepoUrl(repoMeta.repoEntry), + repo: repoMeta.repoEntry + } + } + : {}; + return res.status(404).json({ valid: false, error: "Licentie niet gevonden.", ...fallbackPayload }); } const rawVersion = req.body?.currentVersion ?? req.body?.pluginVersion ?? null;