diff options
Diffstat (limited to 'app/graphql/resolvers/milestones_resolver.rb')
-rw-r--r-- | app/graphql/resolvers/milestones_resolver.rb | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/app/graphql/resolvers/milestones_resolver.rb b/app/graphql/resolvers/milestones_resolver.rb new file mode 100644 index 00000000000..5f80506c01b --- /dev/null +++ b/app/graphql/resolvers/milestones_resolver.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: true + +module Resolvers + class MilestonesResolver < BaseResolver + include Gitlab::Graphql::Authorize::AuthorizeResource + include TimeFrameArguments + + argument :ids, [GraphQL::ID_TYPE], + required: false, + description: 'Array of global milestone IDs, e.g., "gid://gitlab/Milestone/1"' + + argument :state, Types::MilestoneStateEnum, + required: false, + description: 'Filter milestones by state' + + type Types::MilestoneType, null: true + + def resolve(**args) + validate_timeframe_params!(args) + + authorize! + + MilestonesFinder.new(milestones_finder_params(args)).execute + end + + private + + def milestones_finder_params(args) + { + ids: parse_gids(args[:ids]), + state: args[:state] || 'all', + start_date: args[:start_date], + end_date: args[:end_date] + }.merge(parent_id_parameters(args)) + end + + def parent + synchronized_object + end + + def parent_id_parameters(args) + raise NotImplementedError + end + + # MilestonesFinder does not check for current_user permissions, + # so for now we need to keep it here. + def authorize! + Ability.allowed?(context[:current_user], :read_milestone, parent) || raise_resource_not_available_error! + end + + def parse_gids(gids) + gids&.map { |gid| GitlabSchema.parse_gid(gid, expected_type: Milestone).model_id } + end + end +end |