From 8f24f6582088aab66640efe204b965ad1212c968 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Fri, 8 Jan 2021 18:03:51 +0800 Subject: [PATCH 01/19] ADD gem 'sidekiq-cron' --- Gemfile | 1 + Gemfile.lock | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/Gemfile b/Gemfile index cd6c4b917..281dd705a 100644 --- a/Gemfile +++ b/Gemfile @@ -100,6 +100,7 @@ gem 'rails-i18n', '~> 5.1' # job gem 'sidekiq' gem 'sinatra' +gem "sidekiq-cron", "~> 1.1" # batch insert gem 'bulk_insert' diff --git a/Gemfile.lock b/Gemfile.lock index a6beea407..cbd598f59 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -118,12 +118,17 @@ GEM enumerize (2.3.1) activesupport (>= 3.2) erubi (1.9.0) + et-orbi (1.2.4) + tzinfo execjs (2.7.0) faraday (0.15.4) multipart-post (>= 1.2, < 3) ffi (1.12.2) font-awesome-sass (4.7.0) sass (>= 3.2) + fugit (1.4.1) + et-orbi (~> 1.1, >= 1.1.8) + raabro (~> 1.4) globalid (0.4.2) activesupport (>= 4.2.0) grape-entity (0.7.1) @@ -211,6 +216,7 @@ GEM prettier (0.18.2) public_suffix (4.0.3) puma (3.12.2) + raabro (1.4.0) rack (2.0.9) rack-cors (1.1.1) rack (>= 2.0.0) @@ -353,6 +359,9 @@ GEM rack (< 2.1.0) rack-protection (>= 1.5.0) redis (>= 3.3.5, < 5) + sidekiq-cron (1.2.0) + fugit (~> 1.1) + sidekiq (>= 4.2.1) simple_form (5.0.2) actionpack (>= 5.0) activemodel (>= 5.0) @@ -477,6 +486,7 @@ DEPENDENCIES searchkick selenium-webdriver sidekiq + sidekiq-cron (~> 1.1) simple_form simple_xlsx_reader sinatra From 8c6df359a5f27e0d02c28c04a000d17b0245ad9d Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Fri, 8 Jan 2021 18:07:48 +0800 Subject: [PATCH 02/19] ADD sync repo updated at time --- app/jobs/sync_repo_update_time_job.rb | 25 +++++++++++++++++++ app/models/project.rb | 5 ++++ .../gitea/repository/get_by_id_service.rb | 25 ++++++++++--------- config/initializers/sidekiq.rb | 5 ++++ config/routes.rb | 1 + config/schedule.yml | 5 ++++ 6 files changed, 54 insertions(+), 12 deletions(-) create mode 100644 app/jobs/sync_repo_update_time_job.rb create mode 100644 config/schedule.yml diff --git a/app/jobs/sync_repo_update_time_job.rb b/app/jobs/sync_repo_update_time_job.rb new file mode 100644 index 000000000..c2337ab94 --- /dev/null +++ b/app/jobs/sync_repo_update_time_job.rb @@ -0,0 +1,25 @@ +class SyncRepoUpdateTimeJob < ApplicationJob + queue_as :default + + def perform(*args) + # Do something later + Project.forge.find_each do |project| + update_repo_time!(project) + end + end + + private + def gitea_repo_updated_at(project) + admin = User.where(admin: true).select(:id, :gitea_token, :gitea_uid).last + + return nil if project.gpid.blank? + + result = Gitea::Repository::GetByIdService.call(project.gpid, admin.gitea_token) + + result[:status] === :success ? result[:body]['updated_at'] : nil + end + + def update_repo_time!(project) + project.set_updated_on gitea_repo_updated_at(project) + end +end diff --git a/app/models/project.rb b/app/models/project.rb index 887a6952c..190f37760 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -279,4 +279,9 @@ class Project < ApplicationRecord ps.increment!(:mirror_projects_count) unless ps.blank? end + def set_updated_on(time) + return if time.blank? + update_column(:updated_on, time) + end + end diff --git a/app/services/gitea/repository/get_by_id_service.rb b/app/services/gitea/repository/get_by_id_service.rb index c633c6b71..74f45708c 100644 --- a/app/services/gitea/repository/get_by_id_service.rb +++ b/app/services/gitea/repository/get_by_id_service.rb @@ -1,31 +1,32 @@ class Gitea::Repository::GetByIdService < Gitea::ClientService - attr_reader :owner, :repo_id + attr_reader :token, :id - def initialize(owner, repo_id) - @owner = owner - @repo_id = repo_id + def initialize(id, token=nil) + @token = token + @id = id end def call response = get(url, params) - render_result(response) + + status, message, body = render_response(response) + json_format(status, message, body) end private def params - Hash.new.merge(token: owner.gitea_token) + Hash.new.merge(token: token) end def url - "/repositories/#{repo_id}".freeze + "/repositories/#{id}".freeze end - def render_result(response) - case response.status - when 200 - JSON.parse(response.body) + def json_format(status, message, body) + case status + when 200 then success(body) else - nil + error(message, status) end end end diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb index b3f2d0576..79a0e296f 100644 --- a/config/initializers/sidekiq.rb +++ b/config/initializers/sidekiq.rb @@ -3,6 +3,11 @@ sidekiq_url = redis_config["url"] Sidekiq.configure_server do |config| config.redis = { url: sidekiq_url } + + schedule_file = "config/schedule.yml" + if File.exists?(schedule_file) + Sidekiq::Cron::Job.load_from_hash YAML.load_file(schedule_file) + end end Sidekiq.configure_client do |config| diff --git a/config/routes.rb b/config/routes.rb index c6282581b..f7b1edd77 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,6 +1,7 @@ Rails.application.routes.draw do require 'sidekiq/web' + require 'sidekiq/cron/web' require 'admin_constraint' # mount Sidekiq::Web => '/sidekiq', :constraints => AdminConstraint.new diff --git a/config/schedule.yml b/config/schedule.yml new file mode 100644 index 000000000..2b4269ac4 --- /dev/null +++ b/config/schedule.yml @@ -0,0 +1,5 @@ +sync_gitea_repo_updated_at: + # second minute hour day month date + cron: "0 0 24 * *" + class: "SyncRepoUpdateTimeJob" + queue: default From 2b140d6f7cc7a2153a32954f8270bef443474dae Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Tue, 12 Jan 2021 15:45:18 +0800 Subject: [PATCH 03/19] FIX pull request bug --- app/controllers/pull_requests_controller.rb | 24 +++++----- app/models/issue_status.rb | 7 +++ app/models/project_trend.rb | 3 ++ app/models/pull_request.rb | 14 +++++- .../gitea/pull_request/close_service.rb | 22 ++++++++++ .../gitea/pull_request/merge_service.rb | 7 +-- .../gitea/pull_request/open_service.rb | 22 ++++++++++ .../gitea/pull_request/update_service.rb | 44 +++++++++++++++---- app/services/pull_requests/close_service.rb | 33 ++++++++++++++ app/services/pull_requests/merge_service.rb | 36 +++++++++++++++ app/services/pull_requests/open_service.rb | 33 ++++++++++++++ 11 files changed, 219 insertions(+), 26 deletions(-) create mode 100644 app/services/gitea/pull_request/close_service.rb create mode 100644 app/services/gitea/pull_request/open_service.rb create mode 100644 app/services/pull_requests/close_service.rb create mode 100644 app/services/pull_requests/merge_service.rb create mode 100644 app/services/pull_requests/open_service.rb diff --git a/app/controllers/pull_requests_controller.rb b/app/controllers/pull_requests_controller.rb index 1699cf608..50e904565 100644 --- a/app/controllers/pull_requests_controller.rb +++ b/app/controllers/pull_requests_controller.rb @@ -87,8 +87,10 @@ class PullRequestsController < ApplicationController if @issue.update_attributes(@issue_params) if @pull_request.update_attributes(@local_params.compact) - gitea_request = Gitea::PullRequest::UpdateService.new(@project.owner, @repository.try(:identifier), @requests_params, @pull_request.try(:gpid)).call - if gitea_request + gitea_pull = Gitea::PullRequest::UpdateService.call(@owner.login, @repository.identifier, + @pull_request.gpid, @requests_params, current_user.gitea_token) + + if gitea_pull[:status] === :success if params[:issue_tag_ids].present? params[:issue_tag_ids].each do |tag| IssueTagsRelate.create(issue_id: @issue.id, issue_tag_id: tag) @@ -117,9 +119,8 @@ class PullRequestsController < ApplicationController def refuse_merge ActiveRecord::Base.transaction do begin - @pull_request.update(status: 2) - @pull_request.issue.update(status_id: 5) - normal_status(1, "已拒绝") + colsed = PullRequests::CloseService.call(@owner, @repository, @pull_request, current_user) + colsed === true ? normal_status(1, "已拒绝") : normal_status(-1, '合并失败') rescue => e normal_status(-1, e.message) raise ActiveRecord::Rollback @@ -145,15 +146,10 @@ class PullRequestsController < ApplicationController else ActiveRecord::Base.transaction do begin - requests_params = { - Do: params[:do], - MergeMessageField: params[:body], - MergeTitleField: params[:title] - } - merge_pr = Gitea::PullRequest::MergeService.call(current_user.gitea_token, @project.owner.login, - @repository.try(:identifier), @pull_request.try(:gpid), requests_params) - if @pull_request.update_attribute(:status, 1) && merge_pr[:status].to_i == 200 - @pull_request&.project_trends&.update_all(action_type: "close") + result = PullRequests::MergeService.call(@owner, @repository, @pull_request, current_user, params) + + if result && @pull_request.merge! + @pull_request.project_trend_status! @issue&.custom_journal_detail("merge", "", "该合并请求已被合并", current_user&.id) normal_status(1, "合并成功") else diff --git a/app/models/issue_status.rb b/app/models/issue_status.rb index a7ec34f8a..a58346ea7 100644 --- a/app/models/issue_status.rb +++ b/app/models/issue_status.rb @@ -17,6 +17,13 @@ # class IssueStatus < ApplicationRecord + ADD = 1 + SOLVING = 2 + SOLVED = 3 + FEEDBACK = 4 + CLOSED = 5 + REJECTED = 6 + has_many :issues belongs_to :project, optional: true end diff --git a/app/models/project_trend.rb b/app/models/project_trend.rb index 5858768b9..8c55c4f94 100644 --- a/app/models/project_trend.rb +++ b/app/models/project_trend.rb @@ -18,6 +18,9 @@ # class ProjectTrend < ApplicationRecord + CLOSE = 'close' + CREATE = 'create' + belongs_to :project belongs_to :trend, polymorphic: true, optional: true belongs_to :user diff --git a/app/models/pull_request.rb b/app/models/pull_request.rb index 046e9a0a4..cf057c3f2 100644 --- a/app/models/pull_request.rb +++ b/app/models/pull_request.rb @@ -24,7 +24,11 @@ # class PullRequest < ApplicationRecord - #status 0 默认未合并, 1表示合并, 2表示请求拒绝 + #status 0 默认未合并, 1表示合并, 2表示请求拒绝(或已关闭) + OPEN = 0 + MERGED = 1 + CLOSED = 2 + belongs_to :issue belongs_to :user belongs_to :project, :counter_cache => true @@ -42,6 +46,14 @@ class PullRequest < ApplicationRecord update_column(:gpid, gitea_pull_number) end + def merge! + update_column(:status, PullRequest::MERGED) + end + + def project_trend_status! + self&.project_trends&.update_all(action_type: ProjectTrend::CLOSE) + end + # TODO: sync educoder platform repo's for update some statistics count def self.update_some_count PullRequest.includes(:user, :project).select(:id, :user_id, :gpid, :project_id, :fork_project_id).each do |pr| diff --git a/app/services/gitea/pull_request/close_service.rb b/app/services/gitea/pull_request/close_service.rb new file mode 100644 index 000000000..aed5251b7 --- /dev/null +++ b/app/services/gitea/pull_request/close_service.rb @@ -0,0 +1,22 @@ +class Gitea::PullRequest::CloseService < Gitea::PullRequest::UpdateService + attr_reader :owner, :repo, :base, :number, :token + + # params: + # owner: owner of the repo + # repo: name of the repo + # base: branch name of base + # number: number of pull request + # token: token of gitea user + # eq: + # Gitea::PullRequest::CloseService.call(owner.login, repo.identifier, pull.gpid, pull.base, current_user.gitea_token) + def initialize(owner, repo, number, base,token=nil) + colse_pull_params = Hash.new.merge(base: base, state: 'closed').compact + + super(owner, repo, number, colse_pull_params, token) + end + + def call + super + end + +end diff --git a/app/services/gitea/pull_request/merge_service.rb b/app/services/gitea/pull_request/merge_service.rb index 2129bbeaf..c33c8781d 100644 --- a/app/services/gitea/pull_request/merge_service.rb +++ b/app/services/gitea/pull_request/merge_service.rb @@ -18,7 +18,9 @@ class Gitea::PullRequest::MergeService < Gitea::ClientService end def call - post(url, request_params) + response = post(url, request_params) + + render_200_no_body(response) end private @@ -27,7 +29,6 @@ class Gitea::PullRequest::MergeService < Gitea::ClientService end def request_params - Hash.new.merge(token: token, data: params) + Hash.new.merge(token: token, data: params.compact) end - end diff --git a/app/services/gitea/pull_request/open_service.rb b/app/services/gitea/pull_request/open_service.rb new file mode 100644 index 000000000..affdfe112 --- /dev/null +++ b/app/services/gitea/pull_request/open_service.rb @@ -0,0 +1,22 @@ +class Gitea::PullRequest::OpenService < Gitea::PullRequest::UpdateService + attr_reader :owner, :repo, :base, :number, :token + + # params: + # owner: owner of the repo + # repo: name of the repo + # base: branch name of base + # number: number of pull request + # token: token of gitea user + # eq: + # Gitea::PullRequest::OpenService.new(owner.login, repo.identifier, pr.gpid, pr.base, current_user.gitea_token) + def initialize(owner, repo, number, base, token=nil) + open_pull_params = Hash.new.merge(base: base, state: 'open').compact + + super(owner, repo, number, open_pull_params, token) + end + + def call + super + end + +end diff --git a/app/services/gitea/pull_request/update_service.rb b/app/services/gitea/pull_request/update_service.rb index a83afe40b..a68981f29 100644 --- a/app/services/gitea/pull_request/update_service.rb +++ b/app/services/gitea/pull_request/update_service.rb @@ -1,26 +1,54 @@ class Gitea::PullRequest::UpdateService < Gitea::ClientService - attr_reader :user, :repo, :params,:pull_request_id + attr_reader :owner, :repo, :params, :number, :token - - def initialize(user, repo, params,pull_request_id) - @user = user + # params: + # { + # "assignee": "string", + # "assignees": [ + # "string" + # ], + # "base": "string", + # "body": "string", + # "due_date": "2021-01-11T10:11:52.074Z", + # "labels": [ + # 0 + # ], + # "milestone": 0, + # "state": "string", + # "title": "string", + # "unset_due_date": true + # } + def initialize(owner, repo, number, params, token=nil) + @owner = owner @repo = repo @params = params - @pull_request_id = pull_request_id + @number = number + @token = token end def call - put(url, request_params) + response = patch(url, request_params) + + status, message, body = render_response(response) + json_format(status, message, body) end private def request_params - Hash.new.merge(token: @user.gitea_token, data: @params) + Hash.new.merge(token: token, data: @params) end def url - "/repos/#{@user.try(:login)}/#{@repo}/pulls/#{@pull_request_id}".freeze + "/repos/#{owner}/#{repo}/pulls/#{number}".freeze + end + + def json_format(status, message, body) + case status + when 201 then success(body) + else + error(message, status) + end end end diff --git a/app/services/pull_requests/close_service.rb b/app/services/pull_requests/close_service.rb new file mode 100644 index 000000000..e0ac19b4e --- /dev/null +++ b/app/services/pull_requests/close_service.rb @@ -0,0 +1,33 @@ +class PullRequests::CloseService < ApplicationService + attr_reader :owner, :repo, :pull, :current_user + + # eq: + # PullRequests::CloseService.call(owner, repo, pull, current_user) + def initialize(owner, repo, pull, current_user) + @owner = owner + @repo = repo + @pull = pull + @current_user = current_user + end + + def call + ActiveRecord::Base.transaction do + return false if close_gitea_pull[:status] != :success + + update_pull_status! + return true + end + end + + private + + def close_gitea_pull + Gitea::PullRequest::CloseService.call(@owner.login, @repo.identifier, + @pull.gpid, @pull.base, current_user.gitea_token) + end + + def update_pull_status! + @pull.update(status: PullRequest::CLOSED) + @pull.issue.update(status_id: IssueStatus::CLOSED) + end +end diff --git a/app/services/pull_requests/merge_service.rb b/app/services/pull_requests/merge_service.rb new file mode 100644 index 000000000..a20ee3aa9 --- /dev/null +++ b/app/services/pull_requests/merge_service.rb @@ -0,0 +1,36 @@ +class PullRequests::MergeService < ApplicationService + attr_reader :owner, :repo, :pull, :current_user, :params + + # eq: + # PullRequests::MergeService.call(owner, repo, pull, current_user, params) + def initialize(owner, repo, pull, current_user, params) + @owner = owner + @repo = repo + @pull = pull + @current_user = current_user + @params = params + end + + def call + ActiveRecord::Base.transaction do + gitea_pull_merge! + end + end + + private + + def gitea_pull_merge! + result = Gitea::PullRequest::MergeService.call(@current_user.gitea_token, @owner.login, + @repo.identifier, @pull.gpid, gitea_merge_pull_params) + + result[:status] === 200 ? true : false + end + + def gitea_merge_pull_params + { + Do: params[:do], + MergeMessageField: params[:body], + MergeTitleField: params[:title] + } + end +end diff --git a/app/services/pull_requests/open_service.rb b/app/services/pull_requests/open_service.rb new file mode 100644 index 000000000..3081e52b5 --- /dev/null +++ b/app/services/pull_requests/open_service.rb @@ -0,0 +1,33 @@ +class PullRequests::OpenService < ApplicationService + attr_reader :owner, :repo, :pull, :current_user + + # eq: + # PullRequests::OpenService.call(owner, repo, pull, current_user) + def initialize(owner, repo, pull, current_user) + @owner = owner + @repo = repo + @pull = pull + @current_user = current_user + end + + def call + ActiveRecord::Base.transaction do + return false if open_gitea_pull[:status] != :success + + update_pull_status! + return true + end + end + + private + + def open_gitea_pull + Gitea::PullRequest::OpenService.call(@owner.login, @repo.identifier, + @pull.gpid, @pull.base, @current_user.gitea_token) + end + + def update_pull_status! + @pull.update(status: PullRequest::OPEN) + @pull.issue.update(status_id: IssueStatus::SOLVING) + end +end From 4c2c3d17e263e402d12f9aa41761ae104b3230cc Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Tue, 12 Jan 2021 15:47:04 +0800 Subject: [PATCH 04/19] FIX base and head params problem for compare api --- app/controllers/compare_controller.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/compare_controller.rb b/app/controllers/compare_controller.rb index e5e61598e..0918b9d3b 100644 --- a/app/controllers/compare_controller.rb +++ b/app/controllers/compare_controller.rb @@ -6,9 +6,9 @@ class CompareController < ApplicationController end def show - base_ref = Addressable::URI.unescape(params[:base]) - @ref = head_ref = Addressable::URI.unescape(params[:head]&.split('.json')[0]) - @compare_result = Gitea::Repository::Commits::CompareService.call(@owner.login, @project.identifier, base_ref, head_ref) + base = Addressable::URI.unescape(params[:base]) + head = params[:head].include?('json') ? params[:head]&.split('.json')[0] : params[:head] + @compare_result = Gitea::Repository::Commits::CompareService.call(@owner.login, @project.identifier, head, base) # render json: @compare_result end From f084b72e3a0e2880a5531c4705efe30b6ea96d10 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Tue, 12 Jan 2021 15:55:11 +0800 Subject: [PATCH 05/19] FIX render json builder partil performance for pull some api --- app/views/compare/show.json.jbuilder | 76 ++++++++++++++++++++- app/views/pull_requests/files.json.jbuilder | 50 +++++++++++++- 2 files changed, 123 insertions(+), 3 deletions(-) diff --git a/app/views/compare/show.json.jbuilder b/app/views/compare/show.json.jbuilder index 8f95bbcb5..8257cc7fa 100644 --- a/app/views/compare/show.json.jbuilder +++ b/app/views/compare/show.json.jbuilder @@ -1,5 +1,29 @@ json.commits_count @compare_result['Commits']&.size -json.commits @compare_result['Commits'], partial: 'pull_requests/commit', as: :commit +# json.commits @compare_result['Commits'], partial: 'pull_requests/commit', as: :commit +json.commits do + json.array! @compare_result['Commits'] do |commit| + json.author do + # TODO: 获取头像地址待优化 + forge_user = User.includes(:user_extension).select(:id, :login).find_by(login: commit['Author']['Name']) + json.login commit['Author']['Name'] + json.name commit['Author']['Name'] + json.image_url forge_user.nil? ? '' : url_to_avatar(forge_user) + end + + json.committer do + # TODO: 获取头像地址待优化 + forge_user = User.includes(:user_extension).select(:id, :login).find_by(login: commit['Committer']['Name']) + json.login commit['Committer']['Name'] + json.name commit['Committer']['Name'] + json.image_url forge_user.nil? ? '' : url_to_avatar(forge_user) + end + json.timestamp render_unix_time(commit['Committer']['When']) + json.time_from_now time_from_now(commit['Committer']['When']) + json.created_at render_format_time_with_date(commit['Committer']['When']) + json.message commit['CommitMessage'] + json.sha commit['Sha'] + end +end json.diff do if @compare_result['Diff'].blank? @@ -8,6 +32,54 @@ json.diff do json.files_count @compare_result['Diff']['NumFiles'] json.total_addition @compare_result['Diff']['TotalAddition'] json.total_deletion @compare_result['Diff']['TotalDeletion'] - json.files @compare_result['Diff']['Files'], partial: 'pull_requests/diff_file', as: :file, locals: {sha: @compare_result['LatestSha']} + + # TODO: 解决render partil耗时间问题 + # json.files @compare_result['Diff']['Files'], partial: 'pull_requests/diff_file', as: :file, locals: {sha: @compare_result['LatestSha']} + json.files do + json.array! @compare_result['Diff']['Files'] do |file| + json.sha @compare_result['LatestSha'] + json.name file['Name'] + json.old_name file['OldName'] + json.index file['Index'] + json.addition file['Addition'] + json.deletion file['Deletion'] + json.type file['Type'] + json.isCreated file['IsCreated'] + json.isDeleted file['IsDeleted'] + json.isBin file['IsBin'] + json.isLFSFile file['IsLFSFile'] + json.isRenamed file['IsRenamed'] + json.isSubmodule file['IsSubmodule'] + json.isLFSFile file['IsLFSFile'] + json.sections do + json.array! file['Sections'] do |section| + json.fileName section['FileName'] + json.name section['Name'] + json.lines do + json.array! section['Lines'] do |line| + json.leftIdx line['LeftIdx'] + json.rightIdx line['RightIdx'] + json.type line['Type'] + json.content line['Content'] + json.sectionInfo do + if line['SectionInfo'].blank? + json.nil! + else + json.path line['SectionInfo']['Path'] + json.lastLeftIdx line['SectionInfo']['LastLeftIdx'] + json.lastRightIdx line['SectionInfo']['LastRightIdx'] + json.leftIdx line['SectionInfo']['LeftIdx'] + json.rightIdx line['SectionInfo']['RightIdx'] + json.leftHunkSize line['SectionInfo']['LeftHunkSize'] + json.rightHunkSize line['SectionInfo']['RightHunkSize'] + end + end + end + end + end + end + end + end + end end diff --git a/app/views/pull_requests/files.json.jbuilder b/app/views/pull_requests/files.json.jbuilder index b40fe6068..9708ba843 100644 --- a/app/views/pull_requests/files.json.jbuilder +++ b/app/views/pull_requests/files.json.jbuilder @@ -1,4 +1,52 @@ json.files_count @files_result['NumFiles'] json.total_addition @files_result['TotalAddition'] json.total_deletion @files_result['TotalDeletion'] -json.files @files_result['Files'], partial: 'diff_file', as: :file, locals: {sha: @files_result['LatestSha']} + +# TODO: 解决 render partil file性能问题 +# json.files @files_result['Files'], partial: 'diff_file', as: :file, locals: {sha: @files_result['LatestSha']} +json.files do + json.array! @files_result['Files'] do |file| + json.sha @files_result['LatestSha'] + json.name file['Name'] + json.old_name file['OldName'] + json.index file['Index'] + json.addition file['Addition'] + json.deletion file['Deletion'] + json.type file['Type'] + json.isCreated file['IsCreated'] + json.isDeleted file['IsDeleted'] + json.isBin file['IsBin'] + json.isLFSFile file['IsLFSFile'] + json.isRenamed file['IsRenamed'] + json.isSubmodule file['IsSubmodule'] + json.isLFSFile file['IsLFSFile'] + json.sections do + json.array! file['Sections'] do |section| + json.fileName section['FileName'] + json.name section['Name'] + json.lines do + json.array! section['Lines'] do |line| + json.leftIdx line['LeftIdx'] + json.rightIdx line['RightIdx'] + json.type line['Type'] + json.content line['Content'] + json.sectionInfo do + if line['SectionInfo'].blank? + json.nil! + else + json.path line['SectionInfo']['Path'] + json.lastLeftIdx line['SectionInfo']['LastLeftIdx'] + json.lastRightIdx line['SectionInfo']['LastRightIdx'] + json.leftIdx line['SectionInfo']['LeftIdx'] + json.rightIdx line['SectionInfo']['RightIdx'] + json.leftHunkSize line['SectionInfo']['LeftHunkSize'] + json.rightHunkSize line['SectionInfo']['RightHunkSize'] + end + end + end + end + end + end + end + +end From fa01194d3c013112b6548abc20bf71c7d14b2609 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Tue, 12 Jan 2021 17:34:07 +0800 Subject: [PATCH 06/19] FIX [api] get pull bug --- app/controllers/compare_controller.rb | 20 ++++++++++++++++++-- app/views/pull_requests/show.json.jbuilder | 1 + 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/app/controllers/compare_controller.rb b/app/controllers/compare_controller.rb index 0918b9d3b..63ca58aa6 100644 --- a/app/controllers/compare_controller.rb +++ b/app/controllers/compare_controller.rb @@ -6,10 +6,26 @@ class CompareController < ApplicationController end def show + compare + end + + private + def compare + base, head = compare_params + + # TODO: 处理fork的项目向源项目发送PR的base、head参数问题 + @compare_result ||= + head.include?(":") ? gitea_compare(base, head) : gitea_compare(head, base) + end + + def compare_params base = Addressable::URI.unescape(params[:base]) head = params[:head].include?('json') ? params[:head]&.split('.json')[0] : params[:head] - @compare_result = Gitea::Repository::Commits::CompareService.call(@owner.login, @project.identifier, head, base) - # render json: @compare_result + [base, head] + end + + def gitea_compare(base, head) + Gitea::Repository::Commits::CompareService.call(@owner.login, @project.identifier, base, head) end end diff --git a/app/views/pull_requests/show.json.jbuilder b/app/views/pull_requests/show.json.jbuilder index 61bbc9159..14dfefefc 100644 --- a/app/views/pull_requests/show.json.jbuilder +++ b/app/views/pull_requests/show.json.jbuilder @@ -1,5 +1,6 @@ json.partial! "commons/success" json.project_name @project.name +json.identifier @project.identifier json.pr_time time_from_now(@pull_request.updated_at) json.commits_count @pull_request.commits_count json.files_count @pull_request.files_count From f959b38a89b3859aaa8cf52e00dfcfe9791dac72 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Thu, 14 Jan 2021 17:04:58 +0800 Subject: [PATCH 07/19] FIX update cron --- config/schedule.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/config/schedule.yml b/config/schedule.yml index 2b4269ac4..c2def736a 100644 --- a/config/schedule.yml +++ b/config/schedule.yml @@ -1,5 +1,4 @@ sync_gitea_repo_updated_at: - # second minute hour day month date - cron: "0 0 24 * *" + cron: "0 0 * * * " class: "SyncRepoUpdateTimeJob" queue: default From 1e9bd451e59ab2589cce12f18fc99c40b0929ead Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Thu, 14 Jan 2021 18:22:01 +0800 Subject: [PATCH 08/19] FIX updage sidekiq cron --- config/initializers/sidekiq.rb | 4 ++-- config/schedule.yml | 4 ---- config/sidekiq_cron.yml | 5 +++++ 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 config/schedule.yml create mode 100644 config/sidekiq_cron.yml diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb index 79a0e296f..d66225711 100644 --- a/config/initializers/sidekiq.rb +++ b/config/initializers/sidekiq.rb @@ -1,10 +1,10 @@ redis_config = Rails.application.config_for(:redis) -sidekiq_url = redis_config["url"] +sidekiq_url = redis_config["url"] || 'redis://localhost:6379/0' Sidekiq.configure_server do |config| config.redis = { url: sidekiq_url } - schedule_file = "config/schedule.yml" + schedule_file = "config/sidekiq_cron.yml" if File.exists?(schedule_file) Sidekiq::Cron::Job.load_from_hash YAML.load_file(schedule_file) end diff --git a/config/schedule.yml b/config/schedule.yml deleted file mode 100644 index c2def736a..000000000 --- a/config/schedule.yml +++ /dev/null @@ -1,4 +0,0 @@ -sync_gitea_repo_updated_at: - cron: "0 0 * * * " - class: "SyncRepoUpdateTimeJob" - queue: default diff --git a/config/sidekiq_cron.yml b/config/sidekiq_cron.yml new file mode 100644 index 000000000..5a7f530f9 --- /dev/null +++ b/config/sidekiq_cron.yml @@ -0,0 +1,5 @@ +sync_gitea_repo_update_time: + cron: "0 0 * * * " + class: "SyncRepoUpdateTimeJob" + queue: default + description: 'sync gitea repo update time From 0e8d475de799bcf25533a4a6a1df9de89731b2b8 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Thu, 14 Jan 2021 18:25:49 +0800 Subject: [PATCH 09/19] FIX code bug --- config/sidekiq_cron.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/sidekiq_cron.yml b/config/sidekiq_cron.yml index 5a7f530f9..35463673e 100644 --- a/config/sidekiq_cron.yml +++ b/config/sidekiq_cron.yml @@ -1,5 +1,5 @@ sync_gitea_repo_update_time: - cron: "0 0 * * * " + cron: "0 0 * * *" class: "SyncRepoUpdateTimeJob" queue: default description: 'sync gitea repo update time From 2253dce4d734d0b1ac8b486e0006b4cfad8ff76d Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Thu, 14 Jan 2021 18:39:12 +0800 Subject: [PATCH 10/19] FIX sidekiq cron config yml bug --- config/sidekiq_cron.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/config/sidekiq_cron.yml b/config/sidekiq_cron.yml index 35463673e..3e807fa10 100644 --- a/config/sidekiq_cron.yml +++ b/config/sidekiq_cron.yml @@ -2,4 +2,3 @@ sync_gitea_repo_update_time: cron: "0 0 * * *" class: "SyncRepoUpdateTimeJob" queue: default - description: 'sync gitea repo update time From 232f26ea3bf12aaca4b20e664ef72161392d87c5 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Fri, 15 Jan 2021 15:38:49 +0800 Subject: [PATCH 11/19] ADD get readme api --- api_document.md | 43 +++++++++++++++++++ app/controllers/repositories_controller.rb | 7 +++ .../gitea/repository/readme/get_service.rb | 39 +++++++++++++++++ config/routes.rb | 1 + 4 files changed, 90 insertions(+) create mode 100644 app/services/gitea/repository/readme/get_service.rb diff --git a/api_document.md b/api_document.md index 50a45573c..0f9b401bb 100644 --- a/api_document.md +++ b/api_document.md @@ -3062,6 +3062,49 @@ http://localhost:3000/api/trustie/truesite/protected_branches/master.json | jq ``` --- +#### 获取仓库README文件 +``` +GET api/:owner/:repo/readme +``` +*示例* +```bash +curl -X GET http://localhost:3000/api/trusite/trusite/readme | jq +``` + +*请求参数说明:* + +|参数名|类型|说明| +|-|-|-| +|owner |是|string |项目拥有者登录名 | +|repo |否|boolean |仓库名称 | +|ref |否|string |分支、tag或commit。默认: 仓库的默认分支(通常是master)| + + +*返回参数说明:* + +|参数名|类型|说明| +|-|-|-| +|name |string|文件名称| +|path |string|文件相对路径| +|type |string|文件类型, file:文件| +|size |int|文件大小 单位KB| +|content |string|文件内容,base64加密| + +返回值 +```json +{ + "type": "file", + "encoding": "base64", + "size": 13544, + "name": "README.md", + "path": "README.md", + "content": "Q2hpbmVzZSAmbmJzcDsgfCAmbmJzcDsgW0VuZ7i9yZWFkbWUvaW5kZXgucG5" +} +``` +--- + + + ### DevOps相关api --- diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index b4d142282..0c1558891 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -133,6 +133,13 @@ class RepositoriesController < ApplicationController render_ok end + def readme + result = Gitea::Repository::Readme::GetService.call(@owner.login, @repository.identifier, params[:ref], current_user&.gitea_token) + + @readme = result[:status] === :success ? result[:body] : nil + render json: @readme + end + private def find_project diff --git a/app/services/gitea/repository/readme/get_service.rb b/app/services/gitea/repository/readme/get_service.rb new file mode 100644 index 000000000..48e2d4475 --- /dev/null +++ b/app/services/gitea/repository/readme/get_service.rb @@ -0,0 +1,39 @@ +# Gets the preferred README for a repository. +class Gitea::Repository::Readme::GetService < Gitea::ClientService + attr_reader :owner, :repo, :ref, :token + + # owner: owner of the repo + # repo: name of the repo + # name: The name of the commit/branch/tag. Default: the repository’s default branch (usually master) + # eg: + # Gitea::Repository::Readme::GetService.call(user.login, repo.identifier, ref, user.gitea_token) + def initialize(owner, repo, ref, token=nil) + @owner = owner + @repo = repo + @ref = ref || 'master' + @token = token + end + + def call + response = get(url, params) + status, message, body = render_response(response) + json_format(status, message, body) + end + + private + def params + Hash.new.merge(token: token, ref: ref) + end + + def url + "/repos/#{owner}/#{repo}/readme".freeze + end + + def json_format(status, message, body) + case status + when 200 then success(body) + when 404 then error(message, 404) + else error(message, status) + end + end +end diff --git a/config/routes.rb b/config/routes.rb index f7b1edd77..30145bec1 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -327,6 +327,7 @@ Rails.application.routes.draw do post :sync_mirror get :top_counts get 'commits/:sha', to: 'repositories#commit', as: 'commit' + get 'readme' end end From 30138cc1fac6f70fb9dd2e4a84d933bb420ba2ab Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Fri, 15 Jan 2021 18:36:19 +0800 Subject: [PATCH 12/19] FIX get readme file bug --- app/helpers/repositories_helper.rb | 17 ++++++++++++++--- .../repositories/_simple_entry.json.jbuilder | 5 +++-- app/views/repositories/entries.json.jbuilder | 13 ++----------- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb index 10ad1377e..07646c07a 100644 --- a/app/helpers/repositories_helper.rb +++ b/app/helpers/repositories_helper.rb @@ -11,7 +11,7 @@ module RepositoriesHelper end def download_type(str) - default_type = %w(xlsx xls ppt pptx pdf zip 7z rar exe pdb obj idb png jpg gif tif psd svg RData rdata doc docx mpp vsdx) + default_type = %w(xlsx xls ppt pptx pdf zip 7z rar exe pdb obj idb png jpg gif tif psd svg RData rdata doc docx mpp vsdx dot) default_type.include?(str&.downcase) end @@ -20,8 +20,8 @@ module RepositoriesHelper default_type.include?(str&.downcase) end - def is_readme_type?(str) - return false if str.blank? + def is_readme?(type, str) + return false if type != 'file' || str.blank? readme_types = ["readme.md", "readme", "readme_en.md", "readme_zh.md", "readme_en", "readme_zh"] readme_types.include?(str.to_s.downcase) end @@ -72,4 +72,15 @@ module RepositoriesHelper def render_format_time_with_date(date) date.to_time.strftime("%Y-%m-%d %H:%M") end + + def decode64_content(entry, owner, repo, ref, path=nil) + if is_readme?(entry['type'], entry['name']) + content = Gitea::Repository::Entries::GetService.call(owner, repo.identifier, entry['path'], ref: ref)['content'] + readme_render_decode64_content(content, path) + else + file_type = entry['name'].to_s.split(".").last + return entry['content'] if download_type(file_type) + render_decode64_content(entry['content']) + end + end end diff --git a/app/views/repositories/_simple_entry.json.jbuilder b/app/views/repositories/_simple_entry.json.jbuilder index ab9910dd1..1e8e001af 100644 --- a/app/views/repositories/_simple_entry.json.jbuilder +++ b/app/views/repositories/_simple_entry.json.jbuilder @@ -8,12 +8,13 @@ if @project.forge? json.path entry['path'] json.type entry['type'] json.size entry['size'] - json.content entry['content'].present? && !direct_download ? render_decode64_content(entry['content']) : "" + + json.content decode64_content(entry, @owner, @repository, @ref) json.target entry['target'] json.download_url entry['download_url'] json.direct_download direct_download json.image_type image_type - json.is_readme_file is_readme_type?(file_name) + json.is_readme_file is_readme?(entry['type'], entry['name']) if entry['latest_commit'] if entry['type'] != 'file' json.partial! 'last_commit', entry: entry diff --git a/app/views/repositories/entries.json.jbuilder b/app/views/repositories/entries.json.jbuilder index 20fecec32..ca041fd53 100644 --- a/app/views/repositories/entries.json.jbuilder +++ b/app/views/repositories/entries.json.jbuilder @@ -51,17 +51,8 @@ if @project.forge? json.sha entry['sha'] json.type entry['type'] json.size entry['size'] - content = - if is_readme_type?(entry['name']) - is_readme_file = true - content = Gitea::Repository::Entries::GetService.call(@owner, @project.identifier, entry['name'], ref: @ref)['content'] - readme_render_decode64_content(content, @path) - else - is_readme_file = false - entry['content'] - end - json.is_readme_file is_readme_file - json.content content + json.is_readme_file is_readme?(entry['type'], entry['name']) + json.content decode64_content(entry, @owner, @repository, @ref, @path) json.target entry['target'] if entry['latest_commit'] json.partial! 'last_commit', entry: entry From 36a3e36edb21fe6cb0d0af143a965649f18e8fa1 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Fri, 15 Jan 2021 18:38:53 +0800 Subject: [PATCH 13/19] FIX pull api bug --- app/controllers/pull_requests_controller.rb | 4 ++-- app/services/gitea/pull_request/commits_service.rb | 2 +- app/views/pull_requests/show.json.jbuilder | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/controllers/pull_requests_controller.rb b/app/controllers/pull_requests_controller.rb index 50e904565..145194759 100644 --- a/app/controllers/pull_requests_controller.rb +++ b/app/controllers/pull_requests_controller.rb @@ -187,12 +187,12 @@ class PullRequestsController < ApplicationController def files - @files_result = Gitea::PullRequest::FilesService.call(@owner.login, @project.identifier, @pull_request.gpid) + @files_result = Gitea::PullRequest::FilesService.call(@owner.login, @project.identifier, @pull_request.gpid, current_user&.gitea_token) # render json: @files_result end def commits - @commits_result = Gitea::PullRequest::CommitsService.call(@owner.login, @project.identifier, @pull_request.gpid) + @commits_result = Gitea::PullRequest::CommitsService.call(@owner.login, @project.identifier, @pull_request.gpid, current_user&.gitea_token) # render json: @commits_result end diff --git a/app/services/gitea/pull_request/commits_service.rb b/app/services/gitea/pull_request/commits_service.rb index aca2067cc..dc2877eba 100644 --- a/app/services/gitea/pull_request/commits_service.rb +++ b/app/services/gitea/pull_request/commits_service.rb @@ -22,7 +22,7 @@ class Gitea::PullRequest::CommitsService < Gitea::ClientService private def params - Hash.new.merge(token: owner) + Hash.new.merge(token: token) end def url diff --git a/app/views/pull_requests/show.json.jbuilder b/app/views/pull_requests/show.json.jbuilder index 14dfefefc..c3f781f73 100644 --- a/app/views/pull_requests/show.json.jbuilder +++ b/app/views/pull_requests/show.json.jbuilder @@ -1,6 +1,7 @@ json.partial! "commons/success" json.project_name @project.name json.identifier @project.identifier +json.project_identifier @project.identifier json.pr_time time_from_now(@pull_request.updated_at) json.commits_count @pull_request.commits_count json.files_count @pull_request.files_count @@ -10,6 +11,7 @@ json.pull_request do json.extract! @pull_request, :id,:base, :head, :status,:fork_project_id, :is_original json.pull_request_staus @pull_request.status == 1 ? "merged" : (@pull_request.status == 2 ? "closed" : "open") json.fork_project_user @pull_request&.fork_project&.owner.try(:login) + json.create_user @pull_request&.user&.login end json.issue do From 0f338ede7d94e0b1d73e7831628c3888987ce507 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Mon, 18 Jan 2021 09:51:07 +0800 Subject: [PATCH 14/19] Update api document --- api_document.md | 41 ++++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/api_document.md b/api_document.md index 0f9b401bb..e0ad573bf 100644 --- a/api_document.md +++ b/api_document.md @@ -450,7 +450,7 @@ curl -X POST http://localhost:3000/api/repositories/1244/sync_mirror | jq #### 项目详情 ``` -GET /api/:namespace_id/:id +GET /api/:owner/:repo ``` *示例* ```bash @@ -460,8 +460,8 @@ curl -X GET http://localhost:3000/api/jasder/jasder_test | jq |参数名|必选|类型|说明| |-|-|-|-| -|namespace_id |是|string |用户登录名 | -|id |是|string |项目标识identifier | +|owner |是|string |用户登录名 | +|repo |是|string |项目标识identifier | *返回参数说明:* @@ -492,7 +492,7 @@ curl -X GET http://localhost:3000/api/jasder/jasder_test | jq #### 项目详情(简版) ``` -GET /api/:namespace_id/:id/simple +GET /api/:owner/:repo/simple ``` *示例* ```bash @@ -502,7 +502,8 @@ curl -X GET http://localhost:3000/api/jasder/jasder_test/simple | jq |参数名|必选|类型|说明| |-|-|-|-| -|id |是|int |项目id | +|owner |是|string |用户登录名 | +|repo |是|string |项目标识identifier | *返回参数说明:* @@ -862,7 +863,7 @@ curl -X POST http://localhost:3000/api/projects/3297/forks | jq #### 获取代码目录列表 ``` -POST /api/:namespace_id/:project_id/repository/entries +POST /api/:owner/:repo/repository/entries ``` *示例* ```bash @@ -874,7 +875,8 @@ http://localhost:3000//api/jasder/jasder_test/repository/entries | jq |参数名|必选|类型|说明| |-|-|-|-| -|id |是|int |项目id | +|owner |是|string |用户登录名 | +|repo |是|string |项目标识identifier | |ref |否|string |分支名称、tag名称或是提交记录id,默认为master分支 | @@ -1344,7 +1346,7 @@ http://localhost:3000/api/projects/recommend | jq #### 项目主页 ``` -GET api/:namespace_id/:id/about +GET api/:owner/:repo/about ``` *示例* @@ -1357,8 +1359,8 @@ http://localhost:3000/api/:jason/forgeplus/about | jq |参数名|必选|类型|说明| |-|-|-|-| -|namespace_id |是|string |用户登录名 | -|id |是|string |项目标识identifier | +|owner |是|string |用户登录名 | +|repo |是|string |项目标识identifier | *返回参数说明:* @@ -1385,7 +1387,7 @@ http://localhost:3000/api/:jason/forgeplus/about | jq #### 修改项目主页内容 ``` -POST api/:namespace_id/:id/about +POST api/:owner/:repo/about ``` *示例* @@ -1393,15 +1395,15 @@ POST api/:namespace_id/:id/about curl -X POST \ -d "content=内容" \ -d "attachment_ids=[1, 2, 2]" \ -http://localhost:3000/api/:jasder/forgeplus/about | jq +http://localhost:3000/api/jasder/forgeplus/about | jq ``` *请求参数说明:* |参数名|必选|类型|说明| |-|-|-|-| -|namespace_id |是|string |用户登录名 | -|id |是|string |项目标识identifier | +|owner |是|string |用户登录名 | +|repo |是|string |项目标识identifier | |content |是|string |内容信息 | |attachment_ids |是|array |附件id | @@ -1429,7 +1431,7 @@ http://localhost:3000/api/:jasder/forgeplus/about | jq ### 获取分支列表 ``` -GET /api/:namespace_id/:id/branches +GET /api/:owner/:repo/branches ``` *示例* ```bash @@ -1439,7 +1441,8 @@ curl -X GET http://localhost:3000/api/jasder/jasder_test/branches | jq |参数名|必选|类型|说明| |-|-|-|-| -|id |是|id |项目id | +|owner |是|string |用户登录名 | +|repo |是|string |项目标识identifier | *返回参数说明:* @@ -1596,7 +1599,7 @@ http://localhost:3000/api/repositories/5836/tags.json | jq ## 仓库详情 ``` -GET /api/:namespace_id/:project_id/repository +GET /api/:owner/:repo/repository ``` *示例* ```bash @@ -1607,8 +1610,8 @@ http://192.168.2.230:3000/api/jasder/forgeplus/repository | jq |参数名|必选|类型|说明| |-|-|-|-| -|namespace_id |是|string |用户登录名 | -|project_id |是|string |项目标识identifier | +|owner |是|string |用户登录名 | +|repo |是|string |项目标识identifier | *返回参数说明:* From e7662b66ce6b8bf2886da541c54d9264167d7efa Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Mon, 18 Jan 2021 11:22:31 +0800 Subject: [PATCH 15/19] FIX deal with gitea api response body bug --- app/services/gitea/client_service.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/services/gitea/client_service.rb b/app/services/gitea/client_service.rb index 728a98098..1e9de823c 100644 --- a/app/services/gitea/client_service.rb +++ b/app/services/gitea/client_service.rb @@ -178,8 +178,10 @@ class Gitea::ClientService < ApplicationService def get_body_by_status(status, body) body, message = case status + when 401 then [nil, "401"] when 404 then [nil, "404"] when 403 then [nil, "403"] + when 500 then [nil, "500"] else if body.present? body = JSON.parse(body) @@ -198,7 +200,7 @@ class Gitea::ClientService < ApplicationService end def fix_body(body) - return [body, nil] if body.is_a? Array + return [body, nil] if body.is_a?(Array) || body.is_a?(Hash) body['message'].blank? ? [body, nil] : [nil, body['message']] end From e9223c53dec8180ab96ae6cc5d641808c649c59a Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Mon, 18 Jan 2021 15:28:20 +0800 Subject: [PATCH 16/19] FIX get assignees bug in issues --- app/models/project.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/project.rb b/app/models/project.rb index 190f37760..4b9e72e19 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -123,7 +123,7 @@ class Project < ApplicationRecord end def members_user_infos - members.joins(:roles).where("roles.name in ('Manager', 'Developer')").joins("left join users on members.user_id = users.id ").includes(:user).where("users.type = ?", "User") + members.joins(:roles).where("roles.name in ('Manager', 'Developer', 'Reporter')").joins("left join users on members.user_id = users.id ").includes(:user).where("users.type = ?", "User") # members.joins("left join users on members.user_id = users.id").select("users.id", "users.login","users.firstname","users.lastname") # .pluck("users.id", "users.login","users.lastname", "users.firstname") end From efa99e0f0633dd24871ae5fa6868d3d3e53c9d0a Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Tue, 19 Jan 2021 16:21:31 +0800 Subject: [PATCH 17/19] ADD repository languages percentage api --- api_document.md | 29 ++++++++++++++ .../repository/languages_percentagable.rb | 19 +++++++++ app/controllers/repositories_controller.rb | 5 +++ .../repository/languages/list_service.rb | 39 +++++++++++++++++++ config/routes.rb | 1 + 5 files changed, 93 insertions(+) create mode 100644 app/controllers/concerns/repository/languages_percentagable.rb create mode 100644 app/services/gitea/repository/languages/list_service.rb diff --git a/api_document.md b/api_document.md index e0ad573bf..a41eecb14 100644 --- a/api_document.md +++ b/api_document.md @@ -3106,6 +3106,35 @@ curl -X GET http://localhost:3000/api/trusite/trusite/readme | jq ``` --- +#### 获取仓库仓库的语言百分占比 +``` +GET api/:owner/:repo/languages +``` +*示例* +```bash +curl -X GET http://localhost:3000/api/jasder/trusite/languages | jq +``` + +*请求参数说明:* + +|参数名|类型|说明| +|-|-|-| +|owner |是|string |项目拥有者登录名 | +|repo |否|boolean |仓库名称 | + + +返回值 +```json +{ + "JavaScript": "90.2%", + "CSS": "6.1%", + "Java": "2.9%", + "HTML": "0.8%" +} +``` +--- + + ### DevOps相关api diff --git a/app/controllers/concerns/repository/languages_percentagable.rb b/app/controllers/concerns/repository/languages_percentagable.rb new file mode 100644 index 000000000..620d93bf9 --- /dev/null +++ b/app/controllers/concerns/repository/languages_percentagable.rb @@ -0,0 +1,19 @@ +module Repository::LanguagesPercentagable + extend ActiveSupport::Concern + + def languages_precentagable + result = Gitea::Repository::Languages::ListService.call(@owner.login, + @repository.identifier, current_user&.gitea_token) + + result[:status] === :success ? hash_transform_precentagable(result[:body]) : nil + end + + # hash eq:{"JavaScript": 301681522,"Ruby": 1444004,"Roff": 578781} + def hash_transform_precentagable(hash) + total_byte_size = hash.values.sum + hash.transform_values { |v| + ActionController::Base.helpers + .number_to_percentage((v * 100.0 / total_byte_size), precision: 1) + } + end +end diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index 0c1558891..812b95d5f 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -1,6 +1,7 @@ class RepositoriesController < ApplicationController include ApplicationHelper include OperateProjectAbilityAble + include Repository::LanguagesPercentagable before_action :require_login, only: %i[edit update create_file update_file delete_file sync_mirror] before_action :load_repository @@ -140,6 +141,10 @@ class RepositoriesController < ApplicationController render json: @readme end + def languages + render json: languages_precentagable + end + private def find_project diff --git a/app/services/gitea/repository/languages/list_service.rb b/app/services/gitea/repository/languages/list_service.rb new file mode 100644 index 000000000..88d5dcbed --- /dev/null +++ b/app/services/gitea/repository/languages/list_service.rb @@ -0,0 +1,39 @@ +# Get languages and number of bytes of code written +class Gitea::Repository::Languages::ListService < Gitea::ClientService + attr_reader :owner, :repo, :token + + # owner: owner of the repo + # repo: the name of repository + # token: token of gitea user + # eq: Gitea::Repository::Languages::ListService.call(@owner.identifier, + # @project.identifier, current_user&.gitea_token) + def initialize(owner, repo, token) + @owner = owner + @repo = repo + @args = token + end + + def call + response = get(url, params) + + status, message, body = render_response(response) + json_format(status, message, body) + end + + private + def params + {}.merge(token: token) + end + + def url + "/repos/#{owner}/#{repo}/languages".freeze + end + + def json_format(status, message, body) + case status + when 200 then success(body) + else + error(message, status) + end + end +end diff --git a/config/routes.rb b/config/routes.rb index 30145bec1..f2aa0a62a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -328,6 +328,7 @@ Rails.application.routes.draw do get :top_counts get 'commits/:sha', to: 'repositories#commit', as: 'commit' get 'readme' + get 'languages' end end From f3d4f437cbd2c60d5159fe705fd55a07e2fa2d91 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Wed, 20 Jan 2021 09:38:11 +0800 Subject: [PATCH 18/19] ADD sync repo time print log --- api_document.md | 2 +- app/jobs/sync_repo_update_time_job.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/api_document.md b/api_document.md index a41eecb14..4a30f6d05 100644 --- a/api_document.md +++ b/api_document.md @@ -3106,7 +3106,7 @@ curl -X GET http://localhost:3000/api/trusite/trusite/readme | jq ``` --- -#### 获取仓库仓库的语言百分占比 +#### 获库仓库的语言百分占比 ``` GET api/:owner/:repo/languages ``` diff --git a/app/jobs/sync_repo_update_time_job.rb b/app/jobs/sync_repo_update_time_job.rb index c2337ab94..4391f2c13 100644 --- a/app/jobs/sync_repo_update_time_job.rb +++ b/app/jobs/sync_repo_update_time_job.rb @@ -11,9 +11,9 @@ class SyncRepoUpdateTimeJob < ApplicationJob private def gitea_repo_updated_at(project) admin = User.where(admin: true).select(:id, :gitea_token, :gitea_uid).last + puts "########## project id: #{project.id}" return nil if project.gpid.blank? - result = Gitea::Repository::GetByIdService.call(project.gpid, admin.gitea_token) result[:status] === :success ? result[:body]['updated_at'] : nil From b7e23a62d0f7fd340d3a2c0582e29a4c6871fc87 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Wed, 20 Jan 2021 14:25:07 +0800 Subject: [PATCH 19/19] FIX get latest commit bug --- .../repositories/_last_commit.json.jbuilder | 14 ++++++++------ .../repositories/_simple_entry.json.jbuilder | 17 ++++++++--------- app/views/repositories/entries.json.jbuilder | 4 ++-- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/app/views/repositories/_last_commit.json.jbuilder b/app/views/repositories/_last_commit.json.jbuilder index 3c2184637..0c3127384 100644 --- a/app/views/repositories/_last_commit.json.jbuilder +++ b/app/views/repositories/_last_commit.json.jbuilder @@ -1,7 +1,9 @@ -json.commit do - json.message entry['latest_commit']['message'] - json.sha entry['latest_commit']['sha'] - json.created_at render_format_time_with_unix(entry['latest_commit']['created_at'].to_i) - json.time_from_now time_from_now(render_format_time_with_unix(entry['latest_commit']['created_at'].to_i)) - json.created_at_unix entry['latest_commit']['created_at'] +if latest_commit.blank? + json.nil! +else + json.message latest_commit['message'] + json.sha latest_commit['sha'] + json.created_at render_format_time_with_unix(latest_commit['created_at'].to_i) + json.time_from_now time_from_now(render_format_time_with_unix(latest_commit['created_at'].to_i)) + json.created_at_unix latest_commit['created_at'] end diff --git a/app/views/repositories/_simple_entry.json.jbuilder b/app/views/repositories/_simple_entry.json.jbuilder index 1e8e001af..ec2a045bb 100644 --- a/app/views/repositories/_simple_entry.json.jbuilder +++ b/app/views/repositories/_simple_entry.json.jbuilder @@ -15,12 +15,8 @@ if @project.forge? json.direct_download direct_download json.image_type image_type json.is_readme_file is_readme?(entry['type'], entry['name']) - if entry['latest_commit'] - if entry['type'] != 'file' - json.partial! 'last_commit', entry: entry - else - json.commit nil - end + json.commit do + json.partial! 'last_commit', latest_commit: entry['latest_commit'] end end @@ -38,8 +34,11 @@ if @project.educoder? json.direct_download false json.image_type false json.is_readme_file false - if entry['latest_commit'] - # json.partial! 'last_commit', entry: entry - json.partial! 'repositories/simple_entry', locals: { entry: entry } + json.commit do + json.message entry['title'] + json.time_from_now entry['time'] + json.sha nil + json.created_at_unix nil + json.created_at nil end end diff --git a/app/views/repositories/entries.json.jbuilder b/app/views/repositories/entries.json.jbuilder index ca041fd53..9efa0c113 100644 --- a/app/views/repositories/entries.json.jbuilder +++ b/app/views/repositories/entries.json.jbuilder @@ -54,8 +54,8 @@ if @project.forge? json.is_readme_file is_readme?(entry['type'], entry['name']) json.content decode64_content(entry, @owner, @repository, @ref, @path) json.target entry['target'] - if entry['latest_commit'] - json.partial! 'last_commit', entry: entry + json.commit do + json.partial! 'last_commit', latest_commit: entry['latest_commit'] end end end