Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ACMS-4234: Add config action to import core site studio packages. #1918

Open
wants to merge 8 commits into
base: develop
Choose a base branch
from
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
name: 'Acquia Starter Kit Site Studio'
package: 'Acquia Starter Kit'
description: 'Module for Site Studio package import from recipes.'
core_version_requirement: ^10.3 || ^11
type: module
dependencies:
- acquia_cms_site_studio:acquia_cms_site_studio
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
services:
acquia_starterkit_site_studio.package_source.default_recipe_package:
class: Drupal\acquia_starterkit_site_studio\Services\DefaultRecipePackage
arguments:
- '@module_handler'
- '@config.factory'
tags:
- { name: sitestudio_package_source, priority: 50 }
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
-
type: default_module_package
source:
module_name: acquia_cms_site_studio
path: config/pack_acquia_cms_core
options:
extra-validation: false
-
type: default_recipe_package
source:
dependencies:
recipes:
- acquia_starterkit_remote_video
recipe_name: acquia_starterkit_remote_video
path: site_studio/pack_acquia_starterkit_remote_video
options:
extra-validation: false
-
type: default_module_package
source:
dependencies:
- acquia_cms_search
module_name: acquia_cms_search
path: config/pack_acquia_cms_search
options:
extra-validation: false
-
type: default_recipe_package
source:
dependencies:
recipes:
- acquia_starterkit_image
recipe_name: acquia_starterkit_image
path: site_studio/pack_acquia_starterkit_image
options:
extra-validation: false
-
type: default_recipe_package
source:
dependencies:
recipes:
- acquia_starterkit_image
recipe_name: acquia_starterkit_image
path: site_studio/pack_acquia_starterkit_image_core
options:
extra-validation: false
-
type: default_recipe_package
source:
dependencies:
recipes:
- acquia_starterkit_page
recipe_name: acquia_starterkit_page
path: site_studio/pack_acquia_starterkit_page
options:
extra-validation: false
-
type: default_recipe_package
source:
dependencies:
recipes:
- acquia_starterkit_place
recipe_name: acquia_starterkit_place
path: site_studio/pack_acquia_starterkit_place
options:
extra-validation: false
-
type: default_recipe_package
source:
dependencies:
modules:
- acquia_cms_search
recipes:
- acquia_starterkit_place
recipe_name: acquia_starterkit_place
path: site_studio/pack_acquia_starterkit_place_search
options:
extra-validation: false
-
type: default_recipe_package
source:
dependencies:
recipes:
- acquia_starterkit_event
recipe_name: acquia_starterkit_event
path: site_studio/pack_acquia_starterkit_event
options:
extra-validation: false
-
type: default_recipe_package
source:
dependencies:
modules:
- acquia_cms_search
recipes:
- acquia_starterkit_event
recipe_name: acquia_starterkit_event
path: site_studio/pack_acquia_starterkit_event_search
options:
extra-validation: false
-
type: default_recipe_package
source:
dependencies:
recipes:
- acquia_starterkit_person
recipe_name: acquia_starterkit_person
path: site_studio/pack_acquia_starterkit_person
options:
extra-validation: false
-
type: default_recipe_package
source:
dependencies:
modules:
- acquia_cms_search
recipes:
- acquia_starterkit_person
recipe_name: acquia_starterkit_person
path: site_studio/pack_acquia_starterkit_person_search
options:
extra-validation: false
-
type: default_recipe_package
source:
dependencies:
recipes:
- acquia_starterkit_article
recipe_name: acquia_starterkit_article
path: site_studio/pack_acquia_starterkit_article
options:
extra-validation: false
-
type: default_recipe_package
source:
dependencies:
modules:
- acquia_cms_search
recipes:
- acquia_starterkit_article
recipe_name: acquia_starterkit_article
path: site_studio/pack_acquia_starterkit_article_search
options:
extra-validation: false
-
type: default_recipe_package
source:
dependencies:
recipes:
- acquia_starterkit_dam
recipe_name: acquia_starterkit_dam
path: site_studio/pack_acquia_starterkit_dam
options:
extra-validation: false
-
type: default_recipe_package
source:
dependencies:
recipes:
- acquia_starterkit_remote_audio
recipe_name: acquia_starterkit_remote_audio
path: site_studio/pack_acquia_starterkit_remote_audio
options:
extra-validation: false
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
<?php

declare(strict_types=1);

namespace Drupal\acquia_starterkit_site_studio\Plugin\ConfigAction;

use Drupal\cohesion\Controller\AdministrationController;
use Drupal\Component\Render\PlainTextOutput;
use Drupal\Core\Config\Action\Attribute\ConfigAction;
use Drupal\Core\Config\Action\ConfigActionPluginInterface;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Extension\ModuleHandler;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\Core\Site\Settings;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
* The action to import base Site Studio packages.
*/
#[ConfigAction(
id: 'basePackageImport',
admin_label: new TranslatableMarkup('Import base Site Studio packages.'),
)]
final class BasePackageImport implements ConfigActionPluginInterface, ContainerFactoryPluginInterface {

/**
* Constructs a SimpleConfigUpdate object.
*
* @param \Drupal\Core\Config\ConfigFactoryInterface $configFactory
* The config factory.
* @param \Drupal\Core\Site\Settings $settings
* The settings.
* @param \Drupal\Core\Extension\ModuleHandler $moduleHandler
* The module handler.
*/
public function __construct(
protected readonly ConfigFactoryInterface $configFactory,
protected readonly Settings $settings,
protected readonly ModuleHandler $moduleHandler,
) {
}

/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition): static {
return new static(
$container->get('config.factory'),
$container->get('settings'),
$container->get('module_handler'),
);
}

/**
* {@inheritdoc}
*/
public function apply(string $configName, mixed $value): void {
if ($configName === 'cohesion.settings' && $value) {
$this->updateConfig($configName);
}
}

/**
* Updates the configuration with API and organization keys.
*
* @param string $configName
* The name of the configuration.
*/
private function updateConfig(string $configName): void {
$config = $this->configFactory->get($configName);
$apiKey = $config->get('api_key');
$orgKey = $config->get('organization_key');

if (!($apiKey && $orgKey)) {
$apiKey = getenv('SITESTUDIO_API_KEY') ?? $this->settings->get('cohesion.settings')->get('api_key');
$orgKey = getenv('SITESTUDIO_ORG_KEY') ?? $this->settings->get('cohesion.settings')->get('organization_key');
if (!($apiKey && $orgKey)) {
return;
}
}

$this->configFactory->getEditable($configName)
->set('api_key', $apiKey)
->set('organization_key', $orgKey)
->save(TRUE);

if (PHP_SAPI === 'cli' && !function_exists('drush_backend_batch_process')) {
$this->notifyManualImport();
} else {
$this->importBasePackages();
}
}

/**
* Notifies the user to import packages manually from the UI.
*/
private function notifyManualImport(): void {
$output = new SymfonyStyle(new ArgvInput(), new ConsoleOutput());
$output->warning($this->toPlainString(
t('Please import site studio packages from UI: @uri.', [
'@uri' => '/admin/cohesion/configuration/account-settings'
])));
}

/**
* Converts a stringable like TranslatableMarkup to a plain text string.
*
* @param \Stringable|string $text
* The string to convert.
*
* @return string
* The plain text string.
*/
private function toPlainString(\Stringable|string $text): string {
return PlainTextOutput::renderFromHtml((string) $text);
}

/**
* Imports the base Site Studio packages.
*/
private function importBasePackages(): void {
$this->initializeBatch();
$this->processBatchIfCli();
}

/**
* Initializes the batch process for importing packages.
*/
private function initializeBatch(): void {
batch_set(AdministrationController::batchAction(TRUE));
}

/**
* Processes the batch if running in CLI mode.
*/
private function processBatchIfCli(): void {
if (PHP_SAPI === 'cli') {
drush_backend_batch_process();
}
}

}
Loading
Loading