copyEnums(); $this->copyExceptions(); $this->copyRoutesList(); $this->copyApiConfigInfo(); } private function copyApiConfigInfo() { $this->info('Copy Api Config'); $rootTarget = app_path('../' . self::TARGET); if (File::exists("$rootTarget/../apiConfig.readonly.json")) { File::delete("$rootTarget/../apiConfig.readonly.json"); } File::put( "$rootTarget/../apiConfig.readonly.json", \json_encode(config('api'), JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) ); } private function copyRoutesList() { $this->info('Copy Routes'); $routes = []; /** @var \Illuminate\Routing\Route */ foreach (Route::getRoutes() as $route) { if (\strpos($route->getPrefix(), 'v2') !== false) { $routes[$route->getName()] = [ 'uri' => $route->uri(), 'methods' => $route->methods() ]; } } $rootTarget = app_path('../' . self::TARGET); if (File::exists("$rootTarget/routes.json")) { File::delete("$rootTarget/routes.json"); } File::put( "$rootTarget/routes.json", \json_encode($routes, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) ); } private function copyExceptions(): void { $this->info('Copy Exceptions'); $rootTarget = app_path('../' . self::TARGET); $this->copyToFolder([ CrmException::class, ApiErrorException::class ], 'Exceptions'); $this->replaceInPhpFile( "$rootTarget/Exceptions/ApiErrorException.php", 'App\Enums\ApiError', 'LDC\LDCCRM\Enums\ApiError' ); } private function copyEnums(): void { $this->info('Copy Enums'); $classes = [ ApiError::class, ApiStatus::class, ArcadiaMailType::class, ArcadiaOrderType::class, Country::class, QuestionType::class ]; $this->copyToFolder($classes, 'Enums'); $rootTarget = app_path('../' . self::TARGET); foreach ($classes as $class) { $classBasename = class_basename($class); $dest = "$rootTarget/Enums/$classBasename.php"; $this->replaceInPhpFile($dest, 'BaseEnumRoutable', 'BaseEnum'); } } /** * Copy Classes to specified folder * * @param array $classes * @param string $folder * @return void */ private function copyToFolder(array $classes, string $folder): void { $rootTarget = app_path('../' . self::TARGET); foreach ($classes as $class) { $classFileName = \str_replace("App\\$folder\\", '', sprintf('%s.php', $class)); $classFileName = \str_replace('\\', '/', $classFileName); $classBasename = class_basename($class); $source = \app_path("$folder/$classFileName"); $dest = "$rootTarget/$folder/$classBasename.php"; if (File::exists($dest)) { File::delete($dest); } File::copy($source, $dest); $this->replaceInPhpFile($dest, 'namespace App', 'namespace ' . self::CLIENTNAMESPACE); } } private function replaceInPhpFile(string $source, string $search, string $replace): void { $fContent = File::get($source); // remove trailing \Api\V2 if ($pos = strpos($fContent, '\Api\V2')) { $fContent = substr_replace($fContent, '', $pos, strlen('\Api\V2')); } // replace namespace top level $pos = strpos($fContent, $search); if ($pos !== false) { File::put($source, \str_replace($search, $replace, $fContent)); } } }