From 652cee71950c9db17a93c77fe64309fd98e55afd Mon Sep 17 00:00:00 2001 From: Minnur Yunusov Date: Sun, 28 Jun 2020 22:45:07 +0500 Subject: [PATCH 01/18] New JSON route to pull credentials. --- apigee_edge.module | 8 ++- apigee_edge.routing.yml | 3 + js/apigee_edge.app_view.js | 13 +++++ .../DeveloperAppListBuilderForDeveloper.php | 18 ++++++ src/Routing/EdgeDynamicRouting.php | 55 +++++++++++++++++++ 5 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 src/Routing/EdgeDynamicRouting.php diff --git a/apigee_edge.module b/apigee_edge.module index f491f9196..abcbbb724 100644 --- a/apigee_edge.module +++ b/apigee_edge.module @@ -379,6 +379,7 @@ function apigee_edge_entity_view(array &$build, EntityInterface $entity, EntityV $build['credentials'][] = [ '#type' => 'app_credential', '#credential' => $credential, + '#app_display_name' => $entity->getDisplayName(), '#attributes' => [ 'class' => 'items--inline', ], @@ -1013,6 +1014,8 @@ function template_preprocess_app_credential_product_list(array &$variables) { * Properties used: * - #credential: A \Apigee\Edge\Api\Management\Entity\AppCredential object. * A developer app credential. + * - #app_display_name: string. + * App name. * - attributes: HTML attributes for the containing element. */ function template_preprocess_app_credential(array &$variables) { @@ -1055,7 +1058,8 @@ function template_preprocess_app_credential(array &$variables) { $variables['primary_wrapper'] = [ '#type' => 'container', '#attributes' => [ - 'class' => 'wrapper--primary', + 'class' => 'wrapper--primary app-details-wrapper', + 'data-app' => $variables['elements']['#app_display_name'], ], ]; @@ -1103,7 +1107,7 @@ function template_preprocess_app_credential(array &$variables) { 'class' => 'secret', 'data-secret-type' => $property, ], - '#value' => Xss::filter($value), + '#value' => '', ]; } elseif ($def['value_type'] === 'status') { diff --git a/apigee_edge.routing.yml b/apigee_edge.routing.yml index ad4c4a7e4..7efaeca82 100644 --- a/apigee_edge.routing.yml +++ b/apigee_edge.routing.yml @@ -190,3 +190,6 @@ apigee_edge.export_analytics.csv: requirements: _csrf_token: 'TRUE' _custom_access: '\Drupal\apigee_edge\Controller\ExportAnalyticsController::access' + +route_callbacks: + - '\Drupal\apigee_edge\Routing\EdgeDynamicRouting::routes' diff --git a/js/apigee_edge.app_view.js b/js/apigee_edge.app_view.js index 8bc954b26..8f8041c42 100644 --- a/js/apigee_edge.app_view.js +++ b/js/apigee_edge.app_view.js @@ -26,6 +26,7 @@ Drupal.behaviors.apigeeEdgeDetails = { attach: function (context, settings) { Drupal.apigeeEdgeDetails.editActions(context, settings); + alert(1111); } }; @@ -38,6 +39,17 @@ } $('.item-property', context).on('click', 'a.secret-show-hide', function (event) { + + var app_details_wrapper = $(this).closest('.app-details-wrapper'); +alert(app_details_wrapper.data('app')); + $.ajax({ + url: settings.baseUrl + '/admin/config/apigee-edge/app/' + app_details_wrapper.data('app') + '/credentials', + }) + .done(function( data ) { + if ( console && console.log ) { + console.log( "Sample of data:", data.slice( 0, 100 ) ); + } + }); secretToggle(event, $(this).parent().parent()); }); @@ -53,4 +65,5 @@ } } }; + })(jQuery, Drupal); diff --git a/src/Entity/ListBuilder/DeveloperAppListBuilderForDeveloper.php b/src/Entity/ListBuilder/DeveloperAppListBuilderForDeveloper.php index 383a08092..67ab753b0 100644 --- a/src/Entity/ListBuilder/DeveloperAppListBuilderForDeveloper.php +++ b/src/Entity/ListBuilder/DeveloperAppListBuilderForDeveloper.php @@ -39,6 +39,7 @@ use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\RequestStack; +use Symfony\Component\HttpFoundation\JsonResponse; /** * Lists developer apps of a developer on the UI. @@ -215,4 +216,21 @@ public function pageTitle(): TranslatableMarkup { return $title; } + /** + * Returns app credentials. + * + * @return \Symfony\Component\HttpFoundation\JsonResponse + * The app credentials. + */ + public function appCredentials($developer_app_by_name): JsonResponse { + $payload = []; + if ($credentials = array_shift($developer_app_by_name->getCredentials())) { + $payload = [ + 'consumerKey' => $credentials->getConsumerKey(), + 'consumerSecret' => $credentials->getConsumerSecret(), + ]; + } + return new JsonResponse($payload); + } + } diff --git a/src/Routing/EdgeDynamicRouting.php b/src/Routing/EdgeDynamicRouting.php new file mode 100644 index 000000000..6a6b1ce27 --- /dev/null +++ b/src/Routing/EdgeDynamicRouting.php @@ -0,0 +1,55 @@ + '\Drupal\apigee_edge\Entity\ListBuilder\DeveloperAppListBuilderForDeveloper::appCredentials', + '_title' => 'App credentials', + 'user' => \Drupal::currentUser()->id(), + ], + [ + '_permission' => 'view own developer_app', + ], + [ + 'parameters' => [ + 'developer_app_by_name' => [ + 'type' => 'developer_app_by_name', + 'converter' => 'paramconverter.developer_app_name', + ], + ], + ] + ); + $route_collection->add('apigee_edge.user.apps.credentials', $route); + return $route_collection; + } + +} From 809d5a48ba4034fc909f61bdad6e4674867aee07 Mon Sep 17 00:00:00 2001 From: Minnur Yunusov Date: Mon, 6 Jul 2020 13:50:21 +0500 Subject: [PATCH 02/18] Refine credentials endpoint. --- js/apigee_edge.app_view.js | 13 ------------- .../DeveloperAppListBuilderForDeveloper.php | 4 ++-- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/js/apigee_edge.app_view.js b/js/apigee_edge.app_view.js index 8f8041c42..8bc954b26 100644 --- a/js/apigee_edge.app_view.js +++ b/js/apigee_edge.app_view.js @@ -26,7 +26,6 @@ Drupal.behaviors.apigeeEdgeDetails = { attach: function (context, settings) { Drupal.apigeeEdgeDetails.editActions(context, settings); - alert(1111); } }; @@ -39,17 +38,6 @@ } $('.item-property', context).on('click', 'a.secret-show-hide', function (event) { - - var app_details_wrapper = $(this).closest('.app-details-wrapper'); -alert(app_details_wrapper.data('app')); - $.ajax({ - url: settings.baseUrl + '/admin/config/apigee-edge/app/' + app_details_wrapper.data('app') + '/credentials', - }) - .done(function( data ) { - if ( console && console.log ) { - console.log( "Sample of data:", data.slice( 0, 100 ) ); - } - }); secretToggle(event, $(this).parent().parent()); }); @@ -65,5 +53,4 @@ alert(app_details_wrapper.data('app')); } } }; - })(jQuery, Drupal); diff --git a/src/Entity/ListBuilder/DeveloperAppListBuilderForDeveloper.php b/src/Entity/ListBuilder/DeveloperAppListBuilderForDeveloper.php index 67ab753b0..6f88bf0fd 100644 --- a/src/Entity/ListBuilder/DeveloperAppListBuilderForDeveloper.php +++ b/src/Entity/ListBuilder/DeveloperAppListBuilderForDeveloper.php @@ -226,8 +226,8 @@ public function appCredentials($developer_app_by_name): JsonResponse { $payload = []; if ($credentials = array_shift($developer_app_by_name->getCredentials())) { $payload = [ - 'consumerKey' => $credentials->getConsumerKey(), - 'consumerSecret' => $credentials->getConsumerSecret(), + $credentials->getConsumerKey(), + $credentials->getConsumerSecret(), ]; } return new JsonResponse($payload); From 01509a5001f3dcf50fd6f7dc33180388aa4998ca Mon Sep 17 00:00:00 2001 From: Minnur Yunusov Date: Mon, 6 Jul 2020 16:02:02 +0500 Subject: [PATCH 03/18] [#416] Pull app credentials via Ajax call. --- apigee_edge.libraries.yml | 5 +++++ apigee_edge.module | 8 +++----- js/apigee_edge.app_view.js | 28 +++++++++++++++++++++++----- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/apigee_edge.libraries.yml b/apigee_edge.libraries.yml index 6ed1a5a3d..06e8e8c83 100644 --- a/apigee_edge.libraries.yml +++ b/apigee_edge.libraries.yml @@ -55,6 +55,11 @@ apigee_edge.app_view: css/apigee_edge.app_view.css: {} js: js/apigee_edge.app_view.js: {} + dependencies: + - core/jquery + - core/jquery.once + - core/drupal + - core/drupalSettings apiproduct_access_admin: version: 1.0 diff --git a/apigee_edge.module b/apigee_edge.module index abcbbb724..c3a479c66 100644 --- a/apigee_edge.module +++ b/apigee_edge.module @@ -358,11 +358,9 @@ function apigee_edge_field_formatter_info_alter(array &$info) { */ function apigee_edge_entity_view(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display, $view_mode) { if ($entity instanceof AppInterface) { - if ($build['#view_mode'] === 'full') { - // Add some required assets to an app's full entity view mode. - $build['#attached']['library'][] = 'apigee_edge/apigee_edge.components'; - $build['#attached']['library'][] = 'apigee_edge/apigee_edge.app_view'; - } + // Add some required assets to an app's full entity view mode. + $build['#attached']['library'][] = 'apigee_edge/apigee_edge.components'; + $build['#attached']['library'][] = 'apigee_edge/apigee_edge.app_view'; if ($display->getComponent('credentials')) { /** @var \Drupal\apigee_edge\Entity\AppInterface $entity */ diff --git a/js/apigee_edge.app_view.js b/js/apigee_edge.app_view.js index 8bc954b26..0bca3d153 100644 --- a/js/apigee_edge.app_view.js +++ b/js/apigee_edge.app_view.js @@ -19,7 +19,7 @@ * @file * Javascript functions related to the Apigee Edge Drupal Module. */ -(function ($, Drupal) { +(function ($, Drupal, drupalSettings) { 'use strict'; @@ -32,19 +32,27 @@ Drupal.apigeeEdgeDetails = { editActions: function (context, settings) { var secrets = $('.secret', context); + var appElWrapper = '.app-details-wrapper'; + var loader = drupalSettings.path.baseUrl + 'core/misc/throbber-active.gif'; for (var i = 0; i < secrets.length; i++) { var secret = secrets[i]; $(secret).addClass('secret-hidden').attr('data-value', $(secret).html()).html('••••••••
' + Drupal.t('Show') + '
').show(); } $('.item-property', context).on('click', 'a.secret-show-hide', function (event) { - secretToggle(event, $(this).parent().parent()); + var $wrapper = $(this).closest(appElWrapper); + var index = $wrapper.find('a.secret-show-hide').index(this); + var $el = $(this).parent().parent(); + secretToggle(event, $el, $wrapper, index); }); - function secretToggle(event, secret) { + function secretToggle(event, secret, wrapper, index) { event.preventDefault(); if ($(secret).hasClass('secret-hidden')) { - $(secret).html(secret.attr('data-value') + '
' + Drupal.t('Hide') + ''); + $(secret).html(''); + getSecretValueAjax(wrapper.data('app'), function(data) { + $(secret).html(data[index] + '
' + Drupal.t('Hide') + ''); + }); } else { $(secret).html('••••••••
' + Drupal.t('Show') + '
'); @@ -53,4 +61,14 @@ } } }; -})(jQuery, Drupal); + + /** + * Get credentials based on the app name. + */ + function getSecretValueAjax(app, callback) { + $.get( drupalSettings.path.baseUrl + 'admin/config/apigee-edge/app/' + app + '/credentials', function( data ) { + callback(data); + }); + }; + +})(jQuery, Drupal, drupalSettings); From 15c2ba1ef2276792d077bdc48b7d36729204eef4 Mon Sep 17 00:00:00 2001 From: Minnur Yunusov Date: Mon, 6 Jul 2020 19:05:39 +0500 Subject: [PATCH 04/18] Fix code sniffer issues. --- src/Routing/EdgeDynamicRouting.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Routing/EdgeDynamicRouting.php b/src/Routing/EdgeDynamicRouting.php index 6a6b1ce27..75a457b27 100644 --- a/src/Routing/EdgeDynamicRouting.php +++ b/src/Routing/EdgeDynamicRouting.php @@ -23,9 +23,12 @@ use Symfony\Component\Routing\Route; use Symfony\Component\Routing\RouteCollection; +/** + * Dynamically built routes. + */ class EdgeDynamicRouting { - /** + /** * Build routes dynamically. */ public function routes() { From 6c8cc6573ac0536f24b06a72761c0c8d9d975132 Mon Sep 17 00:00:00 2001 From: Minnur Yunusov Date: Mon, 6 Jul 2020 19:37:49 +0500 Subject: [PATCH 05/18] Fix code sniffer issues. --- src/Routing/EdgeDynamicRouting.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Routing/EdgeDynamicRouting.php b/src/Routing/EdgeDynamicRouting.php index 75a457b27..dce56df48 100644 --- a/src/Routing/EdgeDynamicRouting.php +++ b/src/Routing/EdgeDynamicRouting.php @@ -29,8 +29,8 @@ class EdgeDynamicRouting { /** - * Build routes dynamically. - */ + * Build routes dynamically. + */ public function routes() { $route_collection = new RouteCollection(); $route = new Route('/admin/config/apigee-edge/app/{developer_app_by_name}/credentials', From b756836294e42524e108a8bc90d79c11b71241cb Mon Sep 17 00:00:00 2001 From: Minnur Yunusov Date: Wed, 8 Jul 2020 12:30:02 +0500 Subject: [PATCH 06/18] [#416] New endpoint to get credentials via Ajax calls. --- apigee_edge.module | 22 ++++- apigee_edge.routing.yml | 9 +- js/apigee_edge.app_view.js | 48 ++++++--- src/Controller/DeveloperAppKeysController.php | 98 +++++++++++++++++++ .../DeveloperAppListBuilderForDeveloper.php | 18 ---- src/Routing/EdgeDynamicRouting.php | 58 ----------- 6 files changed, 157 insertions(+), 96 deletions(-) create mode 100644 src/Controller/DeveloperAppKeysController.php delete mode 100644 src/Routing/EdgeDynamicRouting.php diff --git a/apigee_edge.module b/apigee_edge.module index c3a479c66..87fa8352f 100644 --- a/apigee_edge.module +++ b/apigee_edge.module @@ -362,6 +362,15 @@ function apigee_edge_entity_view(array &$build, EntityInterface $entity, EntityV $build['#attached']['library'][] = 'apigee_edge/apigee_edge.components'; $build['#attached']['library'][] = 'apigee_edge/apigee_edge.app_view'; + if (\Drupal::moduleHandler()->moduleExists('apigee_edge_teams')) { + if ($team = \Drupal::routeMatch()->getParameter('team')) { + $team_app_name = $team->getName(); + } + } + if ($user = \Drupal::routeMatch()->getParameter('user')) { + $build['#attached']['drupalSettings']['currentUser'] = $user->id(); + } + if ($display->getComponent('credentials')) { /** @var \Drupal\apigee_edge\Entity\AppInterface $entity */ $defaults = [ @@ -377,7 +386,8 @@ function apigee_edge_entity_view(array &$build, EntityInterface $entity, EntityV $build['credentials'][] = [ '#type' => 'app_credential', '#credential' => $credential, - '#app_display_name' => $entity->getDisplayName(), + '#app_name' => $entity->getName(), + '#team_app_name' => isset($team_app_name) ? $team_app_name : '', '#attributes' => [ 'class' => 'items--inline', ], @@ -1012,8 +1022,10 @@ function template_preprocess_app_credential_product_list(array &$variables) { * Properties used: * - #credential: A \Apigee\Edge\Api\Management\Entity\AppCredential object. * A developer app credential. - * - #app_display_name: string. + * - #app_name: string. * App name. + * - #team_app_name: string. + * Team app name. * - attributes: HTML attributes for the containing element. */ function template_preprocess_app_credential(array &$variables) { @@ -1057,10 +1069,14 @@ function template_preprocess_app_credential(array &$variables) { '#type' => 'container', '#attributes' => [ 'class' => 'wrapper--primary app-details-wrapper', - 'data-app' => $variables['elements']['#app_display_name'], + 'data-app' => $variables['elements']['#app_name'], ], ]; + if (!empty($variables['elements']['#team_app_name'])) { + $variables['primary_wrapper']['#attributes']['data-team'] = $variables['elements']['#team_app_name']; + } + foreach ($properties_in_primary as $property => $def) { $variables['primary_wrapper'][$property] = [ '#type' => 'container', diff --git a/apigee_edge.routing.yml b/apigee_edge.routing.yml index 7efaeca82..77023420b 100644 --- a/apigee_edge.routing.yml +++ b/apigee_edge.routing.yml @@ -191,5 +191,10 @@ apigee_edge.export_analytics.csv: _csrf_token: 'TRUE' _custom_access: '\Drupal\apigee_edge\Controller\ExportAnalyticsController::access' -route_callbacks: - - '\Drupal\apigee_edge\Routing\EdgeDynamicRouting::routes' +apigee_edge.api_keys.developer_app: + path: '/api-keys/developer/{uid}/{app_name}' + defaults: + _controller: '\Drupal\apigee_edge\Controller\DeveloperAppKeysController::developerAppKeys' + _title: 'App Keys' + requirements: + _permission: 'view own developer_app' diff --git a/js/apigee_edge.app_view.js b/js/apigee_edge.app_view.js index 0bca3d153..01f4b5c6b 100644 --- a/js/apigee_edge.app_view.js +++ b/js/apigee_edge.app_view.js @@ -33,31 +33,45 @@ editActions: function (context, settings) { var secrets = $('.secret', context); var appElWrapper = '.app-details-wrapper'; + var showHideEl = 'a.secret-show-hide'; + var pClass = 'processing'; var loader = drupalSettings.path.baseUrl + 'core/misc/throbber-active.gif'; for (var i = 0; i < secrets.length; i++) { var secret = secrets[i]; - $(secret).addClass('secret-hidden').attr('data-value', $(secret).html()).html('••••••••
' + Drupal.t('Show') + '
').show(); + $(secret) + .addClass('secret-hidden') + .attr('data-value', $(secret).html()) + .html('••••••••
' + Drupal.t('Show') + '
') + .show(); } - $('.item-property', context).on('click', 'a.secret-show-hide', function (event) { + $('.item-property', context).on('click', showHideEl, function (event) { + event.preventDefault(); var $wrapper = $(this).closest(appElWrapper); - var index = $wrapper.find('a.secret-show-hide').index(this); - var $el = $(this).parent().parent(); - secretToggle(event, $el, $wrapper, index); + if (!$(this).hasClass(pClass)) { + $(showHideEl).addClass(pClass); + secretToggle( + $(this).parent().parent(), + $wrapper.data('team'), + $wrapper.data('app'), + $wrapper.closest('fieldset').parent().find('fieldset').index($(this).closest('fieldset')), + $wrapper.find(showHideEl).index(this) + ); + } }); - function secretToggle(event, secret, wrapper, index) { - event.preventDefault(); - if ($(secret).hasClass('secret-hidden')) { - $(secret).html(''); - getSecretValueAjax(wrapper.data('app'), function(data) { - $(secret).html(data[index] + '
' + Drupal.t('Hide') + ''); + function secretToggle(el, teamAppName, appName, wrapperIndex, keyIndex) { + if ($(el).hasClass('secret-hidden')) { + $(el).html(''); + callEndpoint(teamAppName, appName, function(data) { + $(el).html(data[wrapperIndex][keyIndex] + '
' + Drupal.t('Hide') + ''); + $(showHideEl).removeClass(pClass); }); } else { - $(secret).html('••••••••
' + Drupal.t('Show') + '
'); + $(el).html('••••••••
' + Drupal.t('Show') + '
'); } - $(secret).toggleClass('secret-hidden'); + $(el).toggleClass('secret-hidden'); } } }; @@ -65,8 +79,12 @@ /** * Get credentials based on the app name. */ - function getSecretValueAjax(app, callback) { - $.get( drupalSettings.path.baseUrl + 'admin/config/apigee-edge/app/' + app + '/credentials', function( data ) { + function callEndpoint(teamApp, app, callback) { + var endpoint = drupalSettings.path.baseUrl + 'api-keys/developer/' + drupalSettings.currentUser + '/' + app; + if (teamApp !== undefined) { + endpoint = drupalSettings.path.baseUrl + 'api-keys/team/' + teamApp + '/' + app; + } + $.get(endpoint, function(data) { callback(data); }); }; diff --git a/src/Controller/DeveloperAppKeysController.php b/src/Controller/DeveloperAppKeysController.php new file mode 100644 index 000000000..5e7700084 --- /dev/null +++ b/src/Controller/DeveloperAppKeysController.php @@ -0,0 +1,98 @@ +entityTypeManager = $entity_type_manager; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container) { + return new static( + $container->get('entity_type.manager') + ); + } + + /** + * Returns app credentials. + * + * @return \Symfony\Component\HttpFoundation\JsonResponse + * The app credentials. + */ + public function developerAppKeys($uid, $app_name): JsonResponse { + $payload = []; + if ($user = $this->entityTypeManager->getStorage('user')->load($uid)) { + if ($developer_id = $user->get('apigee_edge_developer_id')->value) { + $app_storage = $this->entityTypeManager->getStorage('developer_app'); + $app_ids = $app_storage->getQuery() + ->condition('developerId', $developer_id) + ->condition('name', $app_name) + ->execute(); + if (!empty($app_ids)) { + $app_id = reset($app_ids); + $payload = $this->getAppKeys($app_storage->load($app_id)); + } + } + } + return new JsonResponse($payload); + } + + /** + * Get app credentials by app object. + */ + protected function getAppKeys($app) { + $keys = []; + if ($credentials = $app->getCredentials()) { + foreach ($credentials as $item) { + $keys[] = [ + $item->getConsumerKey(), + $item->getConsumerSecret(), + ]; + } + } + return $keys; + } + +} diff --git a/src/Entity/ListBuilder/DeveloperAppListBuilderForDeveloper.php b/src/Entity/ListBuilder/DeveloperAppListBuilderForDeveloper.php index 6f88bf0fd..383a08092 100644 --- a/src/Entity/ListBuilder/DeveloperAppListBuilderForDeveloper.php +++ b/src/Entity/ListBuilder/DeveloperAppListBuilderForDeveloper.php @@ -39,7 +39,6 @@ use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\RequestStack; -use Symfony\Component\HttpFoundation\JsonResponse; /** * Lists developer apps of a developer on the UI. @@ -216,21 +215,4 @@ public function pageTitle(): TranslatableMarkup { return $title; } - /** - * Returns app credentials. - * - * @return \Symfony\Component\HttpFoundation\JsonResponse - * The app credentials. - */ - public function appCredentials($developer_app_by_name): JsonResponse { - $payload = []; - if ($credentials = array_shift($developer_app_by_name->getCredentials())) { - $payload = [ - $credentials->getConsumerKey(), - $credentials->getConsumerSecret(), - ]; - } - return new JsonResponse($payload); - } - } diff --git a/src/Routing/EdgeDynamicRouting.php b/src/Routing/EdgeDynamicRouting.php deleted file mode 100644 index dce56df48..000000000 --- a/src/Routing/EdgeDynamicRouting.php +++ /dev/null @@ -1,58 +0,0 @@ - '\Drupal\apigee_edge\Entity\ListBuilder\DeveloperAppListBuilderForDeveloper::appCredentials', - '_title' => 'App credentials', - 'user' => \Drupal::currentUser()->id(), - ], - [ - '_permission' => 'view own developer_app', - ], - [ - 'parameters' => [ - 'developer_app_by_name' => [ - 'type' => 'developer_app_by_name', - 'converter' => 'paramconverter.developer_app_name', - ], - ], - ] - ); - $route_collection->add('apigee_edge.user.apps.credentials', $route); - return $route_collection; - } - -} From b3b3949492addd2d9cc2e46601f0c70068144e4d Mon Sep 17 00:00:00 2001 From: Minnur Yunusov Date: Wed, 8 Jul 2020 12:32:15 +0500 Subject: [PATCH 07/18] [#416] New endpoint to get credentials via Ajax calls (Support for teams). --- .../apigee_edge_teams.routing.yml | 8 +++ .../src/Controller/TeamAppKeysController.php | 52 +++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 modules/apigee_edge_teams/src/Controller/TeamAppKeysController.php diff --git a/modules/apigee_edge_teams/apigee_edge_teams.routing.yml b/modules/apigee_edge_teams/apigee_edge_teams.routing.yml index 48cdb13df..3dce19bf4 100644 --- a/modules/apigee_edge_teams/apigee_edge_teams.routing.yml +++ b/modules/apigee_edge_teams/apigee_edge_teams.routing.yml @@ -63,3 +63,11 @@ apigee_edge_teams.settings.team_app.cache: _title: 'Caching' requirements: _permission: 'administer team' + +apigee_edge_teams.api_keys.team_app: + path: '/api-keys/team/{team}/{app_name}' + defaults: + _controller: '\Drupal\apigee_edge_teams\Controller\TeamAppKeysController::teamAppKeys' + _title: 'Team App Keys' + requirements: + _permission: 'team_app_view' diff --git a/modules/apigee_edge_teams/src/Controller/TeamAppKeysController.php b/modules/apigee_edge_teams/src/Controller/TeamAppKeysController.php new file mode 100644 index 000000000..6bbf0886e --- /dev/null +++ b/modules/apigee_edge_teams/src/Controller/TeamAppKeysController.php @@ -0,0 +1,52 @@ +entityTypeManager->getStorage('team')->load($team)) { + $app_storage = $this->entityTypeManager->getStorage('team_app'); + $app_ids = $app_storage->getQuery() + ->condition('companyName', $team->id()) + ->condition('name', $app_name) + ->execute(); + if (!empty($app_ids)) { + $app_id = reset($app_ids); + $payload = $this->getAppKeys($app_storage->load($app_id)); + } + } + return new JsonResponse($payload); + } + +} From 35dee17638f0a5860cb1550973933f010b3f8019 Mon Sep 17 00:00:00 2001 From: Minnur Yunusov Date: Wed, 8 Jul 2020 12:55:31 +0500 Subject: [PATCH 08/18] Change loader variable. --- js/apigee_edge.app_view.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/apigee_edge.app_view.js b/js/apigee_edge.app_view.js index 01f4b5c6b..5ab4d4746 100644 --- a/js/apigee_edge.app_view.js +++ b/js/apigee_edge.app_view.js @@ -35,7 +35,7 @@ var appElWrapper = '.app-details-wrapper'; var showHideEl = 'a.secret-show-hide'; var pClass = 'processing'; - var loader = drupalSettings.path.baseUrl + 'core/misc/throbber-active.gif'; + var loader = ''; for (var i = 0; i < secrets.length; i++) { var secret = secrets[i]; $(secret) @@ -62,7 +62,7 @@ function secretToggle(el, teamAppName, appName, wrapperIndex, keyIndex) { if ($(el).hasClass('secret-hidden')) { - $(el).html(''); + $(el).html(loader); callEndpoint(teamAppName, appName, function(data) { $(el).html(data[wrapperIndex][keyIndex] + '
' + Drupal.t('Hide') + ''); $(showHideEl).removeClass(pClass); From b4cd0f2099578240972d594490f9c43e0e22bf89 Mon Sep 17 00:00:00 2001 From: Minnur Yunusov Date: Tue, 14 Jul 2020 18:31:50 +0500 Subject: [PATCH 09/18] [#416] Refine developer app api key and team app api key routes. --- apigee_edge.routing.yml | 8 ------ js/apigee_edge.app_view.js | 4 +-- .../apigee_edge_teams.routing.yml | 8 ------ .../src/Controller/TeamAppKeysController.php | 8 +++--- .../apigee_edge_teams/src/Entity/TeamApp.php | 1 + .../src/Entity/TeamAppRouteProvider.php | 25 ++++++++++++++++++ src/Controller/DeveloperAppKeysController.php | 8 +++--- src/Entity/DeveloperApp.php | 1 + src/Entity/DeveloperAppRouteProvider.php | 26 +++++++++++++++++++ 9 files changed, 63 insertions(+), 26 deletions(-) diff --git a/apigee_edge.routing.yml b/apigee_edge.routing.yml index 77023420b..ad4c4a7e4 100644 --- a/apigee_edge.routing.yml +++ b/apigee_edge.routing.yml @@ -190,11 +190,3 @@ apigee_edge.export_analytics.csv: requirements: _csrf_token: 'TRUE' _custom_access: '\Drupal\apigee_edge\Controller\ExportAnalyticsController::access' - -apigee_edge.api_keys.developer_app: - path: '/api-keys/developer/{uid}/{app_name}' - defaults: - _controller: '\Drupal\apigee_edge\Controller\DeveloperAppKeysController::developerAppKeys' - _title: 'App Keys' - requirements: - _permission: 'view own developer_app' diff --git a/js/apigee_edge.app_view.js b/js/apigee_edge.app_view.js index 5ab4d4746..d2f5889e0 100644 --- a/js/apigee_edge.app_view.js +++ b/js/apigee_edge.app_view.js @@ -80,9 +80,9 @@ * Get credentials based on the app name. */ function callEndpoint(teamApp, app, callback) { - var endpoint = drupalSettings.path.baseUrl + 'api-keys/developer/' + drupalSettings.currentUser + '/' + app; + var endpoint = drupalSettings.path.baseUrl + 'user/' + drupalSettings.currentUser + '/apps/' + app + '/api-keys'; if (teamApp !== undefined) { - endpoint = drupalSettings.path.baseUrl + 'api-keys/team/' + teamApp + '/' + app; + endpoint = drupalSettings.path.baseUrl + 'teams/' + teamApp + '/apps/' + app + '/api-keys'; } $.get(endpoint, function(data) { callback(data); diff --git a/modules/apigee_edge_teams/apigee_edge_teams.routing.yml b/modules/apigee_edge_teams/apigee_edge_teams.routing.yml index 3dce19bf4..48cdb13df 100644 --- a/modules/apigee_edge_teams/apigee_edge_teams.routing.yml +++ b/modules/apigee_edge_teams/apigee_edge_teams.routing.yml @@ -63,11 +63,3 @@ apigee_edge_teams.settings.team_app.cache: _title: 'Caching' requirements: _permission: 'administer team' - -apigee_edge_teams.api_keys.team_app: - path: '/api-keys/team/{team}/{app_name}' - defaults: - _controller: '\Drupal\apigee_edge_teams\Controller\TeamAppKeysController::teamAppKeys' - _title: 'Team App Keys' - requirements: - _permission: 'team_app_view' diff --git a/modules/apigee_edge_teams/src/Controller/TeamAppKeysController.php b/modules/apigee_edge_teams/src/Controller/TeamAppKeysController.php index 6bbf0886e..2fa31d8db 100644 --- a/modules/apigee_edge_teams/src/Controller/TeamAppKeysController.php +++ b/modules/apigee_edge_teams/src/Controller/TeamAppKeysController.php @@ -1,7 +1,7 @@ entityTypeManager->getStorage('team')->load($team)) { + if ($team) { $app_storage = $this->entityTypeManager->getStorage('team_app'); $app_ids = $app_storage->getQuery() ->condition('companyName', $team->id()) - ->condition('name', $app_name) + ->condition('name', $app->getName()) ->execute(); if (!empty($app_ids)) { $app_id = reset($app_ids); diff --git a/modules/apigee_edge_teams/src/Entity/TeamApp.php b/modules/apigee_edge_teams/src/Entity/TeamApp.php index 983227960..84b06ff32 100644 --- a/modules/apigee_edge_teams/src/Entity/TeamApp.php +++ b/modules/apigee_edge_teams/src/Entity/TeamApp.php @@ -66,6 +66,7 @@ * "edit-form" = "/teams/{team}/apps/{app}/edit", * "delete-form" = "/teams/{team}/apps/{app}/delete", * "analytics" = "/teams/{team}/apps/{app}/analytics", + * "api-keys" = "/teams/{team}/apps/{app}/api-keys", * }, * entity_keys = { * "id" = "appId", diff --git a/modules/apigee_edge_teams/src/Entity/TeamAppRouteProvider.php b/modules/apigee_edge_teams/src/Entity/TeamAppRouteProvider.php index c76150d65..c40e28fe1 100644 --- a/modules/apigee_edge_teams/src/Entity/TeamAppRouteProvider.php +++ b/modules/apigee_edge_teams/src/Entity/TeamAppRouteProvider.php @@ -23,6 +23,7 @@ use Drupal\apigee_edge\Entity\AppRouteProvider; use Drupal\apigee_edge\Entity\AppTitleProvider; use Drupal\apigee_edge_teams\Entity\ListBuilder\TeamAppListByTeam; +use Drupal\apigee_edge_teams\Controller\TeamAppKeysController; use Drupal\Core\Entity\EntityTypeInterface; use Symfony\Component\Routing\Route; @@ -53,6 +54,10 @@ public function getRoutes(EntityTypeInterface $entity_type) { $collection->add("entity.{$entity_type_id}.collection_by_team", $collection_by_team); } + if ($api_keys = $this->getTeamApiKeysRoute($entity_type)) { + $collection->add("entity.{$entity_type_id}.api_keys", $api_keys); + } + return $collection; } @@ -118,6 +123,26 @@ protected function getCollectionRouteByTeam(EntityTypeInterface $entity_type) { } } + /** + * Gets APpi Keys for team app. + * + * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type + * The entity type. + * + * @return \Symfony\Component\Routing\Route|null + * The generated route, if available. + */ + protected function getTeamApiKeysRoute(EntityTypeInterface $entity_type) { + if ($entity_type->hasLinkTemplate('api-keys')) { + $route = new Route($entity_type->getLinkTemplate('api-keys')); + $route->setDefault('_controller', TeamAppKeysController::class . '::teamAppKeys'); + $route->setDefault('_title_callback', AppTitleProvider::class . '::title'); + $this->ensureTeamParameter($route); + $route->setRequirement('_apigee_edge_teams_team_app_list_by_team_access', 'TRUE'); + return $route; + } + } + /** * Alters routers with {app} and not {team_app}. * diff --git a/src/Controller/DeveloperAppKeysController.php b/src/Controller/DeveloperAppKeysController.php index 5e7700084..01e337d51 100644 --- a/src/Controller/DeveloperAppKeysController.php +++ b/src/Controller/DeveloperAppKeysController.php @@ -1,7 +1,7 @@ entityTypeManager->getStorage('user')->load($uid)) { + if ($user) { if ($developer_id = $user->get('apigee_edge_developer_id')->value) { $app_storage = $this->entityTypeManager->getStorage('developer_app'); $app_ids = $app_storage->getQuery() ->condition('developerId', $developer_id) - ->condition('name', $app_name) + ->condition('name', $app->getName()) ->execute(); if (!empty($app_ids)) { $app_id = reset($app_ids); diff --git a/src/Entity/DeveloperApp.php b/src/Entity/DeveloperApp.php index 749a48315..fd692f21e 100644 --- a/src/Entity/DeveloperApp.php +++ b/src/Entity/DeveloperApp.php @@ -75,6 +75,7 @@ * "edit-form-for-developer" = "/user/{user}/apps/{app}/edit", * "delete-form-for-developer" = "/user/{user}/apps/{app}/delete", * "analytics-for-developer" = "/user/{user}/apps/{app}/analytics", + * "api-keys" = "/user/{user}/apps/{app}/api-keys", * }, * entity_keys = { * "id" = "appId", diff --git a/src/Entity/DeveloperAppRouteProvider.php b/src/Entity/DeveloperAppRouteProvider.php index ee0512f45..4bc3a51fc 100644 --- a/src/Entity/DeveloperAppRouteProvider.php +++ b/src/Entity/DeveloperAppRouteProvider.php @@ -22,6 +22,7 @@ use Drupal\apigee_edge\Access\AppsPageAccessCheck; use Drupal\apigee_edge\Controller\DeveloperAppViewControllerForDeveloper; +use Drupal\apigee_edge\Controller\DeveloperAppKeysController; use Drupal\apigee_edge\Entity\ListBuilder\DeveloperAppListBuilderForDeveloper; use Drupal\apigee_edge\Form\DeveloperAppAnalyticsFormForDeveloper; use Drupal\Core\Entity\EntityTypeInterface; @@ -63,6 +64,10 @@ public function getRoutes(EntityTypeInterface $entity_type) { $collection->add("entity.{$entity_type_id}.analytics_for_developer", $analytics_for_developer); } + if ($api_keys = $this->getApiKeyRouteDeveloperApp($entity_type)) { + $collection->add("entity.{$entity_type_id}.api_keys", $api_keys); + } + return $collection; } @@ -240,4 +245,25 @@ private function ensureUserParameter(Route $route) { } } + /** + * Gets the api key route for a developer app. + * + * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type + * The entity type. + * + * @return \Symfony\Component\Routing\Route|null + * The generated route, if available. + */ + protected function getApiKeyRouteDeveloperApp(EntityTypeInterface $entity_type) { + if ($entity_type->hasLinkTemplate('api-keys')) { + $route = new Route($entity_type->getLinkTemplate('api-keys')); + $route->setDefault('_controller', DeveloperAppKeysController::class . '::developerAppKeys'); + $route->setDefault('_title_callback', AppTitleProvider::class . '::title'); + $route->setDefault('entity_type_id', $entity_type->id()); + $this->ensureUserParameter($route); + $route->setRequirement('_app_access_check_by_app_name', 'view'); + return $route; + } + } + } From 5cffa7140472358b580d91368bfcd1091da05bed Mon Sep 17 00:00:00 2001 From: Minnur Yunusov Date: Wed, 15 Jul 2020 11:05:55 +0500 Subject: [PATCH 10/18] Fix circleCI update_dependencies step. --- .circleci/RoboFile.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.circleci/RoboFile.php b/.circleci/RoboFile.php index fbacafae5..bf3cc29eb 100644 --- a/.circleci/RoboFile.php +++ b/.circleci/RoboFile.php @@ -172,10 +172,10 @@ public function updateDependencies() // on it fails for the first time. $this->taskFilesystemStack()->remove('composer.lock')->run(); - $this->taskDeleteDir('vendor/behat/mink')->run(); + $this->taskDeleteDir('vendor/')->run(); // Composer often runs out of memory when installing drupal. - $this->taskComposerUpdate('php -d memory_limit=-1 /usr/local/bin/composer') + $this->taskComposerInstall('php -d memory_limit=-1 /usr/local/bin/composer') ->optimizeAutoloader() ->run(); @@ -421,6 +421,10 @@ public function configureModuleDependencies() // If you require core, you must not replace it. unset($config->replace); + // Unset scripts that delete vendor test directories. + unset($config->scripts->{"post-package-install"}); + unset($config->scripts->{"post-package-update"}); + // You can't merge from a package that is required. foreach ($config->extra->{"merge-plugin"}->include as $index => $merge_entry) { if ($merge_entry === 'core/composer.json') { @@ -435,4 +439,4 @@ public function configureModuleDependencies() file_put_contents('composer.json', json_encode($config, JSON_PRETTY_PRINT)); } -} +} \ No newline at end of file From 6115476bb2f6d8c7e223bf06b182c330b3d43bb3 Mon Sep 17 00:00:00 2001 From: Minnur Yunusov Date: Thu, 23 Jul 2020 23:33:24 +0500 Subject: [PATCH 11/18] Troubleshoot tests. --- tests/src/Functional/DeveloperAppPermissionTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/src/Functional/DeveloperAppPermissionTest.php b/tests/src/Functional/DeveloperAppPermissionTest.php index 04129fc3f..09bdcb5a4 100644 --- a/tests/src/Functional/DeveloperAppPermissionTest.php +++ b/tests/src/Functional/DeveloperAppPermissionTest.php @@ -48,6 +48,7 @@ class DeveloperAppPermissionTest extends ApigeeEdgeFunctionalTestBase { 'update any developer_app' => ['edit-form', 'edit-form-for-developer'], 'update own developer_app' => ['edit-form', 'edit-form-for-developer'], 'view any developer_app' => ['canonical', 'canonical-by-developer'], + 'view any developer_app' => ['api-keys', 'api-keys'], 'view own developer_app' => [ 'canonical', 'canonical-by-developer', From 30bbf439b6c62afec9559c9d9864bb0679ffcc9f Mon Sep 17 00:00:00 2001 From: Minnur Yunusov Date: Thu, 23 Jul 2020 23:42:06 +0500 Subject: [PATCH 12/18] Troubleshoot tests. --- tests/src/Functional/DeveloperAppPermissionTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/src/Functional/DeveloperAppPermissionTest.php b/tests/src/Functional/DeveloperAppPermissionTest.php index 09bdcb5a4..63fee96a9 100644 --- a/tests/src/Functional/DeveloperAppPermissionTest.php +++ b/tests/src/Functional/DeveloperAppPermissionTest.php @@ -53,6 +53,7 @@ class DeveloperAppPermissionTest extends ApigeeEdgeFunctionalTestBase { 'canonical', 'canonical-by-developer', 'collection-by-developer', + 'api-keys' ], 'analytics any developer_app' => ['analytics', 'analytics-for-developer'], 'analytics own developer_app' => ['analytics', 'analytics-for-developer'], From ee382f22336daacff985a12e50ceb95a94d4104c Mon Sep 17 00:00:00 2001 From: Minnur Yunusov Date: Fri, 24 Jul 2020 10:13:47 +0500 Subject: [PATCH 13/18] Troubleshoot tests. --- tests/src/Functional/DeveloperAppPermissionTest.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/src/Functional/DeveloperAppPermissionTest.php b/tests/src/Functional/DeveloperAppPermissionTest.php index 63fee96a9..e96b099df 100644 --- a/tests/src/Functional/DeveloperAppPermissionTest.php +++ b/tests/src/Functional/DeveloperAppPermissionTest.php @@ -47,8 +47,7 @@ class DeveloperAppPermissionTest extends ApigeeEdgeFunctionalTestBase { 'delete own developer_app' => ['delete-form', 'delete-form-for-developer'], 'update any developer_app' => ['edit-form', 'edit-form-for-developer'], 'update own developer_app' => ['edit-form', 'edit-form-for-developer'], - 'view any developer_app' => ['canonical', 'canonical-by-developer'], - 'view any developer_app' => ['api-keys', 'api-keys'], + 'view any developer_app' => ['canonical', 'canonical-by-developer', 'api-keys'], 'view own developer_app' => [ 'canonical', 'canonical-by-developer', From 5689a05a2696247c5637baec70a5400b9adba8a4 Mon Sep 17 00:00:00 2001 From: Minnur Yunusov Date: Fri, 24 Jul 2020 12:49:16 +0500 Subject: [PATCH 14/18] Fix code sniffer issue. --- tests/src/Functional/DeveloperAppPermissionTest.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/src/Functional/DeveloperAppPermissionTest.php b/tests/src/Functional/DeveloperAppPermissionTest.php index e96b099df..89b702c20 100644 --- a/tests/src/Functional/DeveloperAppPermissionTest.php +++ b/tests/src/Functional/DeveloperAppPermissionTest.php @@ -47,7 +47,11 @@ class DeveloperAppPermissionTest extends ApigeeEdgeFunctionalTestBase { 'delete own developer_app' => ['delete-form', 'delete-form-for-developer'], 'update any developer_app' => ['edit-form', 'edit-form-for-developer'], 'update own developer_app' => ['edit-form', 'edit-form-for-developer'], - 'view any developer_app' => ['canonical', 'canonical-by-developer', 'api-keys'], + 'view any developer_app' => [ + 'canonical', + 'canonical-by-developer', + 'api-keys' + ], 'view own developer_app' => [ 'canonical', 'canonical-by-developer', From 3a132cc716151fec83eb4b8de500c8f3d75682ab Mon Sep 17 00:00:00 2001 From: Minnur Yunusov Date: Fri, 24 Jul 2020 14:26:05 +0500 Subject: [PATCH 15/18] Troubleshoot tests. --- modules/apigee_edge_teams/tests/src/Functional/AccessTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/apigee_edge_teams/tests/src/Functional/AccessTest.php b/modules/apigee_edge_teams/tests/src/Functional/AccessTest.php index 640bd153c..54da76f54 100644 --- a/modules/apigee_edge_teams/tests/src/Functional/AccessTest.php +++ b/modules/apigee_edge_teams/tests/src/Functional/AccessTest.php @@ -145,7 +145,7 @@ class AccessTest extends ApigeeEdgeTeamsFunctionalTestBase { 'member.edit', 'member.remove', ], - 'team_app_view' => ['canonical', 'collection_by_team'], + 'team_app_view' => ['canonical', 'collection_by_team', 'api-keys'], 'team_app_create' => ['add_form_for_team'], 'team_app_update' => ['edit_form'], 'team_app_delete' => ['delete_form'], From 57c02b3f13eea070658bf154dc75acda1c2407df Mon Sep 17 00:00:00 2001 From: Minnur Yunusov Date: Mon, 27 Jul 2020 14:55:52 +0500 Subject: [PATCH 16/18] Troubleshoot tests. --- modules/apigee_edge_teams/tests/src/Functional/AccessTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/apigee_edge_teams/tests/src/Functional/AccessTest.php b/modules/apigee_edge_teams/tests/src/Functional/AccessTest.php index 54da76f54..6152e263f 100644 --- a/modules/apigee_edge_teams/tests/src/Functional/AccessTest.php +++ b/modules/apigee_edge_teams/tests/src/Functional/AccessTest.php @@ -145,7 +145,7 @@ class AccessTest extends ApigeeEdgeTeamsFunctionalTestBase { 'member.edit', 'member.remove', ], - 'team_app_view' => ['canonical', 'collection_by_team', 'api-keys'], + 'team_app_view' => ['canonical', 'collection_by_team', 'api_keys'], 'team_app_create' => ['add_form_for_team'], 'team_app_update' => ['edit_form'], 'team_app_delete' => ['delete_form'], From b8a0a12395a60187937ba38636e983b698e5a620 Mon Sep 17 00:00:00 2001 From: Arlina Espinoza Date: Fri, 31 Jul 2020 10:16:19 -0700 Subject: [PATCH 17/18] [#416] Fix tests. --- .../CacheTest.php | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) rename tests/src/{Functional => FunctionalJavascript}/CacheTest.php (93%) diff --git a/tests/src/Functional/CacheTest.php b/tests/src/FunctionalJavascript/CacheTest.php similarity index 93% rename from tests/src/Functional/CacheTest.php rename to tests/src/FunctionalJavascript/CacheTest.php index 660c5c0ff..540af5cf1 100644 --- a/tests/src/Functional/CacheTest.php +++ b/tests/src/FunctionalJavascript/CacheTest.php @@ -17,7 +17,7 @@ * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -namespace Drupal\Tests\apigee_edge\Functional; +namespace Drupal\Tests\apigee_edge\FunctionalJavascript; use Apigee\Edge\Api\Management\Controller\DeveloperAppController; use Apigee\Edge\Api\Management\Entity\App; @@ -32,7 +32,7 @@ * @group apigee_edge_developer * @group apigee_edge_developer_app */ -class CacheTest extends ApigeeEdgeFunctionalTestBase { +class CacheTest extends ApigeeEdgeFunctionalJavascriptTestBase { /** * The Drupal user that belongs to the developer app's developer. @@ -139,14 +139,23 @@ protected function credentialsTest() { $credentials = $loadedApp->getCredentials(); // But they still available in the Drupal entity. $this->assertNotEmpty($credentials, 'The credentials property is not empty.'); - // And visible on the UI. + + // They should not be visible on the UI. /** @var \Apigee\Edge\Api\Management\Entity\AppCredential[] $credentials */ $this->drupalGet(Url::fromRoute('entity.developer_app.canonical_by_developer', [ 'user' => $this->account->id(), 'app' => $this->developerApp->getName(), ])); - $this->assertSession()->pageTextContains($credentials[0]->getConsumerKey()); - $this->assertSession()->pageTextContains($credentials[0]->getConsumerSecret()); + $this->assertSession()->pageTextNotContains($credentials[0]->getConsumerKey()); + $this->assertSession()->pageTextNotContains($credentials[0]->getConsumerSecret()); + + // Until clicking the "show" buttons. + $this->clickLink('Show'); + $this->assertSession()->assertWaitOnAjaxRequest(30000); + $this->clickLink('Show'); + $this->assertSession()->assertWaitOnAjaxRequest(30000); + $this->assertSession()->pageTextContainsOnce($credentials[0]->getConsumerKey()); + $this->assertSession()->pageTextContainsOnce($credentials[0]->getConsumerSecret()); } /** From ce8ba33a1ba2850649a8f50e4043ee23258210f6 Mon Sep 17 00:00:00 2001 From: Arlina Espinoza Date: Fri, 31 Jul 2020 11:02:56 -0700 Subject: [PATCH 18/18] [#416] Fix permission. --- modules/apigee_edge_teams/src/Entity/TeamAppRouteProvider.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/apigee_edge_teams/src/Entity/TeamAppRouteProvider.php b/modules/apigee_edge_teams/src/Entity/TeamAppRouteProvider.php index c40e28fe1..aaf119674 100644 --- a/modules/apigee_edge_teams/src/Entity/TeamAppRouteProvider.php +++ b/modules/apigee_edge_teams/src/Entity/TeamAppRouteProvider.php @@ -138,7 +138,7 @@ protected function getTeamApiKeysRoute(EntityTypeInterface $entity_type) { $route->setDefault('_controller', TeamAppKeysController::class . '::teamAppKeys'); $route->setDefault('_title_callback', AppTitleProvider::class . '::title'); $this->ensureTeamParameter($route); - $route->setRequirement('_apigee_edge_teams_team_app_list_by_team_access', 'TRUE'); + $route->setRequirement('_app_access_check_by_app_name', 'view'); return $route; } }