summaryrefslogtreecommitdiff
path: root/app/graphql/types/global_id_type.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/graphql/types/global_id_type.rb')
-rw-r--r--app/graphql/types/global_id_type.rb42
1 files changed, 27 insertions, 15 deletions
diff --git a/app/graphql/types/global_id_type.rb b/app/graphql/types/global_id_type.rb
index ed28c3ffd7e..750bd1bfe8d 100644
--- a/app/graphql/types/global_id_type.rb
+++ b/app/graphql/types/global_id_type.rb
@@ -19,7 +19,14 @@ end
module Types
class GlobalIDType < BaseScalar
graphql_name 'GlobalID'
- description 'A global identifier'
+ description <<~DESC
+ A global identifier.
+
+ A global identifier represents an object uniquely across the application.
+ An example of such an identifier is "gid://gitlab/User/1".
+
+ Global identifiers are encoded as strings.
+ DESC
# @param value [GID]
# @return [String]
@@ -46,35 +53,40 @@ module Types
@id_types[model_class] ||= Class.new(self) do
graphql_name "#{model_class.name.gsub(/::/, '')}ID"
- description "Identifier of #{model_class.name}."
+ description <<~MD
+ A `#{graphql_name}` is a global ID. It is encoded as a string.
+
+ An example `#{graphql_name}` is: `"#{::Gitlab::GlobalId.build(model_name: model_class.name, id: 1)}"`.
+ MD
- self.define_singleton_method(:to_s) do
+ define_singleton_method(:to_s) do
graphql_name
end
- self.define_singleton_method(:inspect) do
+ define_singleton_method(:inspect) do
graphql_name
end
- self.define_singleton_method(:coerce_result) do |gid, ctx|
+ define_singleton_method(:coerce_result) do |gid, ctx|
global_id = ::Gitlab::GlobalId.as_global_id(gid, model_name: model_class.name)
- if suitable?(global_id)
- global_id.to_s
- else
- raise GraphQL::CoercionError, "Expected a #{model_class.name} ID, got #{global_id}"
- end
+ next global_id.to_s if suitable?(global_id)
+
+ raise GraphQL::CoercionError, "Expected a #{model_class.name} ID, got #{global_id}"
end
- self.define_singleton_method(:suitable?) do |gid|
- gid&.model_class&.ancestors&.include?(model_class)
+ define_singleton_method(:suitable?) do |gid|
+ next false if gid.nil?
+
+ gid.model_name.safe_constantize.present? &&
+ gid.model_class.ancestors.include?(model_class)
end
- self.define_singleton_method(:coerce_input) do |string, ctx|
+ define_singleton_method(:coerce_input) do |string, ctx|
gid = super(string, ctx)
- raise GraphQL::CoercionError, "#{string.inspect} does not represent an instance of #{model_class.name}" unless suitable?(gid)
+ next gid if suitable?(gid)
- gid
+ raise GraphQL::CoercionError, "#{string.inspect} does not represent an instance of #{model_class.name}"
end
end
end