/** * Digital Ocean API Client * Validates connection to Digital Ocean API */ import type { TestResult } from '../types/infrastructure'; export interface DigitalOceanCredentials { api_token: string; } /** * Test connection to Digital Ocean API * Makes a simple API call to verify credentials */ export async function testDigitalOceanConnection( credentials: DigitalOceanCredentials, ): Promise { try { const { api_token } = credentials; // Call /v2/account endpoint (lightweight, returns account info) const response = await fetch('https://api.digitalocean.com/v2/account', { method: 'GET', headers: { Authorization: `Bearer ${api_token}`, 'Content-Type': 'application/json', }, }); if (!response.ok) { if (response.status === 401) { return { success: false, message: 'Authentication failed - check API token', details: { status: response.status }, }; } return { success: false, message: `API request failed with status ${response.status}`, details: { status: response.status }, }; } const data = (await response.json()) as unknown; // Validate response structure if ( typeof data !== 'object' || data === null || !('account' in data) || typeof data.account !== 'object' || data.account === null ) { return { success: false, message: 'Unexpected API response format', details: { response: data }, }; } const account = data.account as { email: string; status: string; droplet_limit: number; }; return { success: true, message: `Connected to Digital Ocean (${account.email})`, details: { email: account.email, status: account.status, droplet_limit: account.droplet_limit, }, }; } catch (error) { if (error instanceof TypeError && error.message.includes('fetch')) { return { success: false, message: 'Network error - check network connectivity', details: { error: error.message }, }; } return { success: false, message: `Connection test failed: ${error instanceof Error ? error.message : String(error)}`, details: { error: String(error) }, }; } }