summaryrefslogtreecommitdiff
path: root/app/graphql/resolvers/timelog_resolver.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/graphql/resolvers/timelog_resolver.rb')
-rw-r--r--app/graphql/resolvers/timelog_resolver.rb108
1 files changed, 45 insertions, 63 deletions
diff --git a/app/graphql/resolvers/timelog_resolver.rb b/app/graphql/resolvers/timelog_resolver.rb
index aebd04259ee..8ac30c4cb5d 100644
--- a/app/graphql/resolvers/timelog_resolver.rb
+++ b/app/graphql/resolvers/timelog_resolver.rb
@@ -7,106 +7,88 @@ module Resolvers
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.'
+ 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.'
+ 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.'
+ 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.'
+ 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?
+ build_timelogs
- validate_params_presence!(args)
- transformed_args = transform_args(args)
- validate_time_difference!(transformed_args)
+ if args.any?
+ validate_args!(args)
+ build_parsed_args(args)
+ validate_time_difference!
+ apply_time_filter
+ end
- find_timelogs(transformed_args)
+ apply_lookahead(timelogs)
end
private
+ attr_reader :parsed_args, :timelogs
+
def preloads
{
note: [:note]
}
end
- def find_timelogs(args)
- apply_lookahead(group.timelogs(args[:start_time], args[:end_time]))
+ def validate_args!(args)
+ if args[:start_time] && args[:start_date]
+ raise_argument_error('Provide either a start date or time, but not both')
+ elsif args[:end_time] && args[:end_date]
+ raise_argument_error('Provide either an end date or time, but not both')
+ end
end
- def timelogs_available_for_user?
- group&.user_can_access_group_timelogs?(context[:current_user])
- end
+ def build_parsed_args(args)
+ if times_provided?(args)
+ @parsed_args = args
+ else
+ @parsed_args = args.except(:start_date, :end_date)
- 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
+ @parsed_args[:start_time] = args[:start_date].beginning_of_day if args[:start_date]
+ @parsed_args[:end_time] = args[:end_date].end_of_day if args[:end_date]
+ end
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
+ def times_provided?(args)
+ args[:start_time] && args[:end_time]
end
- def transform_args(args)
- return args if args.keys == [:start_time, :end_time]
+ def validate_time_difference!
+ return unless end_time_before_start_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
+ raise_argument_error('Start argument must be before End argument')
+ end
- time_args
+ def end_time_before_start_time?
+ times_provided?(parsed_args) && parsed_args[:end_time] < parsed_args[:start_time]
end
- def time_params_count(args)
- [:start_time, :end_time, :start_date, :end_date].count { |param| args.key?(param) }
+ def build_timelogs
+ @timelogs = Timelog.in_group(object)
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
+ def apply_time_filter
+ @timelogs = timelogs.at_or_after(parsed_args[:start_time]) if parsed_args[:start_time]
+ @timelogs = timelogs.at_or_before(parsed_args[:end_time]) if parsed_args[:end_time]
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