diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index bde34265f..e05e343e3 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -668,7 +668,13 @@ class ApplicationController < ActionController::Base end end + def kaminari_paginate(relation) + limit = params[:limit] || params[:per_page] + limit = (limit.to_i.zero? || limit.to_i > 15) ? 15 : limit.to_i + page = params[:page].to_i.zero? ? 1 : params[:page].to_i + relation.page(page).per(limit) + end def strf_time(time) time.blank? ? '' : time.strftime("%Y-%m-%d %H:%M:%S") diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 879efcaaf..02dacc5a1 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -8,8 +8,8 @@ class ProjectsController < ApplicationController def index scope = Projects::ListQuery.call(params) - @total_count = scope.size - @projects = paginate(scope) + @projects = kaminari_paginate(scope) + @total_count = @projects.total_count end def create diff --git a/app/models/concerns/matchable.rb b/app/models/concerns/matchable.rb index 13fcff80d..943fb5ec4 100644 --- a/app/models/concerns/matchable.rb +++ b/app/models/concerns/matchable.rb @@ -2,9 +2,6 @@ module Matchable extend ActiveSupport::Concern included do - scope :like, lambda { |keywords| - joins(:repository).where(%w[ projects.name projects.identifier repositories.identifier ].map { |f| "LOWER(#{f}) LIKE :q" }.join(' OR '), q: "%#{keywords.split(" ").join('|')}%") unless keywords.blank? - } scope :with_project_category, ->(category_id) { where(project_category_id: category_id) unless category_id.blank? } scope :with_project_language, ->(language_id) { where(project_language_id: language_id) unless language_id.blank? } scope :with_project_type, ->(project_type) { where(project_type: project_type) if Project.project_types.include?(project_type) } diff --git a/app/models/concerns/projectable.rb b/app/models/concerns/projectable.rb index e44fb397c..e952cc863 100644 --- a/app/models/concerns/projectable.rb +++ b/app/models/concerns/projectable.rb @@ -5,9 +5,6 @@ module Projectable has_many :projects, -> { order(position: :asc) } scope :without_content, -> { select(column_names - ['content'])} - scope :search, lambda { |keywords| - where("name LIKE ?", "%#{keywords.split(" ").join('|')}%") unless keywords.blank? - } end module ClassMethods diff --git a/app/queries/projects/list_query.rb b/app/queries/projects/list_query.rb index 638aa7a3c..6b145c81a 100644 --- a/app/queries/projects/list_query.rb +++ b/app/queries/projects/list_query.rb @@ -10,8 +10,10 @@ class Projects::ListQuery < ApplicationQuery end def call - projects = Project.visible - scope = projects.includes(:project_category, :project_language).like(params[:search]) + q = Project.visible.ransack(name_or_identifier_cont: params[:search]) + + scope = q.result(distinct: true) + .includes(:project_category, :project_language, :repository, owner: :user_extension) .with_project_type(params[:project_type]) .with_project_category(params[:category_id]) .with_project_language(params[:language_id]) @@ -19,13 +21,7 @@ class Projects::ListQuery < ApplicationQuery sort = params[:sort_by] || "updated_on" sort_direction = params[:sort_direction] || "desc" - scope = scope.no_anomory_projects.distinct.includes(:project_category, :project_language, :repository, owner: :user_extension).reorder("projects.#{sort} #{sort_direction}") + scope = scope.no_anomory_projects.reorder("projects.#{sort} #{sort_direction}") scope - - #cope_ids = scope.select(:id,:user_id).no_anomory_projects.distinct.pluck(:id) - - #sort = params[:sort_by] || "updated_on" - #sort_direction = params[:sort_direction] || "desc" - #projects.where(id: scope_ids).includes(:project_category, :project_language, :repository, owner: :user_extension).reorder("projects.#{sort} #{sort_direction}") end end diff --git a/app/views/projects/index.json.jbuilder b/app/views/projects/index.json.jbuilder index 4cb260fd6..fc0bb470f 100644 --- a/app/views/projects/index.json.jbuilder +++ b/app/views/projects/index.json.jbuilder @@ -1,30 +1,39 @@ json.total_count @total_count -json.projects do - json.array! @projects.to_a do |project| - user = project.owner - if user.present? - json.partial! 'project', project: project - json.author do - json.name user.try(:show_real_name) - json.login user.login - json.image_url url_to_avatar(project.owner) - end - json.category do - if project.project_category.blank? - json.nil! - else - json.id project.project_category.id - json.name project.project_category.name - end - end - json.language do - if project.project_language.blank? - json.nil! - else - json.id project.project_language.id - json.name project.project_language.name - end - end +json.projects @projects do |project| + user = project.owner + next if user.blank? + + json.id project.id + json.identifier project.identifier + json.name project.name + json.description Nokogiri::HTML(project.description).text + json.visits project.visits + json.praises_count project.praises_count + json.forked_count project.forked_count + json.is_public project.is_public + json.mirror_url project.repository&.mirror_url + json.last_update_time render_unix_time(project.updated_on) + json.time_ago time_from_now(project.updated_on) + json.forked_from_project_id project.forked_from_project_id + json.author do + json.name user.try(:show_real_name) + json.login user.login + json.image_url url_to_avatar(project.owner) + end + json.category do + if project.project_category.blank? + json.nil! + else + json.id project.project_category.id + json.name project.project_category.name + end + end + json.language do + if project.project_language.blank? + json.nil! + else + json.id project.project_language.id + json.name project.project_language.name end end end