diff --git a/src/repositories/ProvisioningRepository.ts b/src/repositories/ProvisioningRepository.ts index 811c297..3fd78e7 100644 --- a/src/repositories/ProvisioningRepository.ts +++ b/src/repositories/ProvisioningRepository.ts @@ -196,18 +196,25 @@ export class ProvisioningRepository { ap.id as pricing_id, 0 as provider_id, 'Anvil' as provider_name, - 'https://api.anvil.cloud' as api_base_url, - ai.name as instance_id, + CASE ar.source_provider + WHEN 'linode' THEN 'https://api.linode.com/v4' + WHEN 'vultr' THEN 'https://api.vultr.com/v2' + ELSE 'https://api.anvil.cloud' + END as api_base_url, + it.instance_id as instance_id, ai.display_name as instance_name, ar.name as region_code, ar.display_name as region_name, ap.monthly_price, ai.vcpus as vcpu, CAST(ai.memory_gb * 1024 AS INTEGER) as memory_mb, - ai.disk_gb as storage_gb + ai.disk_gb as storage_gb, + ar.source_provider, + ar.source_region_code FROM anvil_pricing ap JOIN anvil_instances ai ON ap.anvil_instance_id = ai.id JOIN anvil_regions ar ON ap.anvil_region_id = ar.id + JOIN instance_types it ON ap.source_instance_id = it.id WHERE ap.id = ? AND ai.active = 1 AND ar.active = 1` ) .bind(pricingId) diff --git a/src/services/provisioning-service.ts b/src/services/provisioning-service.ts index 2904020..1a66629 100644 --- a/src/services/provisioning-service.ts +++ b/src/services/provisioning-service.ts @@ -196,21 +196,21 @@ export class ProvisioningService { return; } - // Get provider - const provider = this.getProvider(pricing.provider_name.toLowerCase() as VPSProvider); + // Get provider (use source_provider: linode/vultr) + const provider = this.getProvider(pricing.source_provider); if (!provider) { - console.error(`[ProvisioningService] Provider not configured for order ${order_id}`); - await this.repo.rollbackOrder(order_id, user_id, order.price_paid, 'Provider not configured'); + console.error(`[ProvisioningService] Provider ${pricing.source_provider} not configured for order ${order_id}`); + await this.repo.rollbackOrder(order_id, user_id, order.price_paid, `Provider ${pricing.source_provider} not configured`); return; } // Get OS image ID const osImageId = provider.getOsImageId(image); - // Call provider API + // Call provider API (use source_region_code for actual provider region) const createResult = await provider.createServer({ plan: pricing.instance_id, - region: pricing.region_code, + region: pricing.source_region_code, osImage: osImageId, label: label || `order-${order_id}`, rootPassword: root_password, diff --git a/src/types.ts b/src/types.ts index 39c216c..80ded0b 100644 --- a/src/types.ts +++ b/src/types.ts @@ -318,14 +318,17 @@ export interface CreateServerResponse { export interface PricingWithProvider { pricing_id: number; provider_id: number; - provider_name: string; + provider_name: string; // Display name (Anvil) api_base_url: string; - instance_id: string; // Provider's plan ID (e.g., g6-nanode-1) + instance_id: string; // Provider's plan ID (e.g., g6-nanode-1) instance_name: string; - region_code: string; // Provider's region code + region_code: string; // Anvil region code (anvil-tyo1) region_name: string; monthly_price: number; vcpu: number; memory_mb: number; storage_gb: number; + // Actual provider info for provisioning + source_provider: VPSProvider; // linode | vultr + source_region_code: string; // Provider's region code (ap-northeast, nrt) }