diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-03-18 23:02:30 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-03-18 23:02:30 +0300 |
commit | 41fe97390ceddf945f3d967b8fdb3de4c66b7dea (patch) | |
tree | 9c8d89a8624828992f06d892cd2f43818ff5dcc8 /app/graphql/resolvers | |
parent | 0804d2dc31052fb45a1efecedc8e06ce9bc32862 (diff) |
Add latest changes from gitlab-org/gitlab@14-9-stable-eev14.9.0-rc42
Diffstat (limited to 'app/graphql/resolvers')
11 files changed, 121 insertions, 16 deletions
diff --git a/app/graphql/resolvers/blobs_resolver.rb b/app/graphql/resolvers/blobs_resolver.rb index d0eb2deaf48..0704a845bb0 100644 --- a/app/graphql/resolvers/blobs_resolver.rb +++ b/app/graphql/resolvers/blobs_resolver.rb @@ -30,8 +30,17 @@ module Resolvers return [] if repository.empty? ref ||= repository.root_ref + validate_ref(ref) repository.blobs_at(paths.map { |path| [ref, path] }) end + + private + + def validate_ref(ref) + unless Gitlab::GitRefValidator.validate(ref) + raise Gitlab::Graphql::Errors::ArgumentError, 'Ref is not valid' + end + end end end diff --git a/app/graphql/resolvers/ci/config_resolver.rb b/app/graphql/resolvers/ci/config_resolver.rb index 387185b5171..f9d60650443 100644 --- a/app/graphql/resolvers/ci/config_resolver.rb +++ b/app/graphql/resolvers/ci/config_resolver.rb @@ -38,6 +38,8 @@ module Resolvers .validate(content, dry_run: dry_run) response(result).merge(merged_yaml: result.merged_yaml) + rescue GRPC::InvalidArgument => error + Gitlab::ErrorTracking.track_and_raise_exception(error, sha: sha) end private diff --git a/app/graphql/resolvers/concerns/group_issuable_resolver.rb b/app/graphql/resolvers/concerns/group_issuable_resolver.rb index 542ff5374ff..92d22409ff2 100644 --- a/app/graphql/resolvers/concerns/group_issuable_resolver.rb +++ b/app/graphql/resolvers/concerns/group_issuable_resolver.rb @@ -3,12 +3,21 @@ module GroupIssuableResolver extend ActiveSupport::Concern - class_methods do - def include_subgroups(name_of_things) - argument :include_subgroups, GraphQL::Types::Boolean, - required: false, - default_value: false, - description: "Include #{name_of_things} belonging to subgroups" - end + included do + argument :include_subgroups, GraphQL::Types::Boolean, + required: false, + default_value: false, + description: "Include #{issuable_collection_name} belonging to subgroups" + + argument :include_archived, GraphQL::Types::Boolean, + required: false, + default_value: false, + description: "Return #{issuable_collection_name} from archived projects" + end + + def resolve(**args) + args[:non_archived] = !args.delete(:include_archived) + + super end end diff --git a/app/graphql/resolvers/concerns/resolves_merge_requests.rb b/app/graphql/resolvers/concerns/resolves_merge_requests.rb index 75f1ee478a8..a72b9a09118 100644 --- a/app/graphql/resolvers/concerns/resolves_merge_requests.rb +++ b/app/graphql/resolvers/concerns/resolves_merge_requests.rb @@ -51,7 +51,8 @@ module ResolvesMergeRequests milestone: [:milestone], security_auto_fix: [:author], head_pipeline: [:merge_request_diff, { head_pipeline: [:merge_request] }], - timelogs: [:timelogs] + timelogs: [:timelogs], + committers: [merge_request_diff: [:merge_request_diff_commits]] } end end diff --git a/app/graphql/resolvers/concerns/resolves_pipelines.rb b/app/graphql/resolvers/concerns/resolves_pipelines.rb index 42c4c22a938..764ed9b15fd 100644 --- a/app/graphql/resolvers/concerns/resolves_pipelines.rb +++ b/app/graphql/resolvers/concerns/resolves_pipelines.rb @@ -20,11 +20,22 @@ module ResolvesPipelines GraphQL::Types::String, required: false, description: "Filter pipelines by the sha of the commit they are run for." - argument :source, GraphQL::Types::String, required: false, description: "Filter pipelines by their source." + + argument :updated_after, Types::TimeType, + required: false, + description: 'Pipelines updated after this date.' + argument :updated_before, Types::TimeType, + required: false, + description: 'Pipelines updated before this date.' + + argument :username, + GraphQL::Types::String, + required: false, + description: "Filter pipelines by the user that triggered the pipeline." end class_methods do diff --git a/app/graphql/resolvers/group_issues_resolver.rb b/app/graphql/resolvers/group_issues_resolver.rb index 28f9266974f..05c5e803539 100644 --- a/app/graphql/resolvers/group_issues_resolver.rb +++ b/app/graphql/resolvers/group_issues_resolver.rb @@ -3,9 +3,11 @@ module Resolvers class GroupIssuesResolver < BaseIssuesResolver - include GroupIssuableResolver + def self.issuable_collection_name + 'issues' + end - include_subgroups 'issues' + include GroupIssuableResolver def ready?(**args) if args.dig(:not, :release_tag).present? diff --git a/app/graphql/resolvers/group_members/notification_email_resolver.rb b/app/graphql/resolvers/group_members/notification_email_resolver.rb new file mode 100644 index 00000000000..6cff4fbf531 --- /dev/null +++ b/app/graphql/resolvers/group_members/notification_email_resolver.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +module Resolvers + module GroupMembers + class NotificationEmailResolver < BaseResolver + include Gitlab::Graphql::Authorize::AuthorizeResource + + type GraphQL::Types::String, null: true + + def resolve + authorize! + + BatchLoader::GraphQL.for(object.user_id).batch do |user_ids, loader| + User.find(user_ids).each do |user| + loader.call(user.id, user.notification_email_for(object.group)) + end + end + end + + def authorize! + raise_resource_not_available_error! unless user_is_admin? + end + + def user_is_admin? + context[:current_user].present? && context[:current_user].can_admin_all_resources? + end + end + end +end diff --git a/app/graphql/resolvers/group_merge_requests_resolver.rb b/app/graphql/resolvers/group_merge_requests_resolver.rb index 34a4c67bc56..da1b6169c07 100644 --- a/app/graphql/resolvers/group_merge_requests_resolver.rb +++ b/app/graphql/resolvers/group_merge_requests_resolver.rb @@ -2,13 +2,16 @@ module Resolvers class GroupMergeRequestsResolver < MergeRequestsResolver + def self.issuable_collection_name + 'merge requests' + end + include GroupIssuableResolver alias_method :group, :object type Types::MergeRequestType.connection_type, null: true - include_subgroups 'merge requests' accept_assignee accept_author diff --git a/app/graphql/resolvers/topics_resolver.rb b/app/graphql/resolvers/topics_resolver.rb index d8199f3d89b..68e2ff69282 100644 --- a/app/graphql/resolvers/topics_resolver.rb +++ b/app/graphql/resolvers/topics_resolver.rb @@ -10,9 +10,9 @@ module Resolvers def resolve(**args) if args[:search].present? - ::Projects::Topic.search(args[:search]).order_by_total_projects_count + ::Projects::Topic.search(args[:search]).order_by_non_private_projects_count else - ::Projects::Topic.order_by_total_projects_count + ::Projects::Topic.order_by_non_private_projects_count end end end diff --git a/app/graphql/resolvers/work_item_resolver.rb b/app/graphql/resolvers/work_item_resolver.rb new file mode 100644 index 00000000000..7cf52339815 --- /dev/null +++ b/app/graphql/resolvers/work_item_resolver.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +module Resolvers + class WorkItemResolver < BaseResolver + include Gitlab::Graphql::Authorize::AuthorizeResource + + authorize :read_work_item + + type Types::WorkItemType, null: true + + argument :id, ::Types::GlobalIDType[::WorkItem], required: true, description: 'Global ID of the work item.' + + def resolve(id:) + work_item = authorized_find!(id: id) + return unless Feature.enabled?(:work_items, work_item.project, default_enabled: :yaml) + + work_item + end + + private + + def find_object(id:) + # TODO: remove this line when the compatibility layer is removed + # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883 + id = ::Types::GlobalIDType[::WorkItem].coerce_isolated_input(id) + GitlabSchema.find_by_gid(id) + end + end +end diff --git a/app/graphql/resolvers/work_items/types_resolver.rb b/app/graphql/resolvers/work_items/types_resolver.rb index b7a32e13423..67a9d57d42f 100644 --- a/app/graphql/resolvers/work_items/types_resolver.rb +++ b/app/graphql/resolvers/work_items/types_resolver.rb @@ -5,10 +5,20 @@ module Resolvers class TypesResolver < BaseResolver type Types::WorkItems::TypeType.connection_type, null: true - def resolve + argument :taskable, ::GraphQL::Types::Boolean, + required: false, + description: 'If `true`, only taskable work item types will be returned.' \ + ' Argument is experimental and can be removed in the future without notice.' + + def resolve(taskable: nil) + return unless Feature.enabled?(:work_items, object, default_enabled: :yaml) + # This will require a finder in the future when groups/projects get their work item types # All groups/projects use the default types for now - ::WorkItems::Type.default.order_by_name_asc + base_scope = ::WorkItems::Type.default + base_scope = base_scope.by_type(:task) if taskable + + base_scope.order_by_name_asc end end end |