connection = $connection; $this->eggVariableRepository = $eggVariableRepository; $this->repository = $repository; $this->nestRepository = $nestRepository; } /** * Take an uploaded JSON file and parse it into a new egg. * * @param \Illuminate\Http\UploadedFile $file * @param int $nest * @return \Pterodactyl\Models\Egg * * @throws \Pterodactyl\Exceptions\Model\DataValidationException * @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException * @throws \Pterodactyl\Exceptions\Service\Egg\BadJsonFormatException * @throws \Pterodactyl\Exceptions\Service\InvalidFileUploadException */ public function handle(UploadedFile $file, int $nest): Egg { if ($file->getError() !== UPLOAD_ERR_OK || ! $file->isFile()) { throw new InvalidFileUploadException( sprintf( 'The selected file ["%s"] was not in a valid format to import. (is_file: %s is_valid: %s err_code: %s err: %s)', $file->getFilename(), $file->isFile() ? 'true' : 'false', $file->isValid() ? 'true' : 'false', $file->getError(), $file->getErrorMessage() ) ); } $parsed = json_decode($file->openFile()->fread($file->getSize())); if (json_last_error() !== 0) { throw new BadJsonFormatException(trans('exceptions.nest.importer.json_error', [ 'error' => json_last_error_msg(), ])); } if (object_get($parsed, 'meta.version') !== 'PTDL_v1') { throw new InvalidFileUploadException(trans('exceptions.nest.importer.invalid_json_provided')); } $nest = $this->nestRepository->getWithEggs($nest); $this->connection->beginTransaction(); $egg = $this->repository->create([ 'uuid' => Uuid::uuid4()->toString(), 'nest_id' => $nest->id, 'author' => object_get($parsed, 'author'), 'name' => object_get($parsed, 'name'), 'description' => object_get($parsed, 'description'), 'features' => object_get($parsed, 'features'), // Maintain backwards compatability for eggs that are still using the old single image // string format. New eggs can provide an array of Docker images that can be used. 'docker_images' => object_get($parsed, 'images') ?? [object_get($parsed, 'image')], 'file_denylist' => implode(PHP_EOL, object_get($parsed, 'file_denylist') ?? []), 'update_url' => object_get($parsed, 'meta.update_url'), 'config_files' => object_get($parsed, 'config.files'), 'config_startup' => object_get($parsed, 'config.startup'), 'config_logs' => object_get($parsed, 'config.logs'), 'config_stop' => object_get($parsed, 'config.stop'), 'startup' => object_get($parsed, 'startup'), 'script_install' => object_get($parsed, 'scripts.installation.script'), 'script_entry' => object_get($parsed, 'scripts.installation.entrypoint'), 'script_container' => object_get($parsed, 'scripts.installation.container'), 'copy_script_from' => null, ], true, true); collect($parsed->variables)->each(function ($variable) use ($egg) { $this->eggVariableRepository->create(array_merge((array) $variable, [ 'egg_id' => $egg->id, ])); }); $this->connection->commit(); return $egg; } }