|
|
|
|
@@ -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<ReturnType<typeof getRouteAgencyContextOrThrow>> | 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,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|