diff --git a/lib/plesk/sync.ts b/lib/plesk/sync.ts index a3fe605..97c3d22 100644 --- a/lib/plesk/sync.ts +++ b/lib/plesk/sync.ts @@ -22,6 +22,13 @@ type InstanceRow = Pick< | "last_connected_at" >; +type LocalSubscriptionLookupRow = { + id: string; + plesk_subscription_id: string; + name: string | null; + status: string | null; +}; + const MIN_INTERVAL_MS = 3 * 60 * 1000; export async function syncPleskInstance( @@ -156,7 +163,7 @@ export async function syncPleskInstance( const { data: localSubscriptions, error: localSubscriptionsError } = await supabase .from("plesk_subscriptions") - .select("id, plesk_subscription_id, status") + .select("id, plesk_subscription_id, name, status") .eq("agency_id", instance.agency_id) .eq("plesk_instance_id", instance.id); @@ -164,19 +171,49 @@ export async function syncPleskInstance( throw new Error(localSubscriptionsError.message); } + const subscriptionsIndexed = ((localSubscriptions ?? []) as Array) + .filter((row): row is LocalSubscriptionLookupRow => + Boolean(row?.plesk_subscription_id && row?.id), + ) + .map((row) => ({ + id: String(row.id), + pleskSubscriptionId: String(row.plesk_subscription_id), + status: row?.status ? String(row.status) : null, + name: row?.name ? String(row.name) : null, + })); + const subscriptionByExternalId = new Map< string, - { id: string; status: string | null } + { + id: string; + pleskSubscriptionId: string; + status: string | null; + name: string | null; + } + >(subscriptionsIndexed.map((row) => [row.pleskSubscriptionId, row])); + + const subscriptionByLocalId = new Map< + string, + { + id: string; + pleskSubscriptionId: string; + status: string | null; + name: string | null; + } + >(subscriptionsIndexed.map((row) => [row.id, row])); + + const subscriptionByName = new Map< + string, + { + id: string; + pleskSubscriptionId: string; + status: string | null; + name: string | null; + } >( - (localSubscriptions ?? []) - .filter((row: any) => row?.plesk_subscription_id && row?.id) - .map((row: any) => [ - String(row.plesk_subscription_id), - { - id: String(row.id), - status: row?.status ? String(row.status) : null, - }, - ]), + subscriptionsIndexed + .filter((row) => row.name) + .map((row) => [String(row.name).trim().toLowerCase(), row]), ); const domainsForUpsert = domainsRaw @@ -185,12 +222,37 @@ export async function syncPleskInstance( const domainName = item?.name ?? item?.domain_name ?? item?.domain; const subExternalId = item?.subscription?.id ?? item?.subscription_id ?? item?.webspace_id; - const externalSubscriptionId = subExternalId + const rawExternalSubscriptionId = subExternalId ? String(subExternalId) : null; - const localSubscription = externalSubscriptionId - ? subscriptionByExternalId.get(externalSubscriptionId) + const subscriptionNameHint = + item?.subscription?.name ?? + item?.subscription_name ?? + item?.webspace_name ?? + item?.webspace ?? + null; + + const localSubscriptionByExternal = rawExternalSubscriptionId + ? subscriptionByExternalId.get(rawExternalSubscriptionId) : undefined; + const localSubscriptionByLocalId = rawExternalSubscriptionId + ? subscriptionByLocalId.get(rawExternalSubscriptionId) + : undefined; + const localSubscriptionByName = subscriptionNameHint + ? subscriptionByName.get( + String(subscriptionNameHint).trim().toLowerCase(), + ) + : undefined; + const localSubscription = + localSubscriptionByExternal ?? + localSubscriptionByLocalId ?? + localSubscriptionByName; + + const externalSubscriptionId = localSubscription + ? localSubscription.pleskSubscriptionId + : subscriptionNameHint + ? String(subscriptionNameHint) + : rawExternalSubscriptionId; const rawCreated = item?.created_at ?? item?.created; const sourceCreatedAt = rawCreated ? new Date(String(rawCreated)).toISOString()