addArgument('module', InputArgument::REQUIRED, 'O nome do módulo a ser removido') ->addOption('force', 'f', InputOption::VALUE_NONE, 'Confirmar a remoção sem prompt'); } protected function execute(InputInterface $input, OutputInterface $output): int { $moduleName = $input->getArgument('module'); $force = $input->getOption('force'); $modulePath = dirname(__DIR__, 3) . '/modules/' . $moduleName; if (!is_dir($modulePath)) { $output->writeln("Módulo '{$moduleName}' não encontrado em modules/."); return Command::FAILURE; } if (!$force) { $output->writeln("Você tem certeza que deseja remover o módulo '{$moduleName}' e TODAS as suas tabelas associadas?"); $output->writeln("Use a opção --force para confirmar."); return Command::FAILURE; } // 1. Drop associated tables if listed in module.json $jsonPath = $modulePath . '/module.json'; if (file_exists($jsonPath)) { $config = json_decode(file_get_contents($jsonPath), true); if (isset($config['tables']) && is_array($config['tables'])) { $output->writeln("Limpando tabelas do banco de dados..."); Capsule::connection()->statement('SET FOREIGN_KEY_CHECKS = 0'); foreach ($config['tables'] as $table) { $output->write("Dropando tabela: {$table}... "); Capsule::schema()->dropIfExists($table); $output->writeln('OK'); } Capsule::connection()->statement('SET FOREIGN_KEY_CHECKS = 1'); } } // 2. Remove files $output->writeln("Removendo arquivos do módulo..."); $this->deleteDirectory($modulePath); $output->writeln("Módulo '{$moduleName}' removido com sucesso!"); return Command::SUCCESS; } protected function deleteDirectory($dir): bool { if (!file_exists($dir)) { return true; } if (!is_dir($dir)) { return unlink($dir); } foreach (scandir($dir) as $item) { if ($item == '.' || $item == '..') { continue; } if (!$this->deleteDirectory($dir . DIRECTORY_SEPARATOR . $item)) { return false; } } return rmdir($dir); } }