setName('talk:phone-number:import') ->setDescription('Import a CSV list (format: "number","user") for SIP dial-in') ->addOption( 'reset', null, InputOption::VALUE_NONE, 'Delete all phone numbers before importing', ) ->addOption( 'force', 'f', InputOption::VALUE_NONE, 'Force the numbers to the given user even when they are assigned already', ) ; } protected function execute(InputInterface $input, OutputInterface $output): int { $reset = (bool)$input->getOption('reset'); $force = (bool)$input->getOption('force'); $this->db->beginTransaction(); if ($reset) { $this->db->truncateTable('talk_phone_numbers', false); $force = false; } $handle = $this->getResourceFromStdin(); if ($handle === false) { $output->writeln('Invalid StdIn provided'); return self::FAILURE; } $map = []; while ($row = fgetcsv($handle, escape: '')) { if (count($row) !== 2 || $row[0] === '' || $row[1] === '') { continue; } $phoneNumberStandard = preg_match('/^[0-9]{1,20}$/', $row[0]) ? $row[0] : $this->phoneNumberUtil->convertToStandardFormat($row[0]); if ($phoneNumberStandard === null) { $output->writeln('Not a valid phone number ' . $row[0] . '. The format is invalid.'); return self::FAILURE; } $row[0] = $phoneNumberStandard; $user = $this->userManager->get($row[1]); if (!$user instanceof IUser) { $output->writeln('Invalid user "' . $row[1] . '" provided'); return self::FAILURE; } $row[1] = $user->getUID(); $map[$row[0]] = $row[1]; } $entries = $this->mapper->findByPhoneNumbers(array_keys($map)); if (!$force && !empty($entries)) { $output->writeln('Phone number already assigned:'); foreach ($entries as $entry) { $output->writeln(' - ' . $entry->getPhoneNumber()); } return self::FAILURE; } foreach ($map as $phoneNumber => $userId) { $entry = new PhoneNumber(); $entry->setPhoneNumber($phoneNumber); $entry->setActorId($userId); $this->mapper->insert($entry); $output->writeln('Phone number ' . $entry->getPhoneNumber() . ' is now assigned to ' . $entry->getActorId() . ''); } $this->db->commit(); return self::SUCCESS; } /** * Get the resource from stdin ("talk:phone-numbers:import < file.csv") * @return resource|false */ protected function getResourceFromStdin() { return fopen('php://stdin', 'rb'); } }