diff --git a/app/controllers/api/v1/projects/explore_code_controller.rb b/app/controllers/api/v1/projects/explore_code_controller.rb index 33831e64e..4006f8a51 100644 --- a/app/controllers/api/v1/projects/explore_code_controller.rb +++ b/app/controllers/api/v1/projects/explore_code_controller.rb @@ -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 \ No newline at end of file diff --git a/app/controllers/api/v1/users/code_controller.rb b/app/controllers/api/v1/users/code_controller.rb new file mode 100644 index 000000000..8c0343b56 --- /dev/null +++ b/app/controllers/api/v1/users/code_controller.rb @@ -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 \ No newline at end of file diff --git a/app/controllers/concerns/api/user_helper.rb b/app/controllers/concerns/api/user_helper.rb index 4c7b713fc..98db3f8e2 100644 --- a/app/controllers/concerns/api/user_helper.rb +++ b/app/controllers/concerns/api/user_helper.rb @@ -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" diff --git a/app/services/gitea/repository/get_code_service.rb b/app/services/gitea/repository/get_code_service.rb new file mode 100644 index 000000000..3acbb4e6e --- /dev/null +++ b/app/services/gitea/repository/get_code_service.rb @@ -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 diff --git a/app/services/gitea/repository/get_user_code_service.rb b/app/services/gitea/repository/get_user_code_service.rb new file mode 100644 index 000000000..f5cf28962 --- /dev/null +++ b/app/services/gitea/repository/get_user_code_service.rb @@ -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 diff --git a/app/views/api/v1/projects/explore_code/code.json.jbuilder b/app/views/api/v1/projects/explore_code/code.json.jbuilder new file mode 100644 index 000000000..e8e89b677 --- /dev/null +++ b/app/views/api/v1/projects/explore_code/code.json.jbuilder @@ -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 \ No newline at end of file diff --git a/app/views/api/v1/users/code/index.json.jbuilder b/app/views/api/v1/users/code/index.json.jbuilder new file mode 100644 index 000000000..3bf8c3e72 --- /dev/null +++ b/app/views/api/v1/users/code/index.json.jbuilder @@ -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 \ No newline at end of file diff --git a/config/routes/api.rb b/config/routes/api.rb index b942330a4..b4791ac2c 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -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