diff --git a/app/api/plesk/domains/[id]/action/route.ts b/app/api/plesk/domains/[id]/action/route.ts index 635e05e..621c8bf 100644 --- a/app/api/plesk/domains/[id]/action/route.ts +++ b/app/api/plesk/domains/[id]/action/route.ts @@ -7,8 +7,6 @@ import { assertSameOrigin } from "@/lib/api/security"; import { parseSubscriptionStatusDetailsFromInfo, pleskCliCall, - suspendPleskSubscription, - unsuspendPleskSubscription, } from "@/lib/plesk/client"; import { createSupabaseRouteClient } from "@/lib/supabase/route"; @@ -101,17 +99,27 @@ export async function POST( encryptedSecret: instance.encrypted_secret, } as const; - if (action === "suspend") { - await suspendPleskSubscription( - connection, - subscription.plesk_subscription_id, - ); - } else { - await unsuspendPleskSubscription( - connection, - subscription.plesk_subscription_id, - ); - } + const domainIdentifier = subscription.plesk_subscription_id; + const siteArgs = + action === "suspend" + ? ["--suspend", domainIdentifier] + : ["--on", domainIdentifier]; + + console.info("[domain_action] site CLI", { + action, + command: "site", + args: siteArgs, + domain_id: domain.id, + subscription_id: subscription.id, + }); + + const siteResult = await pleskCliCall(connection, "site", siteArgs); + + console.info("[domain_action] site CLI result", { + code: siteResult.code, + stdout: siteResult.stdout, + stderr: siteResult.stderr, + }); const fallbackStatus = action === "suspend" ? "suspended" : "active"; let refreshedStatus = fallbackStatus; @@ -121,13 +129,30 @@ export async function POST( try { const infoResult = await pleskCliCall(connection, "subscription", [ "--info", - subscription.plesk_subscription_id, + domainIdentifier, ]); + + console.info("[domain_action] subscription info result", { + code: infoResult.code, + stdout: infoResult.stdout, + stderr: infoResult.stderr, + }); + const parsed = parseSubscriptionStatusDetailsFromInfo( infoResult.stdout ?? "", ); refreshedStatus = parsed.status; refreshedStatusRaw = parsed.statusRaw; + + if ( + action === "unsuspend" && + refreshedStatus === "suspended" && + (refreshedStatusRaw ?? "").toLowerCase().includes("subscriber") + ) { + throw new Error( + "Domain remains suspended because its subscriber/customer account is suspended.", + ); + } } catch (refreshError) { refreshErrorMessage = refreshError instanceof Error