@aerocorp/cli
Version:
AeroCorp CLI 5.1.0 - Future-Proofed Enterprise Infrastructure with Live Preview, Tunneling & Advanced DevOps
250 lines ⢠12 kB
JavaScript
;
/**
* 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