diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 186ee874f..be17a4370 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1161,6 +1161,23 @@ class ApplicationController < ActionController::Base end def find_atme_receivers @atme_receivers = User.where(login: params[:receivers_login]) - end + end + + # 接口限流,请求量大有性能问题 + def request_limit + begin + record_count = Rails.cache.read("request/#{controller_name}/#{Time.now.strftime('%Y%m%d%H%M')}/#{request.remote_ip}") + if record_count.present? + record_count = record_count + 1 + else + record_count = 1 + end + tip_exception("非法请求") if record_count > 100 + + Rails.cache.write("request/#{controller_name}/#{Time.now.strftime('%Y%m%d%H%M')}/#{request.remote_ip}", record_count, expires_in: 1.minute) + rescue + + end + end end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 55c31918a..bcbe031b6 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -9,6 +9,7 @@ class ProjectsController < ApplicationController before_action :load_repository, except: %i[index group_type_list migrate create recommend banner_recommend] before_action :authorizate_user_can_edit_project!, only: %i[update] before_action :project_public?, only: %i[fork_users praise_users watch_users] + before_action :request_limit, only: %i[index] def menu_list menu = [] @@ -42,11 +43,11 @@ class ProjectsController < ApplicationController if category_id.blank? && params[:search].blank? && params[:topic_id].blank? # 默认查询时count性能问题处理 ProjectCategory.sum("projects_count") - Project.visible.joins("left join organization_extensions on organization_extensions.organization_id = projects.user_id").where("organization_extensions.visibility =2").count - elsif params[:search].present? || params[:topic_id].present? + elsif params[:search].present? || params[:topic_id].present? @projects.total_count else - cate = ProjectCategory.find_by(id: category_id) - cate&.projects_count || 0 + cate = ProjectCategory.find_by(id: category_id) + cate&.projects_count || 0 end end @@ -64,16 +65,16 @@ class ProjectsController < ApplicationController def migrate Projects::MigrateForm.new(mirror_params).validate! - @project = + @project = if EduSetting.get("mirror_address").to_s.include?("github") && enable_accelerator?(mirror_params[:clone_addr]) source_clone_url = mirror_params[:clone_addr] uid_logger("########## 已动加速器 ##########") result = Gitea::Accelerator::MigrateService.call(mirror_params) if result[:status] == :success Rails.logger.info "########## 加速镜像成功 ########## " - Projects::MigrateService.call(current_user, - mirror_params.merge(source_clone_url: source_clone_url, - clone_addr: accelerator_url(mirror_params[:repository_name]))) + Projects::MigrateService.call(current_user, + mirror_params.merge(source_clone_url: source_clone_url, + clone_addr: accelerator_url(mirror_params[:repository_name]))) else Projects::MigrateService.call(current_user, mirror_params) end @@ -95,7 +96,7 @@ class ProjectsController < ApplicationController # result = Gitea::Repository::Branches::ListService.call(@owner, @project.identifier) result = Gitea::Repository::Branches::ListNameService.call(@owner, @project.identifier, params[:name]) - @branches = result.is_a?(Hash) ? (result.key?(:status) ? [] : result) : result + @branches = result.is_a?(Hash) ? (result.key?(:status) ? [] : result) : result end def branches_slice @@ -129,7 +130,7 @@ class ProjectsController < ApplicationController ActiveRecord::Base.transaction do # TODO: # 临时特殊处理修改website、lesson_url操作方法 - if project_params.has_key?("website") + if project_params.has_key?("website") if params[:project_topic_names].is_a?(Array) ProjectTopicRalate.where(project: @project).destroy_all params[:project_topic_names].each do |name| @@ -145,11 +146,11 @@ class ProjectsController < ApplicationController } Gitea::Repository::UpdateService.call(@owner, @project.identifier, gitea_params) else - validate_params = project_params.slice(:name, :description, - :project_category_id, :project_language_id, :private, :identifier) - + validate_params = project_params.slice(:name, :description, + :project_category_id, :project_language_id, :private, :identifier) + Projects::UpdateForm.new(validate_params.merge(user_id: @project.user_id, project_identifier: @project.identifier, project_name: @project.name)).validate! - + private = @project.forked_from_project.present? ? !@project.forked_from_project.is_public : params[:private] || false new_project_params = project_params.except(:private).merge(is_public: !private) @@ -162,7 +163,7 @@ class ProjectsController < ApplicationController name: @project.identifier } gitea_repo = Gitea::Repository::UpdateService.call(@owner, @project&.repository&.identifier, gitea_params) - @project.repository.update_attributes({hidden: gitea_repo["private"], identifier: gitea_repo["name"]}) + @project.repository.update_attributes({ hidden: gitea_repo["private"], identifier: gitea_repo["name"] }) # 更新对应所属分类下的项目数量(私有) before_is_public = @project.previous_changes[:is_public].present? ? @project.previous_changes[:is_public][0] : @project.is_public after_is_public = @project.previous_changes[:is_public].present? ? @project.previous_changes[:is_public][1] : @project.is_public @@ -203,13 +204,13 @@ class ProjectsController < ApplicationController def quit user_is_admin = current_user.admin? || @project.manager?(current_user) - if !user_is_admin && @project.member(current_user.id) && @project.forge? + if !user_is_admin && @project.member(current_user.id) && @project.forge? ActiveRecord::Base.transaction do Projects::DeleteMemberInteractor.call(@project.owner, @project, current_user) SendTemplateMessageJob.perform_later('ProjectMemberLeft', current_user.id, current_user.id, @project.id) if Site.has_notice_menu? render_ok end - else + else render_forbidden('你不能退出该仓库') end rescue Exception => e @@ -273,7 +274,7 @@ class ProjectsController < ApplicationController if @project_detail.save! attachment_ids = Array(params[:attachment_ids]) logger.info "=============> #{Array(params[:attachment_ids])}" - @attachments = Attachment.where(id: attachment_ids) + @attachments = Attachment.where(id: attachment_ids) @attachments.update_all( container_id: @project_detail.id, container_type: @project_detail.model_name.name, @@ -286,6 +287,7 @@ class ProjectsController < ApplicationController private + def project_params params.permit(:user_id, :name, :description, :repository_name, :website, :lesson_url, :default_branch, :identifier, :project_category_id, :project_language_id, :license_id, :ignore_id, :private,