Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-12-16 00:15:55 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2023-12-16 00:15:55 +0300
commit73778b9c53d13a2e06a693c30073366deedead8f (patch)
treed0ccbde07ae68feb9d7cfe68ffeea96ddedf2371 /app/finders
parent19ccf5e6435280a5fc3abc0748f78fd1ce103890 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/finders')
-rw-r--r--app/finders/timelogs/timelogs_finder.rb76
1 files changed, 76 insertions, 0 deletions
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