importDataFromRequest($request); $status = NotificationLevel::ERROR; $message = 'Import failed.'; foreach ($import['logs'] as $log) { $this->createModel($request->header->account, $log, ExchangeLogMapper::class, 'import', $request->getOrigin()); } if ($import['status']) { $status = NotificationLevel::OK; $message = 'Import succeeded.'; } $response->set($request->uri->__toString(), [ 'status' => $status, 'title' => 'Exchange', 'message' => $message, ]); } /** * Method to import data based on a request * * @param RequestAbstract $request Request * * @return array * * @since 1.0.0 */ private function importDataFromRequest(RequestAbstract $request) : array { /** @var \Modules\Exchange\Models\InterfaceManager $interface */ $interface = InterfaceManagerMapper::get()->where('id', $request->getData('id'))->execute(); $dirname = \basename(\dirname($interface->getPath())); /** @var class-string<\Modules\Exchange\Models\ImporterAbstract> $class */ $class = '\\Modules\\Exchange\\Interfaces\\' . $dirname . '\\Importer'; if (!Autoloader::exists($class)) { return []; } $remoteConnection = new NullConnection(); if (!empty($request->getData('dbtype'))) { $remoteConnection = ConnectionFactory::create([ 'db' => $request->getData('dbtype') ?? null, 'host' => $request->getData('dbhost') ?? null, 'port' => $request->getData('dbport') ?? null, 'database' => $request->getData('dbdatabase') ?? null, 'login' => $request->getData('dblogin') ?? null, 'password' => $request->getData('dbpassword') ?? null, ]); } /** @var \Modules\Exchange\Models\ImporterAbstract $importer */ $importer = new $class($this->app->dbPool->get(), $remoteConnection, new L11nManager($this->app->appName)); return $importer->importFromRequest($request); } /** * Method to validate account creation from request * * @param RequestAbstract $request Request * * @return array * * @since 1.0.0 */ private function validateInterfaceInstall(RequestAbstract $request) : array { $val = []; if (($val['interface'] = empty($request->getData('interface'))) || ($val['path'] = !\is_dir(__DIR__ . '/../Interfaces/' . $request->getData('interface'))) ) { return $val; } return []; } /** * Api method to install exchange interface * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response * @param mixed $data Generic data * * @return void * * @api * * @since 1.0.0 */ public function apiInterfaceInstall(RequestAbstract $request, ResponseAbstract $response, $data = null) : void { if (!empty($val = $this->validateInterfaceInstall($request))) { $response->set('interface_install', new FormValidation($val)); $response->header->status = RequestStatusCode::R_400; return; } $interfacePath = \realpath(__DIR__ . '/../Interfaces/' . $request->getData('interface') . '/interface.json'); if ($interfacePath === false) { return; // @codeCoverageIgnore } $interface = new InterfaceManager($interfacePath); $interface->load(); InterfaceManagerMapper::create()->execute($interface); $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Interface', 'Interface successfully installed', $interface); } /** * Api method to export data * * @param RequestAbstract $request Request * @param HttpResponse $response Response * @param mixed $data Generic data * * @return void * * @api * * @since 1.0.0 */ public function apiExchangeExport(RequestAbstract $request, HttpResponse $response, $data = null) : void { $export = $this->exportDataFromRequest($request); if (!isset($export['type'], $export['logs'])) { $response->header->status = RequestStatusCode::R_400; $status = NotificationLevel::ERROR; $message = 'Export failed.'; $response->set($request->uri->__toString(), [ 'status' => $status, 'title' => 'Exchange', 'message' => $message, ]); return; } if ($export['type'] === 'file') { foreach ($export['logs'] as $log) { $this->createModel($request->header->account, $log, ExchangeLogMapper::class, 'export', $request->getOrigin()); } $file = \explode('.', $export['name']); $response->header->setDownloadable($file[0], $file[1]); switch ($file[1]) { case 'csv': $response->header->set( 'Content-disposition', 'attachment; filename="' . $export['name'] . '"' , true); //$response->header->set('Content-Type', MimeType::M_CONF, true); break; } $response->set($request->uri->__toString(), $export['content']); } } /** * Method to export data based on a request * * @param RequestAbstract $request Request * * @return array * * @since 1.0.0 */ private function exportDataFromRequest(RequestAbstract $request) : array { /** @var \Modules\Exchange\Models\InterfaceManager $interface */ $interface = InterfaceManagerMapper::get()->where('id', $request->getData('id'))->execute(); $dirname = \basename(\dirname($interface->getPath())); if (!Autoloader::exists($class = '\\Modules\\Exchange\\Interfaces\\' . $dirname . '\\Exporter')) { return []; } $exporter = new $class($this->app->dbPool->get(), new L11nManager($this->app->appName)); return $exporter->exportFromRequest($request); } /** * Api method to handle file upload * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response * @param mixed $data Generic data * * @return void * * @api * * @since 1.0.0 */ public function apiExchangeUpload(RequestAbstract $request, ResponseAbstract $response, $data = null) : void { Directory::delete(__DIR__ . '/../tmp/'); $upload = new UploadFile(); $upload->outputDir = __DIR__ . '/../tmp/'; $upload->upload($request->getFiles()); } }