diff options
Diffstat (limited to 'app/graphql/resolvers/design_management')
8 files changed, 88 insertions, 43 deletions
diff --git a/app/graphql/resolvers/design_management/design_at_version_resolver.rb b/app/graphql/resolvers/design_management/design_at_version_resolver.rb index fd9b349f974..1b69efebe4e 100644 --- a/app/graphql/resolvers/design_management/design_at_version_resolver.rb +++ b/app/graphql/resolvers/design_management/design_at_version_resolver.rb @@ -9,7 +9,7 @@ module Resolvers authorize :read_design - argument :id, GraphQL::ID_TYPE, + argument :id, ::Types::GlobalIDType[::DesignManagement::DesignAtVersion], required: true, description: 'The Global ID of the design at this version' @@ -18,7 +18,10 @@ module Resolvers end def find_object(id:) - dav = GitlabSchema.object_from_id(id, expected_type: ::DesignManagement::DesignAtVersion) + # TODO: remove this line when the compatibility layer is removed + # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883 + id = ::Types::GlobalIDType[::DesignManagement::DesignAtVersion].coerce_isolated_input(id) + dav = GitlabSchema.find_by_gid(id) return unless consistent?(dav) dav @@ -35,7 +38,7 @@ module Resolvers # that the DesignAtVersion as found by its ID does in fact belong # to this issue. def consistent?(dav) - issue.nil? || (dav&.design&.issue_id == issue.id) + issue.nil? || (dav.present? && dav.design&.issue_id == issue.id) end def issue diff --git a/app/graphql/resolvers/design_management/design_resolver.rb b/app/graphql/resolvers/design_management/design_resolver.rb index 05bdbbbe407..e0a68bae397 100644 --- a/app/graphql/resolvers/design_management/design_resolver.rb +++ b/app/graphql/resolvers/design_management/design_resolver.rb @@ -3,7 +3,9 @@ module Resolvers module DesignManagement class DesignResolver < BaseResolver - argument :id, GraphQL::ID_TYPE, + type ::Types::DesignManagement::DesignType, null: true + + argument :id, ::Types::GlobalIDType[::DesignManagement::Design], required: false, description: 'Find a design by its ID' @@ -50,7 +52,11 @@ module Resolvers end def parse_gid(gid) - GitlabSchema.parse_gid(gid, expected_type: ::DesignManagement::Design).model_id + # TODO: remove this line when the compatibility layer is removed + # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883 + gid = ::Types::GlobalIDType[::DesignManagement::Design].coerce_isolated_input(gid) + + gid.model_id end end end diff --git a/app/graphql/resolvers/design_management/designs_resolver.rb b/app/graphql/resolvers/design_management/designs_resolver.rb index 955ea6304e0..c588142ea6b 100644 --- a/app/graphql/resolvers/design_management/designs_resolver.rb +++ b/app/graphql/resolvers/design_management/designs_resolver.rb @@ -3,16 +3,18 @@ module Resolvers module DesignManagement class DesignsResolver < BaseResolver - argument :ids, - [GraphQL::ID_TYPE], + DesignID = ::Types::GlobalIDType[::DesignManagement::Design] + VersionID = ::Types::GlobalIDType[::DesignManagement::Version] + + type ::Types::DesignManagement::DesignType.connection_type, null: true + + argument :ids, [DesignID], required: false, description: 'Filters designs by their ID' - argument :filenames, - [GraphQL::STRING_TYPE], + argument :filenames, [GraphQL::STRING_TYPE], required: false, description: 'Filters designs by their filename' - argument :at_version, - GraphQL::ID_TYPE, + argument :at_version, VersionID, required: false, description: 'Filters designs to only those that existed at the version. ' \ 'If argument is omitted or nil then all designs will reflect the latest version' @@ -36,11 +38,20 @@ module Resolvers def version(at_version) return unless at_version - GitlabSchema.object_from_id(at_version, expected_type: ::DesignManagement::Version)&.sync + # TODO: remove this line when the compatibility layer is removed + # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883 + at_version = VersionID.coerce_isolated_input(at_version) + # TODO: when we get promises use this to make resolve lazy + Gitlab::Graphql::Lazy.force(GitlabSchema.find_by_gid(at_version)) end - def design_ids(ids) - ids&.map { |id| GlobalID.parse(id, expected_type: ::DesignManagement::Design).model_id } + def design_ids(gids) + return if gids.nil? + + # TODO: remove this line when the compatibility layer is removed + # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883 + gids = gids.map { |id| DesignID.coerce_isolated_input(id) } + gids.map(&:model_id) end def issue diff --git a/app/graphql/resolvers/design_management/version/design_at_version_resolver.rb b/app/graphql/resolvers/design_management/version/design_at_version_resolver.rb index 03f7908780c..70021057f71 100644 --- a/app/graphql/resolvers/design_management/version/design_at_version_resolver.rb +++ b/app/graphql/resolvers/design_management/version/design_at_version_resolver.rb @@ -5,17 +5,20 @@ module Resolvers module Version # Resolver for a DesignAtVersion object given an implicit version context class DesignAtVersionResolver < BaseResolver + DesignAtVersionID = ::Types::GlobalIDType[::DesignManagement::DesignAtVersion] + DesignID = ::Types::GlobalIDType[::DesignManagement::Design] + include Gitlab::Graphql::Authorize::AuthorizeResource type Types::DesignManagement::DesignAtVersionType, null: true authorize :read_design - argument :id, GraphQL::ID_TYPE, + argument :id, DesignAtVersionID, required: false, as: :design_at_version_id, description: 'The ID of the DesignAtVersion' - argument :design_id, GraphQL::ID_TYPE, + argument :design_id, DesignID, required: false, description: 'The ID of a specific design' argument :filename, GraphQL::STRING_TYPE, @@ -29,6 +32,11 @@ module Resolvers def resolve(design_id: nil, filename: nil, design_at_version_id: nil) validate_arguments(design_id, filename, design_at_version_id) + # TODO: remove this when the compatibility layer is removed + # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883 + design_id &&= DesignID.coerce_isolated_input(design_id) + design_at_version_id &&= DesignAtVersionID.coerce_isolated_input(design_at_version_id) + return unless Ability.allowed?(current_user, :read_design, issue) return specific_design_at_version(design_at_version_id) if design_at_version_id @@ -49,7 +57,7 @@ module Resolvers end def specific_design_at_version(id) - dav = GitlabSchema.object_from_id(id, expected_type: ::DesignManagement::DesignAtVersion) + dav = GitlabSchema.find_by_gid(id) return unless consistent?(dav) dav @@ -65,8 +73,8 @@ module Resolvers dav.design.visible_in?(version) end - def find(id, filename) - ids = [parse_design_id(id).model_id] if id + def find(gid, filename) + ids = [gid.model_id] if gid filenames = [filename] if filename ::DesignManagement::DesignsFinder @@ -74,10 +82,6 @@ module Resolvers .execute end - def parse_design_id(id) - GitlabSchema.parse_gid(id, expected_type: ::DesignManagement::Design) - end - def issue version.issue end diff --git a/app/graphql/resolvers/design_management/version/designs_at_version_resolver.rb b/app/graphql/resolvers/design_management/version/designs_at_version_resolver.rb index 5ccb2f3e311..a129d8620d4 100644 --- a/app/graphql/resolvers/design_management/version/designs_at_version_resolver.rb +++ b/app/graphql/resolvers/design_management/version/designs_at_version_resolver.rb @@ -11,8 +11,9 @@ module Resolvers authorize :read_design - argument :ids, - [GraphQL::ID_TYPE], + DesignID = ::Types::GlobalIDType[::DesignManagement::Design] + + argument :ids, [DesignID], required: false, description: 'Filters designs by their ID' argument :filenames, @@ -31,16 +32,19 @@ module Resolvers private def find(ids, filenames) - ids = ids&.map { |id| parse_design_id(id).model_id } - ::DesignManagement::DesignsFinder.new(issue, current_user, - ids: ids, + ids: design_ids(ids), filenames: filenames, visible_at_version: version) end - def parse_design_id(id) - GitlabSchema.parse_gid(id, expected_type: ::DesignManagement::Design) + def design_ids(gids) + return if gids.nil? + + # TODO: remove this line when the compatibility layer is removed + # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883 + gids = gids.map { |id| DesignID.coerce_isolated_input(id) } + gids.map(&:model_id) end def issue diff --git a/app/graphql/resolvers/design_management/version_in_collection_resolver.rb b/app/graphql/resolvers/design_management/version_in_collection_resolver.rb index 9e729172881..ecd7ab3ee45 100644 --- a/app/graphql/resolvers/design_management/version_in_collection_resolver.rb +++ b/app/graphql/resolvers/design_management/version_in_collection_resolver.rb @@ -11,20 +11,25 @@ module Resolvers alias_method :collection, :object + VersionID = ::Types::GlobalIDType[::DesignManagement::Version] + argument :sha, GraphQL::STRING_TYPE, required: false, description: "The SHA256 of a specific version" - argument :id, GraphQL::ID_TYPE, + argument :id, VersionID, + as: :version_id, required: false, description: 'The Global ID of the version' - def resolve(id: nil, sha: nil) - check_args(id, sha) + def resolve(version_id: nil, sha: nil) + # TODO: remove this line when the compatibility layer is removed + # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883 + version_id &&= VersionID.coerce_isolated_input(version_id) - gid = GitlabSchema.parse_gid(id, expected_type: ::DesignManagement::Version) if id + check_args(version_id, sha) ::DesignManagement::VersionsFinder - .new(collection, current_user, sha: sha, version_id: gid&.model_id) + .new(collection, current_user, sha: sha, version_id: version_id&.model_id) .execute .first end diff --git a/app/graphql/resolvers/design_management/version_resolver.rb b/app/graphql/resolvers/design_management/version_resolver.rb index b0e0843e6c8..1bc9c1a7cd6 100644 --- a/app/graphql/resolvers/design_management/version_resolver.rb +++ b/app/graphql/resolvers/design_management/version_resolver.rb @@ -9,7 +9,7 @@ module Resolvers authorize :read_design - argument :id, GraphQL::ID_TYPE, + argument :id, ::Types::GlobalIDType[::DesignManagement::Version], required: true, description: 'The Global ID of the version' @@ -18,7 +18,11 @@ module Resolvers end def find_object(id:) - GitlabSchema.object_from_id(id, expected_type: ::DesignManagement::Version) + # TODO: remove this line when the compatibility layer is removed + # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883 + id = ::Types::GlobalIDType[::DesignManagement::Version].coerce_isolated_input(id) + + GitlabSchema.find_by_gid(id) end end end diff --git a/app/graphql/resolvers/design_management/versions_resolver.rb b/app/graphql/resolvers/design_management/versions_resolver.rb index a62258dad5c..23858c8e991 100644 --- a/app/graphql/resolvers/design_management/versions_resolver.rb +++ b/app/graphql/resolvers/design_management/versions_resolver.rb @@ -7,12 +7,14 @@ module Resolvers alias_method :design_or_collection, :object + VersionID = ::Types::GlobalIDType[::DesignManagement::Version] + argument :earlier_or_equal_to_sha, GraphQL::STRING_TYPE, as: :sha, required: false, description: 'The SHA256 of the most recent acceptable version' - argument :earlier_or_equal_to_id, GraphQL::ID_TYPE, + argument :earlier_or_equal_to_id, VersionID, as: :id, required: false, description: 'The Global ID of the most recent acceptable version' @@ -23,6 +25,9 @@ module Resolvers end def resolve(parent: nil, id: nil, sha: nil) + # TODO: remove this line when the compatibility layer is removed + # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883 + id &&= VersionID.coerce_isolated_input(id) version = cutoff(parent, id, sha) raise ::Gitlab::Graphql::Errors::ResourceNotAvailable, 'cutoff not found' unless version.present? @@ -47,8 +52,7 @@ module Resolvers end end - def specific_version(id, sha) - gid = GitlabSchema.parse_gid(id, expected_type: ::DesignManagement::Version) if id + def specific_version(gid, sha) find(sha: sha, version_id: gid&.model_id).first end @@ -58,8 +62,8 @@ module Resolvers .execute end - def by_id(id) - GitlabSchema.object_from_id(id, expected_type: ::DesignManagement::Version).sync + def by_id(gid) + ::Gitlab::Graphql::Lazy.force(GitlabSchema.find_by_gid(gid)) end # Find an `at_version` argument passed to a parent node. @@ -69,7 +73,11 @@ module Resolvers # for consistency we should only present versions up to the given # version here. def at_version_arg(parent) - ::Gitlab::Graphql::FindArgumentInParent.find(parent, :at_version, limit_depth: 4) + # TODO: remove coercion when the compatibility layer is removed + # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883 + version_id = ::Gitlab::Graphql::FindArgumentInParent.find(parent, :at_version, limit_depth: 4) + version_id &&= VersionID.coerce_isolated_input(version_id) + version_id end end end |