Maven dependency proxy - update mutation - handle the case when the project is not found
🔥 Problem
In The dependency proxy settings GraphQL API (#410725 - closed), we introduced a GraphQL API to manage the dependency proxy (for packages) settings.
Among the new endpoints, there is a mutation to update the settings object. That mutation works with project full paths as identifiers.
Given the following graphql mutation:
mutation {
updateDependencyProxyPackagesSettings(input: { projectPath: "<project full path that doesn't exist>", enabled: true, mavenExternalRegistryUrl: "http://test"}) {
dependencyProxyPackagesSetting {
enabled
mavenExternalRegistryUrl
mavenExternalRegistryUsername
}
errors
}
}
This will end up in
{
"errors": [
{
"message": "Internal server error"
}
]
}
json.exception.class
NoMethodError
json.exception.message
undefined method `dependency_proxy_packages_setting' for nil:NilClass
json.exception.backtrace
[ee/app/graphql/mutations/dependency_proxy/packages/settings/update.rb:79:in `find_object', lib/gitlab/graphql/authorize/authorize_resource.rb:53:in `authorized_find!', ee/app/graphql/mutations/dependency_proxy/packages/settings/update.rb:60:in `resolve', lib/gitlab/graphql/present/field_extension.rb:18:in `resolve', lib/gitlab/graphql/tracers/timer_tracer.rb:20:in `trace', lib/gitlab/graphql/tracers/logger_tracer.rb:14:in `trace', lib/gitlab/graphql/tracers/metrics_tracer.rb:13:in `trace', lib/gitlab/graphql/tracers/application_context_tracer.rb:23:in `trace', lib/gitlab/graphql/tracers/timer_tracer.rb:20:in `trace', lib/gitlab/graphql/tracers/logger_tracer.rb:14:in `trace', lib/gitlab/graphql/tracers/metrics_tracer.rb:13:in `trace', lib/gitlab/graphql/tracers/application_context_tracer.rb:20:in `block in trace', lib/gitlab/application_context.rb:124:in `block in use', lib/gitlab/application_context.rb:124:in `use', lib/gitlab/application_context.rb:62:in `with_context', lib/gitlab/graphql/tracers/application_context_tracer.rb:19:in `trace', lib/gitlab/graphql/tracers/timer_tracer.rb:20:in `trace', lib/gitlab/graphql/tracers/logger_tracer.rb:14:in `trace', lib/gitlab/graphql/tracers/metrics_tracer.rb:13:in `trace', lib/gitlab/graphql/tracers/application_context_tracer.rb:23:in `trace', app/graphql/gitlab_schema.rb:48:in `multiplex', app/controllers/graphql_controller.rb:212:in `execute_query', app/controllers/graphql_controller.rb:67:in `execute', ee/lib/gitlab/ip_address_state.rb:10:in `with', ee/app/controllers/ee/application_controller.rb:45:in `set_current_ip_address', app/controllers/application_controller.rb:520:in `set_current_admin', lib/gitlab/session.rb:11:in `with_session', app/controllers/application_controller.rb:511:in `set_session_storage', lib/gitlab/i18n.rb:107:in `with_locale', lib/gitlab/i18n.rb:113:in `with_user_locale', app/controllers/application_controller.rb:502:in `set_locale', app/controllers/application_controller.rb:495:in `set_current_context', ee/lib/omni_auth/strategies/group_saml.rb:41:in `other_phase', lib/gitlab/metrics/elasticsearch_rack_middleware.rb:16:in `call', lib/gitlab/middleware/memory_report.rb:13:in `call', lib/gitlab/middleware/speedscope.rb:13:in `call', lib/gitlab/database/load_balancing/rack_middleware.rb:23:in `call', lib/gitlab/middleware/rails_queue_duration.rb:33:in `call', lib/gitlab/etag_caching/middleware.rb:21:in `call', lib/gitlab/metrics/rack_middleware.rb:16:in `block in call', lib/gitlab/metrics/web_transaction.rb:46:in `run', lib/gitlab/metrics/rack_middleware.rb:16:in `call', lib/gitlab/jira/middleware.rb:19:in `call', lib/gitlab/middleware/go.rb:20:in `call', lib/gitlab/middleware/query_analyzer.rb:11:in `block in call', lib/gitlab/database/query_analyzer.rb:37:in `within', lib/gitlab/middleware/query_analyzer.rb:11:in `call', lib/gitlab/middleware/multipart.rb:173:in `call', lib/gitlab/middleware/read_only/controller.rb:50:in `call', lib/gitlab/middleware/read_only.rb:18:in `call', lib/gitlab/middleware/same_site_cookies.rb:27:in `call', lib/gitlab/middleware/path_traversal_check.rb:25:in `call', lib/gitlab/middleware/handle_malformed_strings.rb:21:in `call', lib/gitlab/middleware/basic_health_check.rb:25:in `call', lib/gitlab/middleware/handle_ip_spoof_attack_error.rb:25:in `call', lib/gitlab/middleware/request_context.rb:15:in `call', lib/gitlab/middleware/webhook_recursion_detection.rb:15:in `call', config/initializers/fix_local_cache_middleware.rb:11:in `call', lib/gitlab/middleware/compressed_json.rb:44:in `call', lib/gitlab/middleware/rack_multipart_tempfile_factory.rb:19:in `call', lib/gitlab/middleware/sidekiq_web_static.rb:20:in `call', lib/gitlab/metrics/requests_rack_middleware.rb:79:in `call', lib/gitlab/middleware/release_env.rb:13:in `call']
🚒 Solution
- Gracefully handle the case where the project is not found.
- Update the related specs.