56 lines
1.4 KiB
Ruby
56 lines
1.4 KiB
Ruby
|
# 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
|