diff --git a/domains/CreateProjectForm/Http/Controllers/CreateProjectController.php b/domains/CreateProjectForm/Http/Controllers/CreateProjectController.php index 408c410e..a07ebc89 100644 --- a/domains/CreateProjectForm/Http/Controllers/CreateProjectController.php +++ b/domains/CreateProjectForm/Http/Controllers/CreateProjectController.php @@ -3,25 +3,58 @@ namespace Domains\CreateProjectForm\Http\Controllers; use Domains\CreateProjectForm\Http\Request\CreateProjectRequest; +use Domains\ProjectTemplate\ProjectTemplateService; use Domains\ProjectTemplateCustomization\ProjectTemplateCustomizer; use Domains\Statistics\StatisticsService; use Illuminate\Foundation\Application; +use Illuminate\Support\Facades\Cache; use Symfony\Component\HttpFoundation\Response; class CreateProjectController { - public function __invoke( - CreateProjectRequest $request, - ProjectTemplateCustomizer $builder, - Application $app, - StatisticsService $statistics, - ): Response { + public function __construct( + private readonly ProjectTemplateService $templateStorage, + private readonly ProjectTemplateCustomizer $builder, + private readonly Application $app, + private readonly StatisticsService $statistics, + ) { + } + + public function __invoke(CreateProjectRequest $request) : Response + { + $this->maybeUpdateTemplate(); + $form = $request->buildForm(); - $name = $form->metadata->projectName; - $archive = $builder->build($form); + $archive = $this->builder->build($form); - $app->terminating(fn () => rescue(fn () => $statistics->record($request))); + $this->recordStatistics($request); + $name = $form->metadata->projectName; return $archive->outputAsSymfonyResponse("$name.zip"); } + + private function recordStatistics(CreateProjectRequest $request) : void + { + $this->app->terminating(function () use ($request) { + rescue(fn () => $this->statistics->record($request)); + }); + } + + private function maybeUpdateTemplate() : void + { + $this->app->terminating(function () { + if (Cache::get('template-requires-check') === false) { + return; + } + + info("Checking if template needs an update triggered by a CreateProjectRequest..."); + if ($this->templateStorage->canBeUpdated()) { + info("Updating template triggered by a CreateProjectRequest..."); + $this->templateStorage->update(); + } + + info("Don't check again for 24 hours..."); + Cache::set('template-requires-check', false, ttl: now()->addDays(1)); + }); + } } diff --git a/domains/ProjectTemplate/Console/Commands/UpdateTemplateCommand.php b/domains/ProjectTemplate/Console/Commands/UpdateTemplateCommand.php index 5ddde380..d8990bb1 100644 --- a/domains/ProjectTemplate/Console/Commands/UpdateTemplateCommand.php +++ b/domains/ProjectTemplate/Console/Commands/UpdateTemplateCommand.php @@ -2,8 +2,7 @@ namespace Domains\ProjectTemplate\Console\Commands; -use Domains\ProjectTemplate\LaravelDownloader; -use Domains\ProjectTemplate\TemplateStorage; +use Domains\ProjectTemplate\ProjectTemplateService; use Illuminate\Console\Command; use Log; @@ -12,29 +11,23 @@ class UpdateTemplateCommand extends Command protected $signature = 'initializer:update-template'; protected $description = 'Downloads the latest release of Laravel if necessary.'; - public function handle( - LaravelDownloader $downloader, - TemplateStorage $templateStorage, - ): void { - $latestRelease = $downloader->latestRelease(); - - if ($templateStorage->currentVersion() === $latestRelease->version) { - $this->logAndInfo("$latestRelease->version is still the latest release!"); + public function handle(ProjectTemplateService $template) : void + { + if (! $template->canBeUpdated()) { + $this->logAndInfo("Local template storage does not need to be updated"); return; } - $this->logAndInfo("Downloading $latestRelease->version..."); - - $downloadedRelease = $downloader->download($latestRelease); - $templateStorage->updateCurrentRelease($downloadedRelease); + $this->logAndInfo("Downloading latest release..."); + $template->update(); - $this->logAndInfo("Finished downloading $latestRelease->version!"); + $this->logAndInfo("Template was updated to the latest release!"); } - private function logAndInfo(string $message): void + private function logAndInfo(string $message) : void { $this->info($message); Log::info($message); } -} +} \ No newline at end of file diff --git a/domains/ProjectTemplate/ProjectTemplateService.php b/domains/ProjectTemplate/ProjectTemplateService.php new file mode 100644 index 00000000..a92ddfdd --- /dev/null +++ b/domains/ProjectTemplate/ProjectTemplateService.php @@ -0,0 +1,27 @@ +downloader->latestRelease(); + $currentVersion = $this->storage->currentVersion(); + + return $latestRelease->version !== $currentVersion; + } + + public function update() : void + { + $latestRelease = $this->downloader->latestRelease(); + $downloadedRelease = $this->downloader->download($latestRelease); + $this->storage->updateCurrentRelease($downloadedRelease); + } +}