113 lines
3.4 KiB
Ruby
113 lines
3.4 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module Resolvers
|
||
|
class TimelogResolver < BaseResolver
|
||
|
include LooksAhead
|
||
|
|
||
|
type ::Types::TimelogType.connection_type, null: false
|
||
|
|
||
|
argument :start_date, Types::TimeType,
|
||
|
required: false,
|
||
|
description: 'List time logs within a date range where the logged date is equal to or after startDate.'
|
||
|
|
||
|
argument :end_date, Types::TimeType,
|
||
|
required: false,
|
||
|
description: 'List time logs within a date range where the logged date is equal to or before endDate.'
|
||
|
|
||
|
argument :start_time, Types::TimeType,
|
||
|
required: false,
|
||
|
description: 'List time-logs within a time range where the logged time is equal to or after startTime.'
|
||
|
|
||
|
argument :end_time, Types::TimeType,
|
||
|
required: false,
|
||
|
description: 'List time-logs within a time range where the logged time is equal to or before endTime.'
|
||
|
|
||
|
def resolve_with_lookahead(**args)
|
||
|
return Timelog.none unless timelogs_available_for_user?
|
||
|
|
||
|
validate_params_presence!(args)
|
||
|
transformed_args = transform_args(args)
|
||
|
validate_time_difference!(transformed_args)
|
||
|
|
||
|
find_timelogs(transformed_args)
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def preloads
|
||
|
{
|
||
|
note: [:note]
|
||
|
}
|
||
|
end
|
||
|
|
||
|
def find_timelogs(args)
|
||
|
apply_lookahead(group.timelogs(args[:start_time], args[:end_time]))
|
||
|
end
|
||
|
|
||
|
def timelogs_available_for_user?
|
||
|
group&.user_can_access_group_timelogs?(context[:current_user])
|
||
|
end
|
||
|
|
||
|
def validate_params_presence!(args)
|
||
|
message = case time_params_count(args)
|
||
|
when 0
|
||
|
'Start and End arguments must be present'
|
||
|
when 1
|
||
|
'Both Start and End arguments must be present'
|
||
|
when 2
|
||
|
validate_duplicated_args(args)
|
||
|
when 3 || 4
|
||
|
'Only Time or Date arguments must be present'
|
||
|
end
|
||
|
|
||
|
raise_argument_error(message) if message
|
||
|
end
|
||
|
|
||
|
def validate_time_difference!(args)
|
||
|
message = if args[:end_time] < args[:start_time]
|
||
|
'Start argument must be before End argument'
|
||
|
elsif args[:end_time] - args[:start_time] > 60.days
|
||
|
'The time range period cannot contain more than 60 days'
|
||
|
end
|
||
|
|
||
|
raise_argument_error(message) if message
|
||
|
end
|
||
|
|
||
|
def transform_args(args)
|
||
|
return args if args.keys == [:start_time, :end_time]
|
||
|
|
||
|
time_args = args.except(:start_date, :end_date)
|
||
|
|
||
|
if time_args.empty?
|
||
|
time_args[:start_time] = args[:start_date].beginning_of_day
|
||
|
time_args[:end_time] = args[:end_date].end_of_day
|
||
|
elsif time_args.key?(:start_time)
|
||
|
time_args[:end_time] = args[:end_date].end_of_day
|
||
|
elsif time_args.key?(:end_time)
|
||
|
time_args[:start_time] = args[:start_date].beginning_of_day
|
||
|
end
|
||
|
|
||
|
time_args
|
||
|
end
|
||
|
|
||
|
def time_params_count(args)
|
||
|
[:start_time, :end_time, :start_date, :end_date].count { |param| args.key?(param) }
|
||
|
end
|
||
|
|
||
|
def validate_duplicated_args(args)
|
||
|
if args.key?(:start_time) && args.key?(:start_date) ||
|
||
|
args.key?(:end_time) && args.key?(:end_date)
|
||
|
'Both Start and End arguments must be present'
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def raise_argument_error(message)
|
||
|
raise Gitlab::Graphql::Errors::ArgumentError, message
|
||
|
end
|
||
|
|
||
|
def group
|
||
|
@group ||= object.respond_to?(:sync) ? object.sync : object
|
||
|
end
|
||
|
end
|
||
|
end
|