UNPKG

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
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); } };