Add repository management functionality with CRUD operations
- Implemented repoService for database interactions including count, list, get, create, update, and delete operations. - Created RepoManager component for managing repositories with a user interface. - Added forms for creating and editing repositories, including validation and error handling. - Integrated API calls for fetching, creating, updating, and deleting repositories. - Enhanced user experience with loading states and action feedback messages.
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import crypto from "crypto";
|
||||
import db from "./db.js";
|
||||
import { fetchManifest, fetchRepo, normalizeRepoInput } from "./pluginService.js";
|
||||
import { getRepoById } from "./repoService.js";
|
||||
|
||||
function toIso(value) {
|
||||
return value ? new Date(value).toISOString() : null;
|
||||
@@ -31,12 +32,29 @@ export async function findLicenseByKey(key) {
|
||||
return rows[0] || null;
|
||||
}
|
||||
|
||||
export async function createLicense(userId, { label, note, repo }) {
|
||||
const repoEntry = normalizeRepoInput(repo);
|
||||
if (!repoEntry) {
|
||||
const error = new Error("Ongeldige plugin referentie.");
|
||||
error.meta = "INVALID_REPO";
|
||||
throw error;
|
||||
export async function createLicense(userId, { label, note, repo, repoId }) {
|
||||
let repoEntry = null;
|
||||
let repoRow = null;
|
||||
|
||||
if (repoId) {
|
||||
repoRow = await getRepoById(repoId);
|
||||
if (!repoRow) {
|
||||
const error = new Error("Onbekende repository.");
|
||||
error.meta = "INVALID_REPO";
|
||||
throw error;
|
||||
}
|
||||
repoEntry = {
|
||||
repo: repoRow.ownerRepo,
|
||||
provider: repoRow.provider,
|
||||
baseUrl: repoRow.baseUrl
|
||||
};
|
||||
} else {
|
||||
repoEntry = normalizeRepoInput(repo);
|
||||
if (!repoEntry) {
|
||||
const error = new Error("Ongeldige plugin referentie.");
|
||||
error.meta = "INVALID_REPO";
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
let licenseId = null;
|
||||
@@ -47,9 +65,9 @@ export async function createLicense(userId, { label, note, repo }) {
|
||||
await db.query(
|
||||
`INSERT INTO licenses (
|
||||
id, user_id, license_key, label, note,
|
||||
repo_provider, repo_name, repo_base_url,
|
||||
repo_provider, repo_name, repo_base_url, repo_id,
|
||||
created_at, updated_at
|
||||
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, NOW(), NOW())`,
|
||||
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NOW(), NOW())`,
|
||||
[
|
||||
id,
|
||||
userId,
|
||||
@@ -58,7 +76,8 @@ export async function createLicense(userId, { label, note, repo }) {
|
||||
note || null,
|
||||
repoEntry.provider || "github",
|
||||
repoEntry.repo,
|
||||
repoEntry.baseUrl || (repoEntry.provider === "github" ? "https://github.com" : null)
|
||||
repoEntry.baseUrl || (repoEntry.provider === "github" ? "https://github.com" : null),
|
||||
repoRow?.id || null
|
||||
]
|
||||
);
|
||||
licenseId = id;
|
||||
@@ -80,11 +99,24 @@ export async function createLicense(userId, { label, note, repo }) {
|
||||
|
||||
export async function buildLicensePayload(row) {
|
||||
if (!row) return null;
|
||||
const repoEntry = normalizeRepoInput({
|
||||
repo: row.repo_name,
|
||||
provider: row.repo_provider,
|
||||
baseUrl: row.repo_base_url
|
||||
});
|
||||
|
||||
let repoRow = null;
|
||||
if (row.repo_id) {
|
||||
repoRow = await getRepoById(row.repo_id);
|
||||
}
|
||||
|
||||
const repoEntry =
|
||||
repoRow && repoRow.ownerRepo
|
||||
? {
|
||||
repo: repoRow.ownerRepo,
|
||||
provider: repoRow.provider,
|
||||
baseUrl: repoRow.baseUrl
|
||||
}
|
||||
: normalizeRepoInput({
|
||||
repo: row.repo_name,
|
||||
provider: row.repo_provider,
|
||||
baseUrl: row.repo_base_url
|
||||
});
|
||||
const [hostnameRows] = await db.query(
|
||||
`SELECT hostname, normalized, first_seen_at, last_seen_at, hits
|
||||
FROM license_hostnames WHERE license_id = ? ORDER BY first_seen_at ASC`,
|
||||
@@ -112,6 +144,8 @@ export async function buildLicensePayload(row) {
|
||||
primaryHostnameNormalized: row.primary_hostname_normalized,
|
||||
repoFullName: row.repo_name,
|
||||
repoUrl: null,
|
||||
repoId: repoRow?.id || null,
|
||||
repoLabel: repoRow?.label || null,
|
||||
pluginName: row.label,
|
||||
pluginVersion: row.last_used_version || null,
|
||||
lastUsedVersion: row.last_used_version,
|
||||
@@ -134,7 +168,9 @@ export async function buildLicensePayload(row) {
|
||||
primaryHostnameNormalized: row.primary_hostname_normalized,
|
||||
repoFullName: info.fullName,
|
||||
repoUrl: info.repoUrl,
|
||||
pluginName: manifest?.plugin_name || info.name || row.label,
|
||||
repoId: repoRow?.id || null,
|
||||
repoLabel: repoRow?.label || null,
|
||||
pluginName: manifest?.plugin_name || repoRow?.label || info.name || row.label,
|
||||
pluginVersion: manifest?.version || row.last_used_version || null,
|
||||
lastUsedVersion: row.last_used_version,
|
||||
repo: repoEntry,
|
||||
@@ -151,9 +187,14 @@ export async function buildLicensePayload(row) {
|
||||
lastVersionCheckAt: toIso(row.last_version_check_at),
|
||||
primaryHostname: row.primary_hostname,
|
||||
primaryHostnameNormalized: row.primary_hostname_normalized,
|
||||
repoFullName: row.repo_name,
|
||||
repoUrl: repoEntry?.baseUrl ? `${repoEntry.baseUrl.replace(/\/$/, "")}/${row.repo_name}` : null,
|
||||
pluginName: row.label,
|
||||
repoFullName: repoRow?.ownerRepo || row.repo_name,
|
||||
repoUrl:
|
||||
(repoRow?.baseUrl || repoEntry?.baseUrl)
|
||||
? `${(repoRow?.baseUrl || repoEntry.baseUrl).replace(/\/$/, "")}/${repoRow?.ownerRepo || row.repo_name}`
|
||||
: null,
|
||||
repoId: repoRow?.id || null,
|
||||
repoLabel: repoRow?.label || null,
|
||||
pluginName: repoRow?.label || row.label,
|
||||
pluginVersion: row.last_used_version || null,
|
||||
lastUsedVersion: row.last_used_version,
|
||||
repo: repoEntry,
|
||||
|
||||
Reference in New Issue
Block a user