diff options
Diffstat (limited to 'app/graphql/types/work_item_id_type.rb')
-rw-r--r-- | app/graphql/types/work_item_id_type.rb | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/app/graphql/types/work_item_id_type.rb b/app/graphql/types/work_item_id_type.rb new file mode 100644 index 00000000000..ddcf3416014 --- /dev/null +++ b/app/graphql/types/work_item_id_type.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +module Types + # rubocop:disable Graphql/AuthorizeTypes + # TODO: This type should be removed when Work Items become generally available. + # This mechanism is introduced temporarily to make the client implementation easier during this transition. + class WorkItemIdType < GlobalIDType + graphql_name 'WorkItemID' + description <<~DESC + A `WorkItemID` is a global ID. It is encoded as a string. + + An example `WorkItemID` is: `"gid://gitlab/WorkItem/1"`. + + While we transition from Issues into Work Items this type will temporarily support + `IssueID` like: `"gid://gitlab/Issue/1"`. This behavior will be removed without notice in the future. + DESC + + class << self + def coerce_result(gid, ctx) + global_id = ::Gitlab::GlobalId.as_global_id(gid, model_name: 'WorkItem') + + raise GraphQL::CoercionError, "Expected a WorkItem ID, got #{global_id}" unless suitable?(global_id) + + # Always return a WorkItemID even if an Issue is returned by a resolver + work_item_gid(global_id).to_s + end + + def coerce_input(string, ctx) + gid = super + # Always return a WorkItemID even if an Issue Global ID is provided as input + return work_item_gid(gid) if suitable?(gid) + + raise GraphQL::CoercionError, "#{string.inspect} does not represent an instance of WorkItem" + end + + def suitable?(gid) + return false if gid&.model_name&.safe_constantize.blank? + + [::WorkItem, ::Issue].any? { |model_class| gid.model_class == model_class } + end + + private + + def work_item_gid(gid) + GlobalID.new(::Gitlab::GlobalId.build(model_name: 'WorkItem', id: gid.model_id)) + end + end + end + # rubocop:enable Graphql/AuthorizeTypes +end |