UNPKG

@aerocorp/cli

Version:

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

168 lines • 7.83 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ProjectService = void 0; const axios_1 = __importDefault(require("axios")); const chalk_1 = __importDefault(require("chalk")); const ora_1 = __importDefault(require("ora")); const auth_1 = require("./auth"); class ProjectService { constructor() { this.authService = new auth_1.AuthService(); } async list(options) { if (!this.authService.isAuthenticated()) { throw new Error('Not authenticated. Run "aerocorp login" first.'); } const spinner = (0, ora_1.default)('Fetching projects...').start(); try { const coolifyUrl = this.authService.getCoolifyUrl(); const headers = this.authService.getAuthHeaders(); // Get projects const projectsResponse = await axios_1.default.get(`${coolifyUrl}/api/v1/projects`, { headers }); const projects = projectsResponse.data; // Get applications for each project const projectsWithApps = await Promise.all(projects.map(async (project) => { try { const appsResponse = await axios_1.default.get(`${coolifyUrl}/api/v1/projects/${project.id}/applications`, { headers }); return { ...project, applications: appsResponse.data || [] }; } catch (error) { return { ...project, applications: [] }; } })); spinner.succeed('Projects fetched successfully'); if (options.format === 'json') { console.log(JSON.stringify(projectsWithApps, null, 2)); return; } // Display in table format this.displayProjectsTable(projectsWithApps); } catch (error) { spinner.fail('Failed to fetch projects'); if (error.response?.status === 401) { throw new Error('Authentication failed. Please run "aerocorp login" again.'); } else if (error.response?.status === 403) { throw new Error('Access forbidden. Check your API token permissions.'); } else { throw new Error(`API Error: ${error.response?.data?.message || error.message}`); } } } displayProjectsTable(projects) { console.log(chalk_1.default.cyan('\nšŸ“‹ AeroCorp Projects & Applications')); console.log(chalk_1.default.cyan('=====================================')); if (projects.length === 0) { console.log(chalk_1.default.yellow('⚠ No projects found')); return; } projects.forEach((project, index) => { console.log(chalk_1.default.blue(`\n${index + 1}. ${project.name}`)); console.log(chalk_1.default.gray(` UUID: ${project.uuid}`)); console.log(chalk_1.default.gray(` Description: ${project.description || 'No description'}`)); if (project.applications && project.applications.length > 0) { console.log(chalk_1.default.green(` Applications (${project.applications.length}):`)); project.applications.forEach((app, appIndex) => { const status = this.getStatusIcon(app.status); const url = app.url ? chalk_1.default.blue(app.url) : chalk_1.default.gray('No URL'); console.log(chalk_1.default.white(` ${appIndex + 1}. ${status} ${app.name}`)); console.log(chalk_1.default.gray(` Environment: ${app.environment || 'default'}`)); console.log(chalk_1.default.gray(` URL: ${url}`)); console.log(chalk_1.default.gray(` Status: ${app.status || 'unknown'}`)); if (app.last_deployment) { const deployTime = new Date(app.last_deployment).toLocaleString(); console.log(chalk_1.default.gray(` Last Deploy: ${deployTime}`)); } }); } else { console.log(chalk_1.default.gray(' Applications: None')); } }); // Summary const totalApps = projects.reduce((sum, project) => sum + (project.applications?.length || 0), 0); console.log(chalk_1.default.cyan(`\nšŸ“Š Summary: ${projects.length} projects, ${totalApps} applications`)); } getStatusIcon(status) { switch (status?.toLowerCase()) { case 'running': case 'active': case 'healthy': return chalk_1.default.green('ā—'); case 'stopped': case 'inactive': return chalk_1.default.red('ā—'); case 'building': case 'deploying': return chalk_1.default.yellow('ā—'); case 'error': case 'failed': return chalk_1.default.red('āœ—'); default: return chalk_1.default.gray('ā—‹'); } } async create(name, description) { if (!this.authService.isAuthenticated()) { throw new Error('Not authenticated. Run "aerocorp login" first.'); } const spinner = (0, ora_1.default)(`Creating project: ${name}...`).start(); try { const coolifyUrl = this.authService.getCoolifyUrl(); const headers = this.authService.getAuthHeaders(); const response = await axios_1.default.post(`${coolifyUrl}/api/v1/projects`, { name, description: description || `AeroCorp project: ${name}` }, { headers }); spinner.succeed(`Project '${name}' created successfully`); console.log(chalk_1.default.green('āœ“ Project created')); console.log(chalk_1.default.blue(`šŸ“¦ Name: ${response.data.name}`)); console.log(chalk_1.default.blue(`šŸ†” UUID: ${response.data.uuid}`)); return response.data; } catch (error) { spinner.fail(`Failed to create project: ${name}`); if (error.response?.status === 409) { throw new Error(`Project '${name}' already exists`); } else { throw new Error(`API Error: ${error.response?.data?.message || error.message}`); } } } async delete(projectId) { if (!this.authService.isAuthenticated()) { throw new Error('Not authenticated. Run "aerocorp login" first.'); } const spinner = (0, ora_1.default)(`Deleting project: ${projectId}...`).start(); try { const coolifyUrl = this.authService.getCoolifyUrl(); const headers = this.authService.getAuthHeaders(); await axios_1.default.delete(`${coolifyUrl}/api/v1/projects/${projectId}`, { headers }); spinner.succeed(`Project '${projectId}' deleted successfully`); console.log(chalk_1.default.green('āœ“ Project deleted')); } catch (error) { spinner.fail(`Failed to delete project: ${projectId}`); if (error.response?.status === 404) { throw new Error(`Project '${projectId}' not found`); } else { throw new Error(`API Error: ${error.response?.data?.message || error.message}`); } } } } exports.ProjectService = ProjectService; //# sourceMappingURL=project.js.map