cartorio-plataforma-cli
Version:
CLI para gerenciar a Plataforma do Cartório de Criciúma com sistema de módulos
216 lines (190 loc) • 8.06 kB
JavaScript
const inquirer = require('inquirer');
const chalk = require('chalk');
const { execSync } = require('child_process');
const ora = require('ora');
const path = require('path');
const boxen = require('boxen');
const ModuleRegistry = require('../lib/module-registry');
const DockerCommandGenerator = require('../lib/docker-command-generator');
/**
* Função que verifica o status dos componentes da plataforma
*/
module.exports = async function status(options) {
let env = options.env || 'local';
// Carregar o registro de módulos
const registry = new ModuleRegistry();
// Criar gerador de comandos
const commandGenerator = new DockerCommandGenerator(registry);
// Encontra o diretório raiz do projeto
const projectDir = commandGenerator.findProjectDir();
// Carregar os módulos usando o diretório do projeto encontrado
registry.loadModules(projectDir);
// Modo interativo: perguntar qual ambiente
if (!options.env) {
const { selectedEnv } = await inquirer.prompt([
{
type: 'list',
name: 'selectedEnv',
message: 'Selecione o ambiente para verificar o status:',
choices: [
{ name: 'Desenvolvimento (dev)', value: 'dev' },
{ name: 'Local (local)', value: 'local' },
{ name: 'Produção (prod)', value: 'prod' }
],
default: env
}
]);
env = selectedEnv;
}
// Exibir informações sobre a ação
console.log(
boxen(
chalk.blue(`📊 Verificando status dos componentes da plataforma`) +
'\n\n' +
chalk.white(`Ambiente: ${chalk.green(env)}`),
{ padding: 1, borderColor: 'blue', borderStyle: 'round' }
)
);
const spinner = ora('Obtendo status dos serviços...').start();
try {
// Criar comando com o diretório correto
const statusCommand = commandGenerator.createCommand(
projectDir,
`docker compose --profile ${env} --env-file .env.${env} ps --format json`
);
// Executar comando para verificar contêineres em execução
const containerList = execSync(statusCommand).toString();
spinner.succeed(chalk.green('Status dos serviços obtido com sucesso!'));
// Processar a lista de contêineres
let containers = [];
if (containerList.trim()) {
containers = JSON.parse(`[${containerList.trim().split('\n').join(',')}]`);
}
// Verificar se existem contêineres em execução
if (containers.length === 0) {
console.log(chalk.yellow('\nNenhum serviço em execução no ambiente selecionado.'));
// Perguntar se deseja iniciar os serviços
const { startServices } = await inquirer.prompt([
{
type: 'confirm',
name: 'startServices',
message: 'Deseja iniciar os serviços agora?',
default: true
}
]);
if (startServices) {
// Chamada para o comando start com modo interativo
const start = require('./start');
await start({ interactive: true, env });
}
return;
}
// Agrupar contêineres por serviço
const serviceGroups = {};
containers.forEach(container => {
const name = container.Service;
if (!serviceGroups[name]) {
serviceGroups[name] = [];
}
serviceGroups[name].push(container);
});
// Exibir status por grupo de serviços
console.log(chalk.bold('\n📋 Status dos Serviços:'));
// Infraestrutura
console.log(chalk.cyan('\n⚙️ Serviços de Infraestrutura:'));
['consul', 'postgres', 'traefik'].forEach(service => {
const containers = serviceGroups[service] || [];
if (containers.length > 0) {
const container = containers[0];
const status = container.State;
const statusColor = status === 'running' ? chalk.green('✅ Em execução') : chalk.red('❌ Parado');
console.log(`${chalk.bold(service)}: ${statusColor}`);
} else {
console.log(`${chalk.bold(service)}: ${chalk.red('❌ Não encontrado')}`);
}
});
// Core
console.log(chalk.cyan('\n🔵 Serviços Core:'));
['root-config', 'plataforma-frontend', 'plataforma-backend'].forEach(service => {
Object.keys(serviceGroups).forEach(groupKey => {
if (groupKey.includes(service)) {
const containers = serviceGroups[groupKey];
containers.forEach(container => {
const name = container.Service;
const status = container.State;
const statusColor = status === 'running' ? chalk.green('✅ Em execução') : chalk.red('❌ Parado');
console.log(`${chalk.bold(name)}: ${statusColor}`);
});
}
});
});
// Módulos
console.log(chalk.cyan('\n🟢 Serviços de Módulos:'));
['modulo1', 'minutador', 'senhas'].forEach(service => {
Object.keys(serviceGroups).forEach(groupKey => {
if (groupKey.includes(service)) {
const containers = serviceGroups[groupKey];
containers.forEach(container => {
const name = container.Service;
const status = container.State;
const statusColor = status === 'running' ? chalk.green('✅ Em execução') : chalk.red('❌ Parado');
console.log(`${chalk.bold(name)}: ${statusColor}`);
});
}
});
});
// Exibir URLs de acesso
const domainSuffix = env === 'prod' ? '.cartoriocriciumasc.com.br' : '.localhost';
console.log(chalk.bold('\n🌐 URLs de Acesso:'));
console.log(chalk.green(`\n📋 Root Config: http://plataforma${domainSuffix}`));
console.log(chalk.green(`🖥️ Plataforma Frontend: http://plataforma.frontend${domainSuffix}`));
console.log(chalk.green(`🔌 Plataforma API: http://plataforma.api${domainSuffix}`));
console.log(chalk.green(`🖥️ Módulo 1 Frontend: http://modulo1.frontend${domainSuffix}`));
console.log(chalk.green(`🔌 Módulo 1 API: http://modulo1.api${domainSuffix}`));
console.log(chalk.green(`🖥️ Minutador Frontend: http://minutador.frontend${domainSuffix}`));
console.log(chalk.green(`🔌 Minutador API: http://minutador.api${domainSuffix}`));
console.log(chalk.green(`🖥️ Senhas Frontend: http://senhas.frontend${domainSuffix}`));
console.log(chalk.green(`🔌 Senhas API: http://senhas.api${domainSuffix}`));
console.log(chalk.cyan(`\n🔍 Consul Dashboard: http://consul${domainSuffix}`));
console.log(chalk.cyan(`🔄 Traefik Dashboard: http://traefik${domainSuffix}`));
// Opções adicionais
console.log(chalk.bold('\n⚡ Ações Rápidas:'));
const { action } = await inquirer.prompt([
{
type: 'list',
name: 'action',
message: 'O que você gostaria de fazer agora?',
choices: [
{ name: 'Iniciar serviços adicionais', value: 'start' },
{ name: 'Reiniciar serviços', value: 'restart' },
{ name: 'Parar serviços', value: 'stop' },
{ name: 'Nada, sair', value: 'exit' }
]
}
]);
if (action === 'start') {
const start = require('./start');
await start({ interactive: true, env });
} else if (action === 'restart') {
const restart = ora('Reiniciando serviços...').start();
try {
const restartCommand = commandGenerator.createCommand(
projectDir,
`ENVIRONMENT=${env} docker compose --profile ${env} --env-file .env.${env} restart`
);
execSync(restartCommand, { stdio: 'inherit' });
restart.succeed(chalk.green('Serviços reiniciados com sucesso!'));
} catch (error) {
restart.fail(chalk.red('Erro ao reiniciar serviços!'));
console.error(error);
}
} else if (action === 'stop') {
const stop = require('./stop');
await stop({ interactive: true, env });
}
} catch (error) {
spinner.fail(chalk.red('Erro ao obter status dos serviços!'));
console.error(error);
process.exit(1);
}
};