diff --git a/lib/plesk/client.ts b/lib/plesk/client.ts index 6b3ebfc..3eb3d33 100644 --- a/lib/plesk/client.ts +++ b/lib/plesk/client.ts @@ -16,6 +16,8 @@ export type PleskSubscription = { external_id?: string; name?: string; status?: string; + status_raw?: string | null; + status_sync_error?: string | null; owner_login?: string; owner?: { login?: string }; plan_name?: string; @@ -148,16 +150,27 @@ export async function listPleskSubscriptions(connection: PleskConnection) { const subscriptions: PleskSubscription[] = []; for (const subscriptionName of subscriptionNames.slice(0, 500)) { - let status: "active" | "suspended" | "unknown" = "unknown"; + let status: "active" | "suspended" | "disabled" | "expired" | "unknown" = + "unknown"; + let statusRaw: string | null = null; + let statusSyncError: string | null = null; try { const infoResult = await pleskCliCall(connection, "subscription", [ "--info", subscriptionName, ]); - status = parseSubscriptionStatusFromInfo(infoResult.stdout ?? ""); - } catch { + const parsed = parseSubscriptionStatusDetailsFromInfo( + infoResult.stdout ?? "", + ); + status = parsed.status; + statusRaw = parsed.statusRaw; + } catch (error) { status = "unknown"; + statusSyncError = + error instanceof Error + ? error.message.slice(0, 1000) + : "status_sync_failed"; } subscriptions.push({ @@ -165,33 +178,57 @@ export async function listPleskSubscriptions(connection: PleskConnection) { subscription_id: subscriptionName, name: subscriptionName, status, + status_raw: statusRaw, + status_sync_error: statusSyncError, }); } return subscriptions; } -export function parseSubscriptionStatusFromInfo( - stdout: string, -): "active" | "suspended" | "unknown" { +export function parseSubscriptionStatusDetailsFromInfo(stdout: string): { + status: "active" | "suspended" | "disabled" | "expired" | "unknown"; + statusRaw: string | null; +} { const line = stdout .split(/\r?\n/) .map((entry) => entry.trim()) .find((entry) => /^domain\s+status\s*:/i.test(entry)); - if (!line) return "unknown"; - - const value = line - .replace(/^domain\s+status\s*:/i, "") - .trim() - .toLowerCase(); - - if (value.includes("ok")) return "active"; - if (value.includes("suspend") || value.includes("disabled")) { - return "suspended"; + if (!line) { + return { status: "unknown", statusRaw: null }; } - return "unknown"; + const value = line.replace(/^domain\s+status\s*:/i, "").trim(); + const normalized = value.toLowerCase(); + + if (normalized.includes("expired")) { + return { status: "expired", statusRaw: value }; + } + + if (normalized.includes("disabled")) { + return { status: "disabled", statusRaw: value }; + } + + if (normalized.includes("suspend")) { + return { status: "suspended", statusRaw: value }; + } + + if ( + normalized.includes("ok") || + normalized.includes("active") || + normalized.includes("enabled") + ) { + return { status: "active", statusRaw: value }; + } + + return { status: "unknown", statusRaw: value }; +} + +export function parseSubscriptionStatusFromInfo( + stdout: string, +): "active" | "suspended" | "disabled" | "expired" | "unknown" { + return parseSubscriptionStatusDetailsFromInfo(stdout).status; } export async function pleskCliCall(