From 033d816d42e0eac28a00c6a7e913abeece3f60d7 Mon Sep 17 00:00:00 2001 From: robbond Date: Thu, 5 Mar 2026 14:26:58 +0000 Subject: [PATCH] fix(actions): unsuspend using canonical subscription identifier + refresh status --- app/api/plesk/domains/[id]/action/route.ts | 66 +++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/app/api/plesk/domains/[id]/action/route.ts b/app/api/plesk/domains/[id]/action/route.ts index 24b5b73..635e05e 100644 --- a/app/api/plesk/domains/[id]/action/route.ts +++ b/app/api/plesk/domains/[id]/action/route.ts @@ -5,6 +5,8 @@ import { assertAgencyAdmin, getRouteAgencyContextOrThrow } from "@/lib/agency"; import { assertRateLimit } from "@/lib/api/rate-limit"; import { assertSameOrigin } from "@/lib/api/security"; import { + parseSubscriptionStatusDetailsFromInfo, + pleskCliCall, suspendPleskSubscription, unsuspendPleskSubscription, } from "@/lib/plesk/client"; @@ -23,7 +25,11 @@ export async function POST( let context: Awaited> | null = null; let domain: { id: string; subscription_id: string | null } | null = null; - let subscription: { id: string; plesk_subscription_id: string } | null = null; + let subscription: { + id: string; + plesk_subscription_id: string; + plesk_instance_id: string; + } | null = null; let requestedAction: "suspend" | "unsuspend" | null = null; try { @@ -75,6 +81,7 @@ export async function POST( subscription = { id: String(subscriptionRow.id), plesk_subscription_id: String(subscriptionRow.plesk_subscription_id), + plesk_instance_id: String(subscriptionRow.plesk_instance_id), }; const { data: instance, error: instanceError } = await supabase @@ -106,6 +113,61 @@ export async function POST( ); } + const fallbackStatus = action === "suspend" ? "suspended" : "active"; + let refreshedStatus = fallbackStatus; + let refreshedStatusRaw: string | null = null; + let refreshErrorMessage: string | null = null; + + try { + const infoResult = await pleskCliCall(connection, "subscription", [ + "--info", + subscription.plesk_subscription_id, + ]); + const parsed = parseSubscriptionStatusDetailsFromInfo( + infoResult.stdout ?? "", + ); + refreshedStatus = parsed.status; + refreshedStatusRaw = parsed.statusRaw; + } catch (refreshError) { + refreshErrorMessage = + refreshError instanceof Error + ? refreshError.message.slice(0, 1000) + : "subscription_status_refresh_failed"; + + await supabase.from("actions_log").insert({ + agency_id: context.agencyId, + actor_user_id: context.userId, + target_type: "plesk_subscription", + target_id: subscription.id, + action: "subscription_status_refresh_failed", + status: "failed", + error_message: refreshErrorMessage, + metadata: { + subscription_id: subscription.id, + plesk_subscription_id: subscription.plesk_subscription_id, + plesk_instance_id: subscription.plesk_instance_id, + source: "domain_action", + domain_id: domain.id, + }, + }); + } + + await supabase + .from("plesk_subscriptions") + .update({ + status: refreshedStatus, + status_raw: refreshedStatusRaw, + last_status_sync_at: new Date().toISOString(), + }) + .eq("id", subscription.id) + .eq("agency_id", context.agencyId); + + await supabase + .from("plesk_domains") + .update({ status: refreshedStatus }) + .eq("agency_id", context.agencyId) + .eq("subscription_id", subscription.id); + await supabase.from("actions_log").insert({ agency_id: context.agencyId, actor_user_id: context.userId, @@ -117,6 +179,8 @@ export async function POST( domain_id: domain.id, subscription_id: subscription.id, plesk_subscription_id: subscription.plesk_subscription_id, + refreshed_status: refreshedStatus, + refresh_error: refreshErrorMessage, }, }); -- 2.39.5