diff --git a/app/api/plesk/subscriptions/[id]/action/route.ts b/app/api/plesk/subscriptions/[id]/action/route.ts index d4670b1..be43686 100644 --- a/app/api/plesk/subscriptions/[id]/action/route.ts +++ b/app/api/plesk/subscriptions/[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"; @@ -80,12 +82,59 @@ export async function POST( ); } - const newStatus = payload.action === "suspend" ? "suspended" : "active"; + const fallbackStatus = + payload.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, + }, + }); + } + const { error: updateError } = await supabase .from("plesk_subscriptions") - .update({ status: newStatus }) + .update({ + status: refreshedStatus, + status_raw: refreshedStatusRaw, + last_status_sync_at: new Date().toISOString(), + }) .eq("id", subscription.id); + 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, @@ -95,14 +144,17 @@ export async function POST( status: "success", metadata: { plesk_subscription_id: subscription.plesk_subscription_id, + refreshed_status: refreshedStatus, + refresh_error: refreshErrorMessage, db_status_update_error: updateError?.message ?? null, }, }); return NextResponse.json({ ok: true, - status: newStatus, + status: refreshedStatus, dbStatusUpdated: !updateError, + refreshError: refreshErrorMessage, }); } catch (error) { if (supabase && context && subscription) {