diff options
Diffstat (limited to 'app/finders/issuables/author_filter.rb')
-rw-r--r-- | app/finders/issuables/author_filter.rb | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/app/finders/issuables/author_filter.rb b/app/finders/issuables/author_filter.rb new file mode 100644 index 00000000000..ce68dbafb95 --- /dev/null +++ b/app/finders/issuables/author_filter.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +module Issuables + class AuthorFilter < BaseFilter + def filter + filtered = by_author(issuables) + filtered = by_author_union(filtered) + by_negated_author(filtered) + end + + private + + def by_author(issuables) + if params[:author_id].present? + issuables.authored(params[:author_id]) + elsif params[:author_username].present? + issuables.authored(User.by_username(params[:author_username])) + else + issuables + end + end + + def by_author_union(issuables) + return issuables unless or_filters_enabled? && or_params&.fetch(:author_username).present? + + issuables.authored(User.by_username(or_params[:author_username])) + end + + def by_negated_author(issuables) + return issuables unless not_filters_enabled? && not_params.present? + + if not_params[:author_id].present? + issuables.not_authored(not_params[:author_id]) + elsif not_params[:author_username].present? + issuables.not_authored(User.by_username(not_params[:author_username])) + else + issuables + end + end + end +end |