cartorio-plataforma-cli
Version:
CLI para gerenciar a Plataforma do Cartório de Criciúma com sistema de módulos
216 lines (183 loc) • 7.29 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 para os componentes da plataforma
*/
module.exports = async function stop(options) {
let env = options.env || 'local';
// Carregar o registro de módulos - mesmo que não seja usado diretamente,
// é útil para encontrar o diretório do projeto
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
if (options.interactive) {
// Escolher ambiente
const { selectedEnv } = await inquirer.prompt([
{
type: 'list',
name: 'selectedEnv',
message: 'Selecione o ambiente para parar serviços:',
choices: [
{ name: 'Desenvolvimento (dev)', value: 'dev' },
{ name: 'Local (local)', value: 'local' },
{ name: 'Produção (prod)', value: 'prod' }
],
default: env
}
]);
env = selectedEnv;
// Obter a lista de serviços em execução
const spinner = ora('Obtendo serviços em execução...').start();
let containers = [];
try {
const composeCommand = commandGenerator.createCommand(
projectDir,
`docker compose --profile ${env} --env-file .env.${env} ps --format json`
);
const containerList = execSync(composeCommand).toString();
// Verificar se a resposta está vazia
if (containerList.trim()) {
containers = JSON.parse(`[${containerList.trim().split('\n').join(',')}]`);
}
spinner.succeed('Serviços em execução obtidos com sucesso!');
} catch (error) {
spinner.fail('Erro ao obter serviços em execução');
console.error(error);
return;
}
// Se não houver contêineres em execução
if (containers.length === 0) {
console.log(chalk.yellow('\nNenhum serviço em execução no ambiente selecionado.'));
return;
}
// Agrupar os serviços
const infraServices = ['consul', 'postgres', 'traefik'];
const coreServices = ['root-config', 'plataforma-frontend', 'plataforma-backend'];
const moduleServices = ['modulo1', 'minutador', 'senhas'];
// Criar lista de choices
const choices = [
{ name: 'Todos os serviços', value: 'all' },
new inquirer.Separator('--- Grupos de Serviços ---'),
{ name: '⚙️ Serviços de Infraestrutura', value: 'infra' },
{ name: '🔵 Serviços Core', value: 'core' },
{ name: '🟢 Serviços de Módulos', value: 'modules' },
new inquirer.Separator('--- Serviços Específicos ---')
];
// Adicionar serviços específicos
containers.forEach(container => {
const name = container.Service;
choices.push({ name: `${name}`, value: name });
});
// Perguntar quais serviços parar
const { serviceToStop, confirm } = await inquirer.prompt([
{
type: 'list',
name: 'serviceToStop',
message: 'Quais serviços você deseja parar?',
choices: choices,
default: 'all'
},
{
type: 'confirm',
name: 'confirm',
message: answers => {
if (answers.serviceToStop === 'all') {
return 'Tem certeza que deseja parar TODOS os serviços?';
} else if (answers.serviceToStop === 'infra') {
return 'Tem certeza que deseja parar os serviços de infraestrutura? (Consul, Postgres, Traefik)';
} else if (answers.serviceToStop === 'core') {
return 'Tem certeza que deseja parar os serviços core? (Root Config, Plataforma Frontend, Plataforma Backend)';
} else if (answers.serviceToStop === 'modules') {
return 'Tem certeza que deseja parar os serviços de módulos? (Módulo 1, Minutador, Senhas)';
} else {
return `Tem certeza que deseja parar o serviço ${answers.serviceToStop}?`;
}
},
default: false
}
]);
// Se não confirmou, retornar
if (!confirm) {
console.log(chalk.yellow('Operação cancelada pelo usuário.'));
return;
}
// Comando base
let command = `ENVIRONMENT=${env} docker compose --profile ${env} --env-file .env.${env}`;
// Adicionar o comando correto baseado na seleção
if (serviceToStop === 'all') {
command += ' down';
} else if (['infra', 'core', 'modules'].includes(serviceToStop)) {
// Preparar serviços específicos
let services = [];
if (serviceToStop === 'infra') {
services = infraServices;
} else if (serviceToStop === 'core') {
services = coreServices;
} else if (serviceToStop === 'modules') {
services = moduleServices;
}
// Construir lista de serviços para parar
const serviceList = containers
.filter(container => {
const serviceName = container.Service;
return services.some(s => serviceName.includes(s));
})
.map(container => container.Service)
.join(' ');
if (serviceList.length > 0) {
command += ` stop ${serviceList}`;
} else {
console.log(chalk.yellow('Nenhum serviço encontrado para parar.'));
return;
}
} else {
command += ` stop ${serviceToStop}`;
}
// Criar o comando completo com o diretório correto
const fullCommand = commandGenerator.createCommand(projectDir, command);
// Executar o comando
const stopSpinner = ora(`Parando ${serviceToStop === 'all' ? 'todos os serviços' : serviceToStop}...`).start();
try {
execSync(fullCommand, { stdio: 'inherit' });
stopSpinner.succeed(chalk.green(`Serviços parados com sucesso!`));
} catch (error) {
stopSpinner.fail(chalk.red('Erro ao parar serviços!'));
console.error(error);
}
return;
}
// Modo não interativo (original)
console.log(
boxen(
chalk.red(`⏹️ Parando componentes da plataforma`) +
'\n\n' +
chalk.white(`Ambiente: ${chalk.green(env)}`),
{ padding: 1, borderColor: 'red', borderStyle: 'round' }
)
);
try {
console.log(chalk.bold('\n📋 Parando serviços...\n'));
const command = `ENVIRONMENT=${env} docker compose --profile ${env} --env-file .env.${env} down`;
const fullCommand = commandGenerator.createCommand(projectDir, command);
console.log(chalk.dim(`Executando: ${fullCommand}\n`));
execSync(fullCommand, {
stdio: 'inherit',
});
console.log(chalk.green('\n✅ Serviços parados com sucesso!'));
} catch (error) {
console.error(chalk.red('Erro ao parar serviços!'));
console.error(error);
process.exit(1);
}
};