Refactor code structure for improved readability and maintainability
This commit is contained in:
118
server/index.js
118
server/index.js
@@ -1,3 +1,4 @@
|
||||
import "dotenv/config";
|
||||
import express from "express";
|
||||
import path from "path";
|
||||
import { Readable } from "node:stream";
|
||||
@@ -328,7 +329,8 @@ app.get("/api/plugins", async (_req, res) => {
|
||||
ownerRepo: repo.ownerRepo,
|
||||
baseUrl: repo.baseUrl,
|
||||
repoId: repo.id,
|
||||
label: repo.label
|
||||
label: repo.label,
|
||||
isPrivate: false
|
||||
};
|
||||
}
|
||||
})
|
||||
@@ -375,23 +377,77 @@ app.get("/api/plugins/:owner/:repo", async (req, res) => {
|
||||
repoRecord = await findRepoByOwnerRepo(ownerRepo);
|
||||
}
|
||||
|
||||
const provider = (req.query.provider || repoRecord?.provider || "github").toLowerCase();
|
||||
const baseUrlQuery =
|
||||
req.query.baseUrl || repoRecord?.baseUrl || (provider === "github" ? "https://github.com" : "");
|
||||
let provider = (req.query.provider || repoRecord?.provider || "github").toLowerCase();
|
||||
if (repoRecord?.provider) {
|
||||
provider = repoRecord.provider;
|
||||
}
|
||||
const baseUrlFallback = provider === "github" ? "https://github.com" : "";
|
||||
let baseUrlQuery = req.query.baseUrl || repoRecord?.baseUrl || baseUrlFallback;
|
||||
if (repoRecord?.baseUrl) {
|
||||
baseUrlQuery = repoRecord.baseUrl;
|
||||
}
|
||||
const entry =
|
||||
repoRecord && repoRecord.ownerRepo
|
||||
? { provider: repoRecord.provider, repo: repoRecord.ownerRepo, baseUrl: repoRecord.baseUrl }
|
||||
? {
|
||||
provider: repoRecord.provider,
|
||||
repo: repoRecord.ownerRepo,
|
||||
baseUrl: repoRecord.baseUrl || baseUrlQuery || undefined
|
||||
}
|
||||
: provider === "github"
|
||||
? ownerRepo
|
||||
: { provider, repo: ownerRepo, baseUrl: baseUrlQuery };
|
||||
const normalizedEntry = normalizeRepoInput(entry, { repo: ownerRepo, provider, baseUrl: baseUrlQuery });
|
||||
const normalizedEntry =
|
||||
normalizeRepoInput(entry, { repo: ownerRepo, provider, baseUrl: baseUrlQuery }) ||
|
||||
null;
|
||||
|
||||
const info = await fetchRepo(entry);
|
||||
const [manifest, releases, commits] = await Promise.all([
|
||||
fetchManifest(entry, info.defaultBranch).catch(() => null),
|
||||
fetchReleases(entry).catch(() => []),
|
||||
fetchCommits(entry).catch(() => [])
|
||||
]);
|
||||
if (!normalizedEntry) {
|
||||
return res.status(400).json({ error: "Ongeldige repository." });
|
||||
}
|
||||
|
||||
let info;
|
||||
let manifest = null;
|
||||
let releases = [];
|
||||
let commits = [];
|
||||
|
||||
try {
|
||||
info = await fetchRepo(normalizedEntry);
|
||||
[manifest, releases, commits] = await Promise.all([
|
||||
fetchManifest(normalizedEntry, info.defaultBranch).catch(() => null),
|
||||
fetchReleases(normalizedEntry).catch(() => []),
|
||||
fetchCommits(normalizedEntry).catch(() => [])
|
||||
]);
|
||||
} catch (fetchError) {
|
||||
console.warn("Kon plugin info niet ophalen:", fetchError.message);
|
||||
const parsed = parseRepoEntry(normalizedEntry);
|
||||
const fallbackRepo = {
|
||||
provider: repoRecord?.provider || parsed.provider,
|
||||
baseUrl: repoRecord?.baseUrl || parsed.baseUrl,
|
||||
repo: repoRecord?.ownerRepo || parsed.ownerRepo
|
||||
};
|
||||
const repoUrl = buildRepoUrl(fallbackRepo);
|
||||
const name = repoRecord?.label || parsed.ownerRepo.split("/")[1] || parsed.ownerRepo;
|
||||
return res.json({
|
||||
fullName: fallbackRepo.repo,
|
||||
name,
|
||||
description: repoRecord?.label ? `Plugin: ${repoRecord.label}` : "Kon gegevens niet ophalen.",
|
||||
repoUrl,
|
||||
provider: fallbackRepo.provider,
|
||||
ownerRepo: fallbackRepo.repo,
|
||||
baseUrl: fallbackRepo.baseUrl,
|
||||
repoId: repoRecord?.id || null,
|
||||
label: repoRecord?.label || null,
|
||||
manifest: null,
|
||||
releases: [],
|
||||
commits: [],
|
||||
download: null,
|
||||
version: null,
|
||||
versionSource: null,
|
||||
isPrivate: false
|
||||
});
|
||||
}
|
||||
|
||||
const isPrivate = Boolean(info?.isPrivate);
|
||||
const allowDownloads = normalizedEntry && !isPrivate;
|
||||
|
||||
const effectiveBaseUrl =
|
||||
normalizedEntry?.baseUrl ||
|
||||
@@ -400,7 +456,7 @@ app.get("/api/plugins/:owner/:repo", async (req, res) => {
|
||||
(provider === "github" ? "https://github.com" : "");
|
||||
|
||||
const releasesWithDownload =
|
||||
normalizedEntry && releases.length > 0
|
||||
allowDownloads && releases.length > 0
|
||||
? releases.map((release) => {
|
||||
const tagOrName = release.tag || release.name;
|
||||
if (!tagOrName) {
|
||||
@@ -420,7 +476,7 @@ app.get("/api/plugins/:owner/:repo", async (req, res) => {
|
||||
: releases;
|
||||
|
||||
let downloadMeta = null;
|
||||
if (normalizedEntry) {
|
||||
if (allowDownloads) {
|
||||
const latestRelease = releasesWithDownload[0];
|
||||
const sourceType = latestRelease ? "release" : "branch";
|
||||
const version = latestRelease?.tag || latestRelease?.name || info.defaultBranch || "main";
|
||||
@@ -454,6 +510,7 @@ app.get("/api/plugins/:owner/:repo", async (req, res) => {
|
||||
manifest,
|
||||
releases: releasesWithDownload,
|
||||
download: downloadMeta,
|
||||
isPrivate,
|
||||
commits
|
||||
});
|
||||
} catch (error) {
|
||||
@@ -502,6 +559,9 @@ app.get("/api/plugins/:owner/:repo/download", async (req, res) => {
|
||||
});
|
||||
stream.pipe(res);
|
||||
} catch (error) {
|
||||
if (error?.meta === "PRIVATE_REPO") {
|
||||
return res.status(403).json({ error: "Downloads voor private plugins zijn uitgeschakeld." });
|
||||
}
|
||||
console.error("Plugin download endpoint error:", error);
|
||||
if (!res.headersSent) {
|
||||
res.status(500).json({ error: "Download mislukt." });
|
||||
@@ -543,20 +603,34 @@ app.post("/api/licenses", requireAuth, async (req, res) => {
|
||||
if (body.repoId && Number.isNaN(repoId)) {
|
||||
return res.status(400).json({ error: "Ongeldig repo id." });
|
||||
}
|
||||
let repoRecord = null;
|
||||
if (repoId) {
|
||||
repoRecord = await getRepoById(repoId);
|
||||
if (!repoRecord) {
|
||||
return res.status(404).json({ error: "Plugin niet gevonden." });
|
||||
}
|
||||
}
|
||||
const repoInput =
|
||||
typeof body.repo === "object"
|
||||
? body.repo
|
||||
: typeof body.plugin === "object"
|
||||
? body.plugin
|
||||
: body.repo || body.ownerRepo || body.fullName || body.plugin;
|
||||
const repoFromRecord = repoRecord
|
||||
? {
|
||||
repo: repoRecord.ownerRepo,
|
||||
provider: repoRecord.provider,
|
||||
baseUrl: repoRecord.baseUrl
|
||||
}
|
||||
: null;
|
||||
const repoEntry =
|
||||
normalizeRepoInput(repoInput, {
|
||||
repo: body.ownerRepo || body.fullName || body.repo,
|
||||
provider: body.provider,
|
||||
baseUrl: body.baseUrl
|
||||
}) || null;
|
||||
repo: body.ownerRepo || body.fullName || body.repo || repoFromRecord?.repo,
|
||||
provider: body.provider || repoFromRecord?.provider,
|
||||
baseUrl: body.baseUrl || repoFromRecord?.baseUrl
|
||||
}) || repoFromRecord;
|
||||
|
||||
if (!repoId && !repoEntry) {
|
||||
if (!repoEntry) {
|
||||
return res.status(400).json({ error: "Kies een plugin om de licentie aan te koppelen." });
|
||||
}
|
||||
|
||||
@@ -677,6 +751,12 @@ async function handleLicenseDownload(res, { key, hostname, version = "latest" })
|
||||
});
|
||||
stream.pipe(res);
|
||||
} catch (error) {
|
||||
if (error?.meta === "PRIVATE_REPO") {
|
||||
if (!res.headersSent) {
|
||||
return res.status(403).json({ error: "Downloads voor private plugins zijn uitgeschakeld." });
|
||||
}
|
||||
return res.end();
|
||||
}
|
||||
console.error("Download endpoint error:", error);
|
||||
if (!res.headersSent) {
|
||||
res.status(500).json({ error: "Download mislukt." });
|
||||
|
||||
Reference in New Issue
Block a user