Skip to content

Commit

Permalink
[5.x] Select specific repositories for Eloquent Driver install command (
Browse files Browse the repository at this point in the history
#11381)

Co-authored-by: Kevin Meijer <kevin@justbetter.nl>
Co-authored-by: Duncan McClean <duncan@duncanmcclean.com>
  • Loading branch information
3 people authored Feb 5, 2025
1 parent e35a2d5 commit 053a48d
Showing 1 changed file with 75 additions and 44 deletions.
119 changes: 75 additions & 44 deletions src/Console/Commands/InstallEloquentDriver.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ class InstallEloquentDriver extends Command
*/
protected $signature = 'statamic:install:eloquent-driver
{ --all : Configures all repositories to use the database }
{ --repositories= : Comma separated list of repositories to migrate }
{ --import : Whether existing data should be imported }
{ --without-messages : Disables output messages }';

Expand Down Expand Up @@ -68,13 +69,19 @@ public function handle()
return $this->components->error('Failed to connect to the configured database. Please check your database configuration and try again.');
}

if ($this->availableRepositories()->isEmpty()) {
if ($this->allRepositories()->reject(fn ($value, $key) => $this->repositoryHasBeenMigrated($key))->isEmpty()) {
return $this->components->warn("No repositories left to migrate. You're already using the Eloquent Driver for all repositories.");
}

$repositories = $this->repositories();

foreach ($repositories as $repository) {
if ($this->repositoryHasBeenMigrated($repository)) {
$this->components->warn("Skipping. The {$repository} repository is already using the Eloquent Driver.");

continue;
}

$method = 'migrate'.Str::studly($repository);
$this->$method();
}
Expand All @@ -86,17 +93,38 @@ protected function repositories(): array
return $this->availableRepositories()->keys()->all();
}

if ($repositories = $this->option('repositories')) {
$repositories = collect(explode(',', $repositories))
->map(fn ($repo) => trim(strtolower($repo)))
->unique();

$invalidRepositories = $repositories->reject(fn ($repo) => $this->allRepositories()->has($repo));

if ($invalidRepositories->isNotEmpty()) {
$this->components->error("Some of the repositories you provided are invalid: {$invalidRepositories->implode(', ')}");

exit(1);
}

return $repositories
->filter(fn ($repo) => $this->allRepositories()->has($repo))
->values()
->all();
}

return multiselect(
label: 'Which repositories would you like to migrate?',
options: $this->availableRepositories()->all(),
options: $this->allRepositories()
->reject(fn ($value, $key) => $this->repositoryHasBeenMigrated($key))
->all(),
validate: fn (array $values) => count($values) === 0
? 'You must select at least one repository to migrate.'
: null,
hint: 'You can always import other repositories later.'
);
}

protected function availableRepositories(): Collection
protected function allRepositories(): Collection
{
return collect([
'asset_containers' => 'Asset Containers',
Expand All @@ -117,64 +145,67 @@ protected function availableRepositories(): Collection
'taxonomies' => 'Taxonomies',
'terms' => 'Terms',
'tokens' => 'Tokens',
])->reject(function ($value, $key) {
switch ($key) {
case 'asset_containers':
return config('statamic.eloquent-driver.asset_containers.driver') === 'eloquent';
]);
}

protected function repositoryHasBeenMigrated(string $repository): bool
{
switch ($repository) {
case 'asset_containers':
return config('statamic.eloquent-driver.asset_containers.driver') === 'eloquent';

case 'assets':
return config('statamic.eloquent-driver.assets.driver') === 'eloquent';
case 'assets':
return config('statamic.eloquent-driver.assets.driver') === 'eloquent';

case 'blueprints':
return config('statamic.eloquent-driver.blueprints.driver') === 'eloquent';
case 'blueprints':
return config('statamic.eloquent-driver.blueprints.driver') === 'eloquent';

case 'collections':
return config('statamic.eloquent-driver.collections.driver') === 'eloquent';
case 'collections':
return config('statamic.eloquent-driver.collections.driver') === 'eloquent';

case 'collection_trees':
return config('statamic.eloquent-driver.collection_trees.driver') === 'eloquent';
case 'collection_trees':
return config('statamic.eloquent-driver.collection_trees.driver') === 'eloquent';

case 'entries':
return config('statamic.eloquent-driver.entries.driver') === 'eloquent';
case 'entries':
return config('statamic.eloquent-driver.entries.driver') === 'eloquent';

case 'fieldsets':
return config('statamic.eloquent-driver.fieldsets.driver') === 'eloquent';
case 'fieldsets':
return config('statamic.eloquent-driver.fieldsets.driver') === 'eloquent';

case 'forms':
return config('statamic.eloquent-driver.forms.driver') === 'eloquent';
case 'forms':
return config('statamic.eloquent-driver.forms.driver') === 'eloquent';

case 'form_submissions':
return config('statamic.eloquent-driver.form_submissions.driver') === 'eloquent';
case 'form_submissions':
return config('statamic.eloquent-driver.form_submissions.driver') === 'eloquent';

case 'globals':
return config('statamic.eloquent-driver.global_sets.driver') === 'eloquent';
case 'globals':
return config('statamic.eloquent-driver.global_sets.driver') === 'eloquent';

case 'global_variables':
return config('statamic.eloquent-driver.global_set_variables.driver') === 'eloquent';
case 'global_variables':
return config('statamic.eloquent-driver.global_set_variables.driver') === 'eloquent';

case 'navs':
return config('statamic.eloquent-driver.navigations.driver') === 'eloquent';
case 'navs':
return config('statamic.eloquent-driver.navigations.driver') === 'eloquent';

case 'nav_trees':
return config('statamic.eloquent-driver.navigation_trees.driver') === 'eloquent';
case 'nav_trees':
return config('statamic.eloquent-driver.navigation_trees.driver') === 'eloquent';

case 'revisions':
return ! config('statamic.revisions.enabled')
|| config('statamic.eloquent-driver.revisions.driver') === 'eloquent';
case 'revisions':
return ! config('statamic.revisions.enabled')
|| config('statamic.eloquent-driver.revisions.driver') === 'eloquent';

case 'sites':
return config('statamic.eloquent-driver.sites.driver') === 'eloquent';
case 'sites':
return config('statamic.eloquent-driver.sites.driver') === 'eloquent';

case 'taxonomies':
return config('statamic.eloquent-driver.taxonomies.driver') === 'eloquent';
case 'taxonomies':
return config('statamic.eloquent-driver.taxonomies.driver') === 'eloquent';

case 'terms':
return config('statamic.eloquent-driver.terms.driver') === 'eloquent';
case 'terms':
return config('statamic.eloquent-driver.terms.driver') === 'eloquent';

case 'tokens':
return config('statamic.eloquent-driver.tokens.driver') === 'eloquent';
}
});
case 'tokens':
return config('statamic.eloquent-driver.tokens.driver') === 'eloquent';
}
}

protected function migrateAssetContainers(): void
Expand Down

0 comments on commit 053a48d

Please sign in to comment.