新增:组织仓库代码搜索功能

This commit is contained in:
yystopf 2025-09-03 14:27:43 +08:00
parent bf021a48de
commit f89188f1a0
8 changed files with 154 additions and 1 deletions

View File

@ -1,5 +1,6 @@
class Api::V1::Projects::ExploreCodeController < Api::V1::BaseController
before_action :require_login, only: [:index]
before_action :require_public_and_member_above, only: [:code]
def index
@page = params[:page].to_i || 1
@keyword = params[:keyword]
@ -9,4 +10,14 @@ class Api::V1::Projects::ExploreCodeController < Api::V1::BaseController
return render_error("请输入关键字") if @keyword.blank?
@result = Gitea::Repository::GetExploreCodeService.new(@user, @page, @keyword, @language, @query_type).call
end
def code
@page = params[:page].to_i || 1
@keyword = params[:keyword]
@language = params[:language]
@query_type = params[:query_type]
@user = current_user
return render_error("请输入关键字") if @keyword.blank?
@result = Gitea::Repository::GetCodeService.new(@project, @user, @page, @keyword, @language, @query_type).call
end
end

View File

@ -0,0 +1,14 @@
class Api::V1::Users::CodeController < Api::V1::BaseController
before_action :load_observe_user
before_action :require_login, only: [:index]
def index
@page = params[:page].to_i || 1
@keyword = params[:keyword]
@language = params[:language]
@query_type = params[:query_type]
@user = current_user
return render_error("请输入关键字") if @keyword.blank?
@result = Gitea::Repository::GetUserCodeService.new(@observe_user, @user, @page, @keyword, @language, @query_type).call
end
end

View File

@ -4,7 +4,7 @@ module Api::UserHelper
def load_observe_user
username = params[:owner]
@observe_user = User.find_by(login: username)
@observe_user = User.find_by(login: username) || Organization.find_by(login: username)
if @observe_user
logger.info "###########observe_user not founded"

View File

@ -0,0 +1,41 @@
class Gitea::Repository::GetCodeService < Gitea::ClientService
attr_reader :project, :user, :keyword, :language, :query_type, :page
def initialize(project, user, page, keyword, language=nil, query_type=nil)
@project = project
@user = user
@keyword = keyword
@language = language
@query_type = query_type
@page = page
@user = user
end
def call
response = get(url, params, true)
render_result(response)
end
private
def params
params = Hash.new.merge(token: user.gitea_token)
params.merge!(keyword: keyword) if keyword.present?
params.merge!(language: language) if language.present?
params.merge!(query_type: query_type) if query_type.present?
params.merge!(page: page) if page.present?
params
end
def url
"/repos/#{project&.owner&.login}/#{project&.identifier}/code".freeze
end
def render_result(response)
case response.status
when 200
{total_count: response.headers["x-total-count"], data: JSON.parse(response.body)}
else
nil
end
end
end

View File

@ -0,0 +1,41 @@
class Gitea::Repository::GetUserCodeService < Gitea::ClientService
attr_reader :observe_user, :user, :keyword, :language, :query_type, :page
def initialize(observe_user, user, page, keyword, language=nil, query_type=nil)
@observe_user = observe_user
@user = user
@keyword = keyword
@language = language
@query_type = query_type
@page = page
@user = user
end
def call
response = get(url, params, true)
render_result(response)
end
private
def params
params = Hash.new.merge(token: user.gitea_token)
params.merge!(keyword: keyword) if keyword.present?
params.merge!(language: language) if language.present?
params.merge!(query_type: query_type) if query_type.present?
params.merge!(page: page) if page.present?
params
end
def url
"/users/#{observe_user.login}/code".freeze
end
def render_result(response)
case response.status
when 200
{total_count: response.headers["x-total-count"], data: JSON.parse(response.body)}
else
nil
end
end
end

View File

@ -0,0 +1,22 @@
json.total_count @result[:total_count]
json.results @result[:data]["SearchResults"] do |repo|
project = Project.find_by(gpid: repo["RepoID"])
json.project do
if project.present?
json.partial! "api/v1/projects/detail", project: project
else
json.nil!
end
end
json.filename repo["Filename"]
json.language repo["Language"]
json.sha repo["Co mmitID"]
json.updated_unix repo["UpdatedUnix"]
json.line_numbers repo["LineNumbers"]
json.formatted_lines repo["FormattedLines"]
json.redirect_url Rails.application.config_for(:configuration)['platform_url'] + "/#{project&.owner&.login}/#{project&.identifier}/tree/#{repo["CommitID"][0...10]}/#{repo["Filename"]}" if project.present? && project.owner.present? && repo["CommitID"].present? && repo["Filename"].present?
end
json.language_results @result[:data]["SearchResultLanguages"] do |language|
json.language language["Language"]
json.count language["Count"]
end

View File

@ -0,0 +1,22 @@
json.total_count @result[:total_count]
json.results @result[:data]["SearchResults"] do |repo|
project = Project.find_by(gpid: repo["RepoID"])
json.project do
if project.present?
json.partial! "api/v1/projects/detail", project: project
else
json.nil!
end
end
json.filename repo["Filename"]
json.language repo["Language"]
json.sha repo["CommitID"]
json.updated_unix repo["UpdatedUnix"]
json.line_numbers repo["LineNumbers"]
json.formatted_lines repo["FormattedLines"]
json.redirect_url Rails.application.config_for(:configuration)['platform_url'] + "/#{project&.owner&.login}/#{project&.identifier}/tree/#{repo["CommitID"][0...10]}/#{repo["Filename"]}" if project.present? && project.owner.present? && repo["CommitID"].present? && repo["Filename"].present?
end
json.language_results @result[:data]["SearchResultLanguages"] do |language|
json.language language["Language"]
json.count language["Count"]
end

View File

@ -84,6 +84,7 @@ defaults format: :json do
end
end
scope module: :users do
resources :code, only: [:index]
resources :projects, only: [:index]
resources :feedbacks, only: [:create]
resources :home_top_settings, only: [:create] do
@ -258,6 +259,7 @@ defaults format: :json do
end
end
end
get '/code', to: 'projects/explore_code#code'
end
end