diff --git a/app/controllers/api/v1/base_controller.rb b/app/controllers/api/v1/base_controller.rb index d9db4b99c..38e10d5f5 100644 --- a/app/controllers/api/v1/base_controller.rb +++ b/app/controllers/api/v1/base_controller.rb @@ -37,6 +37,11 @@ class Api::V1::BaseController < ApplicationController params.fetch(:page, 1) end + def load_organization + @organization = Organization.find_by(login: params[:owner]) || Organization.find_by(id: params[:owner]) + return render_not_found("组织不存在") if @organization.nil? + end + # 具有对仓库的管理权限 def require_manager_above @project = load_project diff --git a/app/controllers/api/v1/organizations/sync_repositories_controller.rb b/app/controllers/api/v1/organizations/sync_repositories_controller.rb new file mode 100644 index 000000000..d02dcd40c --- /dev/null +++ b/app/controllers/api/v1/organizations/sync_repositories_controller.rb @@ -0,0 +1,42 @@ +class Api::V1::Organizations::SyncRepositoriesController < Api::V1::BaseController + before_action :load_organization, only: [:create] + + def create + return render_error("请输入正确的外部组织login") unless params[:external_login].present? + # 拉取外部组织仓库列表 + url = URI("https://api.github.com/orgs/#{params[:external_login]}/repos?page=#{params[:page]}&per_page=#{params[:limit]}") + https = Net::HTTP.new(url.host, url.port) + https.use_ssl = true + request = Net::HTTP::Get.new(url) + request["Authorization"] = "Bearer #{params[:external_token]}" + response = https.request(request) + if response.code == "200" + repos = JSON.parse(response.body) + repos.each do |repo| + # 检查是否已经存在该仓库 + @project = @organization.projects.find_by(identifier: repo["name"]) + if @project.present? + if @project.repository.mirror.failed? + @project.destroy! + mirror_params = {name: repo["name"], user_id: @organization.id, description: repo["description"], repository_name: repo["name"], auth_token: params[:external_token], clone_addr: repo["clone_url"]} + @project = ::Projects::MigrateService.call(current_user, mirror_params) + end + @project.update_column(:created_on, repo['created_at'].to_time) + @project.update_column(:updated_on, repo['updated_at'].to_time) + next + else + mirror_params = {name: repo["name"], user_id: @organization.id, description: repo["description"], repository_name: repo["name"], auth_token: params[:external_token], clone_addr: repo["clone_url"]} + @project = ::Projects::MigrateService.call(current_user, mirror_params) + @project.update_column(:created_on, repo['created_at'].to_time) + @project.update_column(:updated_on, repo['updated_at'].to_time) + end + end + end + end + + private + def sync_repository_params + params.permit(:external_token) + end + +end \ No newline at end of file diff --git a/app/views/api/pm/weekly_issues/personal_issues.json.jbuilder b/app/views/api/pm/weekly_issues/personal_issues.json.jbuilder index 6c2f67909..d4f89b375 100644 --- a/app/views/api/pm/weekly_issues/personal_issues.json.jbuilder +++ b/app/views/api/pm/weekly_issues/personal_issues.json.jbuilder @@ -3,6 +3,6 @@ json.this_week_all_issues @this_week_all_issues.each do |issue| end json.this_week_total_count @this_week_all_issues.total_count json.next_week_all_issues @next_week_all_issues.each do |issue| - json.partial! "api/pm/weekly_issues/simple_detail", locals: {issue: issue, weekly_begin_date: @weekly_begin_date+1.week, weekly_end_date: @weekly_end_date+1.week} + json.partial! "api/pm/weekly_issues/simple_detail", locals: {issue: issue, weekly_begin_date: @weekly_begin_date.to_date+1.week, weekly_end_date: @weekly_end_date.to_date+1.week} end json.next_week_total_count @next_week_all_issues.total_count \ No newline at end of file diff --git a/config/routes/api.rb b/config/routes/api.rb index 3d8c8b536..d66bedc50 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -83,6 +83,9 @@ defaults format: :json do patch :update_phone end end + scope module: :organizations do + resources :sync_repositories, only: [:create] + end scope module: :users do resources :projects, only: [:index] resources :feedbacks, only: [:create]