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