From 73778b9c53d13a2e06a693c30073366deedead8f Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Fri, 15 Dec 2023 21:15:55 +0000 Subject: Add latest changes from gitlab-org/gitlab@master --- app/finders/timelogs/timelogs_finder.rb | 76 +++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 app/finders/timelogs/timelogs_finder.rb (limited to 'app/finders') diff --git a/app/finders/timelogs/timelogs_finder.rb b/app/finders/timelogs/timelogs_finder.rb new file mode 100644 index 00000000000..610dba43317 --- /dev/null +++ b/app/finders/timelogs/timelogs_finder.rb @@ -0,0 +1,76 @@ +# frozen_string_literal: true + +module Timelogs + class TimelogsFinder + attr_reader :issuable, :params + + def initialize(issuable, params = {}) + @issuable = issuable + @params = params + end + + def execute + timelogs = issuable&.timelogs || Timelog.all + timelogs = by_time(timelogs) + timelogs = by_user(timelogs) + timelogs = by_group(timelogs) + timelogs = by_project(timelogs) + apply_sorting(timelogs) + end + + private + + def by_time(timelogs) + return timelogs unless params[:start_time] || params[:end_time] + + validate_time_difference! + + timelogs = timelogs.at_or_after(params[:start_time]) if params[:start_time] + timelogs = timelogs.at_or_before(params[:end_time]) if params[:end_time] + + timelogs + end + + def by_user(timelogs) + return timelogs unless params[:username] + + user = User.find_by_username(params[:username]) + timelogs.for_user(user) + end + + def by_group(timelogs) + return timelogs unless params[:group_id] + + group = Group.find_by_id(params[:group_id]) + raise(ActiveRecord::RecordNotFound, "Group with id '#{params[:group_id]}' could not be found") unless group + + timelogs.in_group(group) + end + + def by_project(timelogs) + return timelogs unless params[:project_id] + + timelogs.in_project(params[:project_id]) + end + + def apply_sorting(timelogs) + return timelogs unless params[:sort] + + timelogs.sort_by_field(params[:sort]) + end + + def validate_time_difference! + return unless end_time_before_start_time? + + raise ArgumentError, 'Start argument must be before End argument' + end + + def end_time_before_start_time? + times_provided? && params[:end_time] < params[:start_time] + end + + def times_provided? + params[:start_time] && params[:end_time] + end + end +end -- cgit v1.2.3