openSUSE/open-build-service

View on GitHub
src/api/app/models/bs_request/find_for/project.rb

Summary

Maintainability
A
1 hr
Test Coverage
A
96%
class BsRequest
  module FindFor
    class Project < Base
      def all
        inner_or = []
        @relation, inner_or = extend_relation('source', @relation, roles, package_name, subprojects, project_name, inner_or)
        @relation, inner_or = extend_relation('target', @relation, roles, package_name, subprojects, project_name, inner_or)

        if (roles.empty? || roles.include?('reviewer')) &&
           (states.empty? || states.include?('review'))
          @relation = @relation.references(:reviews)
          review_states.each do |review_state|
            @relation = @relation.includes(:reviews)
            inner_or << if package_name.blank?
                          "(reviews.state=#{quote(review_state)} and reviews.by_project=#{quote(project_name)})"
                        else
                          "(reviews.state=#{quote(review_state)} and reviews.by_project=#{quote(project_name)} and reviews.by_package=#{quote(package_name)})"
                        end
          end
        end
        if inner_or.empty?
          @relation.none
        else
          @relation.where(inner_or.join(' or '))
        end
      end

      private

      def extend_relation(source_or_target, requests, roles, package, subprojects, project, inner_or)
        if roles.empty? || roles.include?(source_or_target)
          inner_or << if package.blank?
                        if subprojects.blank?
                          "bs_request_actions.#{source_or_target}_project=#{quote(project)}"
                        else
                          "(bs_request_actions.#{source_or_target}_project like #{quote("#{project}:%")})"
                        end
                      else
                        "(bs_request_actions.#{source_or_target}_project=#{quote(project)} and " \
                          "bs_request_actions.#{source_or_target}_package=#{quote(package)})"
                      end
        end
        [requests, inner_or]
      end
    end
  end
end