UNPKG

@aerocorp/cli

Version:

AeroCorp CLI 5.1.0 - Future-Proofed Enterprise Infrastructure with Live Preview, Tunneling & Advanced DevOps

250 lines • 12 kB
"use strict"; /** * AeroCorp CLI 4.0.0 - Database Management Service * Comprehensive database operations for hybrid infrastructure */ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.DatabaseService = void 0; const axios_1 = __importDefault(require("axios")); const chalk_1 = __importDefault(require("chalk")); const inquirer_1 = __importDefault(require("inquirer")); const config_1 = require("./config"); const auth_1 = require("./auth"); class DatabaseService { constructor() { this.configService = new config_1.ConfigService(); this.authService = new auth_1.AuthService(); } async listDatabases(options = {}) { try { const config = await this.configService.getConfig(); const auth = await this.authService.getAuth(); const params = new URLSearchParams(); if (options.platform) params.append('platform', options.platform); if (options.type) params.append('type', options.type); if (options.status) params.append('status', options.status); const response = await axios_1.default.get(`${config.apiUrl}/api/databases?${params}`, { headers: { 'Authorization': `Bearer ${auth.token}`, 'Content-Type': 'application/json' }, timeout: 10000 }); const data = response.data; console.log(chalk_1.default.cyan.bold('\nšŸ’¾ Database Instances')); console.log(chalk_1.default.gray(`Total: ${data.total} databases`)); console.log(chalk_1.default.gray(`Running: ${data.summary.running} | Stopped: ${data.summary.stopped} | Maintenance: ${data.summary.maintenance}`)); if (data.databases.length === 0) { console.log(chalk_1.default.yellow('No databases found')); return; } console.log('\n' + chalk_1.default.white('Name'.padEnd(25) + 'Type'.padEnd(12) + 'Status'.padEnd(12) + 'Platform'.padEnd(12) + 'Size'.padEnd(10) + 'Connections')); console.log(chalk_1.default.gray('─'.repeat(80))); data.databases.forEach((db) => { const statusIcon = db.status === 'running' ? 'āœ…' : db.status === 'maintenance' ? 'āš ļø' : 'āŒ'; const statusColor = db.status === 'running' ? chalk_1.default.green : db.status === 'maintenance' ? chalk_1.default.yellow : chalk_1.default.red; console.log(`${statusIcon} ${chalk_1.default.white(db.name.padEnd(22))} ` + `${chalk_1.default.blue(db.type.padEnd(11))} ` + `${statusColor(db.status.padEnd(11))} ` + `${chalk_1.default.cyan(db.platform.padEnd(11))} ` + `${chalk_1.default.white(db.size.padEnd(9))} ` + `${chalk_1.default.white(db.connections + '/' + db.maxConnections)}`); }); } catch (error) { throw new Error(`Failed to list databases: ${error.message}`); } } async createDatabase(options = {}) { try { let dbConfig; if (options.interactive !== false) { dbConfig = await inquirer_1.default.prompt([ { type: 'input', name: 'name', message: 'Database name:', default: options.name, validate: (input) => input.length > 0 || 'Name is required' }, { type: 'list', name: 'type', message: 'Database type:', choices: ['postgresql', 'mysql', 'mongodb', 'redis'], default: options.type || 'postgresql' }, { type: 'list', name: 'platform', message: 'Deployment platform:', choices: ['coolify', 'caprover'], default: options.platform || 'coolify' }, { type: 'input', name: 'version', message: 'Version (leave empty for latest):', default: options.version || '' }, { type: 'input', name: 'initialSize', message: 'Initial storage size:', default: options.initialSize || '1GB' } ]); } else { dbConfig = options; } const config = await this.configService.getConfig(); const auth = await this.authService.getAuth(); console.log(chalk_1.default.blue('šŸ”„ Creating database...')); const response = await axios_1.default.post(`${config.apiUrl}/api/databases`, dbConfig, { headers: { 'Authorization': `Bearer ${auth.token}`, 'Content-Type': 'application/json' }, timeout: 30000 }); const database = response.data.database; console.log(chalk_1.default.green('āœ… Database created successfully!')); console.log(chalk_1.default.white(`Name: ${database.name}`)); console.log(chalk_1.default.white(`Type: ${database.type}`)); console.log(chalk_1.default.white(`Platform: ${database.platform}`)); console.log(chalk_1.default.white(`URL: ${database.url}`)); } catch (error) { throw new Error(`Failed to create database: ${error.message}`); } } async backupDatabase(databaseId, options = {}) { try { const config = await this.configService.getConfig(); const auth = await this.authService.getAuth(); console.log(chalk_1.default.blue('šŸ”„ Starting database backup...')); const response = await axios_1.default.post(`${config.apiUrl}/api/databases/${databaseId}/backup`, { type: options.type || 'manual' }, { headers: { 'Authorization': `Bearer ${auth.token}`, 'Content-Type': 'application/json' }, timeout: 30000 }); const backup = response.data.backup; console.log(chalk_1.default.green('āœ… Backup started successfully!')); console.log(chalk_1.default.white(`Backup ID: ${backup.id}`)); console.log(chalk_1.default.white(`Database: ${backup.database}`)); console.log(chalk_1.default.white(`Type: ${backup.type}`)); console.log(chalk_1.default.white(`Status: ${backup.status}`)); } catch (error) { throw new Error(`Failed to backup database: ${error.message}`); } } async restoreDatabase(databaseId, backupId) { try { const config = await this.configService.getConfig(); const auth = await this.authService.getAuth(); console.log(chalk_1.default.blue('šŸ”„ Starting database restore...')); const response = await axios_1.default.post(`${config.apiUrl}/api/databases/${databaseId}/restore`, { backupId }, { headers: { 'Authorization': `Bearer ${auth.token}`, 'Content-Type': 'application/json' }, timeout: 60000 }); console.log(chalk_1.default.green('āœ… Restore started successfully!')); console.log(chalk_1.default.yellow('āš ļø Database will be in maintenance mode during restore')); } catch (error) { throw new Error(`Failed to restore database: ${error.message}`); } } async listBackups(databaseId) { try { const config = await this.configService.getConfig(); const auth = await this.authService.getAuth(); const url = databaseId ? `${config.apiUrl}/api/databases/${databaseId}/backups` : `${config.apiUrl}/api/databases/backups`; const response = await axios_1.default.get(url, { headers: { 'Authorization': `Bearer ${auth.token}`, 'Content-Type': 'application/json' }, timeout: 10000 }); const data = response.data; console.log(chalk_1.default.cyan.bold('\nšŸ’¾ Database Backups')); console.log(chalk_1.default.gray(`Total: ${data.total} backups`)); if (data.backups.length === 0) { console.log(chalk_1.default.yellow('No backups found')); return; } console.log('\n' + chalk_1.default.white('Database'.padEnd(25) + 'Size'.padEnd(10) + 'Type'.padEnd(12) + 'Status'.padEnd(12) + 'Date')); console.log(chalk_1.default.gray('─'.repeat(80))); data.backups.forEach((backup) => { const statusIcon = backup.status === 'completed' ? 'āœ…' : backup.status === 'in_progress' ? 'šŸ”„' : 'āŒ'; const statusColor = backup.status === 'completed' ? chalk_1.default.green : backup.status === 'in_progress' ? chalk_1.default.blue : chalk_1.default.red; console.log(`${statusIcon} ${chalk_1.default.white(backup.database.padEnd(22))} ` + `${chalk_1.default.white(backup.size.padEnd(9))} ` + `${chalk_1.default.cyan(backup.type.padEnd(11))} ` + `${statusColor(backup.status.padEnd(11))} ` + `${chalk_1.default.gray(new Date(backup.timestamp).toLocaleDateString())}`); }); } catch (error) { throw new Error(`Failed to list backups: ${error.message}`); } } async deleteDatabase(databaseId, options = {}) { try { if (!options.force) { const confirm = await inquirer_1.default.prompt([ { type: 'confirm', name: 'confirmed', message: 'Are you sure you want to delete this database? This action cannot be undone.', default: false } ]); if (!confirm.confirmed) { console.log(chalk_1.default.yellow('āŒ Database deletion cancelled')); return; } } const config = await this.configService.getConfig(); const auth = await this.authService.getAuth(); console.log(chalk_1.default.blue('šŸ”„ Deleting database...')); const response = await axios_1.default.delete(`${config.apiUrl}/api/databases/${databaseId}`, { headers: { 'Authorization': `Bearer ${auth.token}`, 'Content-Type': 'application/json' }, timeout: 30000 }); console.log(chalk_1.default.green('āœ… Database deleted successfully!')); console.log(chalk_1.default.gray(`Removed ${response.data.removedBackups} associated backups`)); } catch (error) { throw new Error(`Failed to delete database: ${error.message}`); } } } exports.DatabaseService = DatabaseService; //# sourceMappingURL=database.js.map