diff --git a/.opts.yml b/.opts.yml index 6ba43c612e139f80de47548c1c556d1ee3f45888..08b2313c75bb424d3f8582021aa1e7237cd6c904 100644 --- a/.opts.yml +++ b/.opts.yml @@ -14,17 +14,14 @@ upgrade_commands: - rm disable-config-readonly - vendor/bin/drush joinup:unpublish-alert --category - scripts/check_status_report.php + # TODO: Remove this command in ISAICP-9053. + - vendor/bin/drush state:set joinup.oss_catalogue_is_disabled 1 --input-format=boolean append: - production: - # TODO: Remove this command in ISAICP-9053. - - vendor/bin/drush state:set joinup.oss_catalogue_is_disabled 1 --input-format=boolean acceptance: - touch disable-config-readonly - vendor/bin/drush joinup:acc - vendor/bin/drush cache:rebuild - rm disable-config-readonly - # TODO: Remove this command in ISAICP-9053. - - vendor/bin/drush state:set joinup.oss_catalogue_is_disabled 1 --input-format=boolean ephemeral: - touch disable-config-readonly - vendor/bin/drush joinup:acc diff --git a/tests/features/communities/oss_catalogue/oss_catalogue_visibility.feature b/tests/features/communities/oss_catalogue/oss_catalogue_visibility.feature index de3d282ba23f562d8d49a2cd4299d86c63b7bd6f..36fc5ecd6be63d9f42a37cad0f31589b55826f73 100644 --- a/tests/features/communities/oss_catalogue/oss_catalogue_visibility.feature +++ b/tests/features/communities/oss_catalogue/oss_catalogue_visibility.feature @@ -7,44 +7,6 @@ Feature: Test EU OSS Catalogue killswitch | title | oss_development_status | oss_source | oss_categories | oss_short_description | status | | The Opensource Panacea | development | developers_italia | content-management | The cure | published | - When I go to "/eu-oss-catalogue" - Then the response status code should be 200 - But I should not see "Sign in to continue" - And I go to "/eu-oss-catalogue/solutions" - Then the response status code should be 200 - But I should not see "Sign in to continue" - And I go to the content page of the type "oss_solution" with the title "The Opensource Panacea" - Then the response status code should be 200 - But I should not see "Sign in to continue" - - Given I am logged in as an "authenticated" - When I go to "/eu-oss-catalogue" - And I check "I agree to the Legal notice document" - And I press "Submit" - Then the response status code should be 200 - And I go to "/eu-oss-catalogue/solutions" - Then the response status code should be 200 - And I go to the content page of the type "oss_solution" with the title "The Opensource Panacea" - Then the response status code should be 200 - - Given I am logged in as a "developer" - When I go to "/eu-oss-catalogue" - Then the response status code should be 200 - And I go to "/eu-oss-catalogue/solutions" - Then the response status code should be 200 - And I go to "/admin/content/eu-oss-catalogue" - Then the response status code should be 200 - And I go to "/admin/content/eu-oss-catalogue/oss-solutions" - Then the response status code should be 200 - And I go to "/admin/content/eu-oss-catalogue/log" - Then the response status code should be 200 - And I go to the content page of the type "oss_solution" with the title "The Opensource Panacea" - Then the response status code should be 200 - - Given I visit "/dashboard" - When I press "Disable EU OSS Catalogue" - Then I should see the success message "EU OSS Catalogue has been disabled" - Given I am an anonymous user When I go to "/eu-oss-catalogue" Then I should see the heading "Sign in to continue" @@ -52,6 +14,8 @@ Feature: Test EU OSS Catalogue killswitch Then I should see the heading "Sign in to continue" And I go to the content page of the type "oss_solution" with the title "The Opensource Panacea" Then I should see the heading "Sign in to continue" + When I am on the homepage + Then I should not see "EU Open Source Solutions Catalogue" Given I am logged in as an "authenticated" When I go to "/eu-oss-catalogue" @@ -62,6 +26,8 @@ Feature: Test EU OSS Catalogue killswitch Then the response status code should be 403 And I go to the content page of the type "oss_solution" with the title "The Opensource Panacea" Then the response status code should be 403 + When I am on the homepage + Then I should not see "EU Open Source Solutions Catalogue" Given I am logged in as a "developer" When I go to "/eu-oss-catalogue" @@ -77,6 +43,8 @@ Feature: Test EU OSS Catalogue killswitch # Developer is and amin role, they can still see the node. And I go to the content page of the type "oss_solution" with the title "The Opensource Panacea" Then the response status code should be 200 + When I am on the homepage + Then I should not see "EU Open Source Solutions Catalogue" Given I visit "/dashboard" When I press "Enable EU OSS Catalogue" @@ -105,6 +73,8 @@ Feature: Test EU OSS Catalogue killswitch And I go to the content page of the type "oss_solution" with the title "The Opensource Panacea" Then the response status code should be 200 But I should not see "Sign in to continue" + When I am on the homepage + Then I should see "EU Open Source Solutions Catalogue" Given I am logged in as an "authenticated" When I go to "/eu-oss-catalogue" @@ -115,3 +85,48 @@ Feature: Test EU OSS Catalogue killswitch Then the response status code should be 200 And I go to the content page of the type "oss_solution" with the title "The Opensource Panacea" Then the response status code should be 200 + When I am on the homepage + Then I should see "EU Open Source Solutions Catalogue" + + Given I am logged in as a "developer" + When I visit "/dashboard" + And I press "Disable EU OSS Catalogue" + Then I should see the success message "EU OSS Catalogue has been disabled" + + When I go to "/eu-oss-catalogue" + Then the response status code should be 403 + And I go to "/eu-oss-catalogue/solutions" + Then the response status code should be 403 + And I go to "/admin/content/eu-oss-catalogue" + Then the response status code should be 403 + And I go to "/admin/content/eu-oss-catalogue/oss-solutions" + Then the response status code should be 403 + And I go to "/admin/content/eu-oss-catalogue/log" + Then the response status code should be 403 + # Developer is and amin role, they can still see the node. + And I go to the content page of the type "oss_solution" with the title "The Opensource Panacea" + Then the response status code should be 200 + When I am on the homepage + Then I should not see "EU Open Source Solutions Catalogue" + + Given I am an anonymous user + When I go to "/eu-oss-catalogue" + Then I should see the heading "Sign in to continue" + And I go to "/eu-oss-catalogue/solutions" + Then I should see the heading "Sign in to continue" + And I go to the content page of the type "oss_solution" with the title "The Opensource Panacea" + Then I should see the heading "Sign in to continue" + When I am on the homepage + Then I should not see "EU Open Source Solutions Catalogue" + + Given I am logged in as an "authenticated" + When I go to "/eu-oss-catalogue" + And I check "I agree to the Legal notice document" + And I press "Submit" + Then the response status code should be 403 + And I go to "/eu-oss-catalogue/solutions" + Then the response status code should be 403 + And I go to the content page of the type "oss_solution" with the title "The Opensource Panacea" + Then the response status code should be 403 + When I am on the homepage + Then I should not see "EU Open Source Solutions Catalogue" diff --git a/web/modules/custom/dashboard/src/Form/DashboardForm.php b/web/modules/custom/dashboard/src/Form/DashboardForm.php index 0c0a74d9098a74612df358c64a5aec2923ca8e63..50bb8f838aac17738a6e4b1aaf810986bd50ce89 100644 --- a/web/modules/custom/dashboard/src/Form/DashboardForm.php +++ b/web/modules/custom/dashboard/src/Form/DashboardForm.php @@ -6,6 +6,8 @@ use Drupal\Core\Access\AccessResultInterface; use Drupal\Core\Cache\CacheBackendInterface; +use Drupal\Core\Database\Connection; +use Drupal\Core\Entity\EntityTypeManagerInterface; use Drupal\Core\Form\FormBase; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Render\Element; @@ -13,6 +15,9 @@ use Drupal\Core\Url; use Drupal\joinup_core\Logger\Handler\MailHandler; use Drupal\joinup_core\Logger\Handler\TelegramHandler; +use Drupal\joinup_oss_catalogue\OssCatalogueCollectionInterface; +use Drupal\rdf_sync\RdfSyncConnectionInterface; +use Solarium\Core\Query\Helper; use Symfony\Component\DependencyInjection\ContainerInterface; /** @@ -23,6 +28,9 @@ class DashboardForm extends FormBase { public function __construct( protected StateInterface $state, protected CacheBackendInterface $pageCache, + protected EntityTypeManagerInterface $entityTypeManager, + protected RdfSyncConnectionInterface $rdfSyncConnection, + protected Connection $db, ) { } @@ -33,6 +41,9 @@ public static function create(ContainerInterface $container): self { return new static( $container->get('state'), $container->get('cache.page'), + $container->get('entity_type.manager'), + $container->get('rdf_sync.connection'), + $container->get('database'), ); } @@ -125,6 +136,10 @@ public function buildForm(array $form, FormStateInterface $form_state): array { */ public function enableEuOssCatalogueSubmitForm(): void { $this->state->delete('joinup.oss_catalogue_is_disabled'); + $this->entityTypeManager->getStorage('rdf_entity') + ->load(OssCatalogueCollectionInterface::COLLECTION_ENTITY_ID) + ->set('field_ar_state', 'published') + ->save(); // Only clear cache for anonymous. $this->pageCache->deleteAll(); $this->messenger()->addStatus($this->t('EU OSS Catalogue has been enabled')); @@ -137,6 +152,35 @@ public function enableEuOssCatalogueSubmitForm(): void { */ public function disableEuOssCatalogueSubmitForm(): void { $this->state->set('joinup.oss_catalogue_is_disabled', TRUE); + $uri = OssCatalogueCollectionInterface::COLLECTION_ENTITY_ID; + $collection = $this->entityTypeManager->getStorage('rdf_entity')->load($uri); + $collection->set('field_ar_state', 'draft')->save(); + + // Unfortunately, we cannot unpublish a collection. When setting the state + // to 'draft', we're creating a forward revision. In order to unpublish, we: + // - Remove the published triples. + // - Remove the document from Solr and from search_api_item table. + $sparql = <<<SPARQL + WITH <http://joinup.eu/collection/published> + DELETE { <$uri> ?p ?o } + WHERE { <$uri> ?p ?o } + SPARQL; + $this->rdfSyncConnection->update($sparql); + $sapiId = 'entity:rdf_entity/' . $uri; + $solrHelper = new Helper(); + /** @var \Drupal\search_api_solr\SolrConnectorInterface $connector */ + $connector = $this->entityTypeManager->getStorage('search_api_server') + ->load('joinup')->getBackend()->getSolrConnector(); + $updateQuery = $connector + ->getUpdateQuery() + ->addDeleteQuery('ss_search_api_id:' . $solrHelper->escapePhrase($sapiId)) + ->addCommit(); + $connector->update($updateQuery); + $this->db->delete('search_api_item') + ->condition('index_id', ['published', 'unpublished'], 'IN') + ->condition('item_id', $sapiId) + ->execute(); + // Only clear cache for anonymous. $this->pageCache->deleteAll(); $this->messenger()->addStatus($this->t('EU OSS Catalogue has been disabled')); diff --git a/web/modules/custom/joinup_communities/joinup_oss_catalogue/joinup_oss_catalogue.install b/web/modules/custom/joinup_communities/joinup_oss_catalogue/joinup_oss_catalogue.install index 8de55f0c533be8000fa8748bfd737656825e9c4b..bc81a4d60bc9f126a023eb2bc67fc723deb392c9 100644 --- a/web/modules/custom/joinup_communities/joinup_oss_catalogue/joinup_oss_catalogue.install +++ b/web/modules/custom/joinup_communities/joinup_oss_catalogue/joinup_oss_catalogue.install @@ -8,6 +8,7 @@ declare(strict_types=1); use Drupal\joinup_oss_catalogue\OssCatalogueCollectionInterface; +use Solarium\Core\Query\Helper; /** * Publish the EU OSS Catalogue collection. @@ -18,3 +19,46 @@ function joinup_oss_catalogue_update_200001(): void { $collection->skip_notification = TRUE; $collection->set('field_ar_state', 'published')->save(); } + +/** + * Fix OSS Catalogue collection fields. + */ +function joinup_oss_catalogue_update_200002(): void { + $entityTypeManger = \Drupal::entityTypeManager(); + $uri = OssCatalogueCollectionInterface::COLLECTION_ENTITY_ID; + $collection = $entityTypeManger->getStorage('rdf_entity')->load($uri); + $collection->skip_notification = TRUE; + $collection + ->set('field_ar_state', 'draft') + ->set('field_topic', 11195) + ->save(); + + // Unfortunately, we cannot unpublish a collection. When setting the state + // to 'draft', we're creating a forward revision. + $sparql = <<<SPARQL + WITH <http://joinup.eu/collection/published> + DELETE { <$uri> ?p ?o } + WHERE { <$uri> ?p ?o } + SPARQL; + \Drupal::getContainer()->get('rdf_sync.connection')->update($sparql); + $sapiId = 'entity:rdf_entity/' . $uri; + $solrHelper = new Helper(); + /** @var \Drupal\search_api_solr\SolrConnectorInterface $connector */ + $connector = $entityTypeManger->getStorage('search_api_server') + ->load('joinup')->getBackend()->getSolrConnector(); + $updateQuery = $connector + ->getUpdateQuery() + ->addDeleteQuery('ss_search_api_id:' . $solrHelper->escapePhrase($sapiId)) + ->addCommit(); + $connector->update($updateQuery); + // Update SAPI items. + \Drupal::database()->delete('search_api_item') + ->condition('index_id', ['published', 'unpublished'], 'IN') + ->condition('item_id', $sapiId) + ->execute(); + + \Drupal::getContainer()->get('entity.repository') + ->loadEntityByUuid('node', OssCatalogueCollectionInterface::LANDING_PAGE) + ->set('field_topic', 11195) + ->save(); +}