From ea82a52b7bc2dede2ff93a1a3680f6ed1a00a2f9 Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Mon, 21 Jun 2021 14:45:41 +0800 Subject: [PATCH 01/49] fix: version issues count --- app/controllers/versions_controller.rb | 27 ++++++++++++++++++++------ app/views/versions/index.json.jbuilder | 4 ++-- app/views/versions/show.json.jbuilder | 6 +++--- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/app/controllers/versions_controller.rb b/app/controllers/versions_controller.rb index f5d09ed3b..34ad64120 100644 --- a/app/controllers/versions_controller.rb +++ b/app/controllers/versions_controller.rb @@ -31,11 +31,7 @@ class VersionsController < ApplicationController # @close_issues_size = version_issues.where(status_id: 5).size # @open_issues_size = version_issues.size - @close_issues_size - if status_type.to_s == "1" #表示开启中的 - version_issues = version_issues.where.not(status_id: 5) - else - version_issues = version_issues.where(status_id: 5) - end + version_issues = version_issues.where(author_id: params[:author_id]) if params[:author_id].present? && params[:author_id].to_s != "all" version_issues = version_issues.where(assigned_to_id: params[:assigned_to_id]) if params[:assigned_to_id].present? && params[:assigned_to_id].to_s != "all" version_issues = version_issues.where(tracker_id: params[:tracker_id]) if params[:tracker_id].present? && params[:tracker_id].to_s != "all" @@ -47,10 +43,29 @@ class VersionsController < ApplicationController version_issues = version_issues.joins(:issue_tags).where(issue_tags: {id: params[:issue_tag_id].to_i}) if params[:issue_tag_id].present? && params[:issue_tag_id].to_s != "all" version_issues = version_issues.reorder("#{order_name} #{order_type}") + has_filter_params = (params[:author_id].present? && params[:author_id].to_s != "all") || + (params[:assigned_to_id].present? && params[:assigned_to_id].to_s != "all") || + (params[:tracker_id].present? && params[:tracker_id].to_s != "all") || + (params[:status_id].present? && params[:status_id].to_s != "all") || + (params[:priority_id].present? && params[:priority_id].to_s != "all") || + (params[:fixed_version_id].present? && params[:fixed_version_id].to_s != "all") || + (params[:done_ratio].present? && params[:done_ratio].to_s != "all") || + (params[:issue_type].present? && params[:issue_type].to_s != "all") || + (params[:issue_tag_id].present? && params[:issue_tag_id].to_s != "all") + puts has_filter_params + @version_close_issues_size = has_filter_params ? version_issues.closed.size : @version.issues.issue_includes.closed.size + @version_issues_size = has_filter_params ? version_issues.size : @version.issues.issue_includes.size + puts @version_close_issues_size + puts @version_issues_size + if status_type.to_s == "1" #表示开启中的 + version_issues = version_issues.where.not(status_id: 5) + else + version_issues = version_issues.where(status_id: 5) + end @page = params[:page] || 1 @limit = params[:limit] || 15 - @version_issues_size = version_issues.size + # @version_issues_size = version_issues.size @version_issues = version_issues.page(@page).per(@limit) end diff --git a/app/views/versions/index.json.jbuilder b/app/views/versions/index.json.jbuilder index 044d4c5f6..fbff16a39 100644 --- a/app/views/versions/index.json.jbuilder +++ b/app/views/versions/index.json.jbuilder @@ -7,8 +7,8 @@ json.versions do json.array! @versions.each.to_a do |version| json.extract! version, :id, :name, :description, :effective_date,:status,:percent - json.open_issues_count (version.issues_count - version.closed_issues_count) - json.close_issues_count version.closed_issues_count + json.open_issues_count (version.issues_count - version.issues.closed.size) + json.close_issues_count version.issues.closed.size json.created_at format_time(version.created_on) json.updated_at format_time(version.updated_on) json.user_name version.version_user.try(:show_real_name) diff --git a/app/views/versions/show.json.jbuilder b/app/views/versions/show.json.jbuilder index 23f4fbb94..fe8606b22 100644 --- a/app/views/versions/show.json.jbuilder +++ b/app/views/versions/show.json.jbuilder @@ -1,7 +1,7 @@ json.partial! "commons/success" -json.issues_count @version.issues_count -json.open_issues_count @version.issues_count - @version.closed_issues_count -json.close_issues_count @version.closed_issues_count +json.issues_count @version_issues_size +json.open_issues_count @version_issues_size - @version_close_issues_size +json.close_issues_count @version_close_issues_size json.limit @limit json.user_name @version.version_user.try(:show_real_name) json.user_login @version.version_user.try(:login) From 0af08bc9674d8ecd98d7174ccdd150e1a286cb1b Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Mon, 21 Jun 2021 17:05:51 +0800 Subject: [PATCH 02/49] fix: projects load by project language slowly --- app/controllers/versions_controller.rb | 4 +--- app/models/project.rb | 3 +++ .../cache/platform_project_languages_count_service.rb | 4 ++-- ...0210621090005_add_project_language_index_to_projects.rb | 7 +++++++ 4 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 db/migrate/20210621090005_add_project_language_index_to_projects.rb diff --git a/app/controllers/versions_controller.rb b/app/controllers/versions_controller.rb index 34ad64120..5eb9ee271 100644 --- a/app/controllers/versions_controller.rb +++ b/app/controllers/versions_controller.rb @@ -52,16 +52,14 @@ class VersionsController < ApplicationController (params[:done_ratio].present? && params[:done_ratio].to_s != "all") || (params[:issue_type].present? && params[:issue_type].to_s != "all") || (params[:issue_tag_id].present? && params[:issue_tag_id].to_s != "all") - puts has_filter_params @version_close_issues_size = has_filter_params ? version_issues.closed.size : @version.issues.issue_includes.closed.size @version_issues_size = has_filter_params ? version_issues.size : @version.issues.issue_includes.size - puts @version_close_issues_size - puts @version_issues_size if status_type.to_s == "1" #表示开启中的 version_issues = version_issues.where.not(status_id: 5) else version_issues = version_issues.where(status_id: 5) end + puts cookies.to_json @page = params[:page] || 1 @limit = params[:limit] || 15 diff --git a/app/models/project.rb b/app/models/project.rb index eb8a0bbf4..251b40de1 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -64,8 +64,11 @@ # index_projects_on_invite_code (invite_code) # index_projects_on_is_public (is_public) # index_projects_on_lft (lft) +# index_projects_on_license_id (license_id) # index_projects_on_name (name) # index_projects_on_platform (platform) +# index_projects_on_project_category_id (project_category_id) +# index_projects_on_project_language_id (project_language_id) # index_projects_on_project_type (project_type) # index_projects_on_recommend (recommend) # index_projects_on_rgt (rgt) diff --git a/app/services/cache/platform_project_languages_count_service.rb b/app/services/cache/platform_project_languages_count_service.rb index 2b4f0fae4..0c6ffab19 100644 --- a/app/services/cache/platform_project_languages_count_service.rb +++ b/app/services/cache/platform_project_languages_count_service.rb @@ -46,11 +46,11 @@ class Cache::PlatformProjectLanguagesCountService < ApplicationService def reset_platform_project_language_count_by_key return if key.nil? - $redis_cache.hset(platform_project_language_count_key, key, Project.joins(:project_language).where(project_languages: {name: key}).count) + $redis_cache.hset(platform_project_language_count_key, key, ProjectLanguage.where(name: key).projects_count) end def reset_platform_project_language_count - Project.joins(:project_language).group("project_languages.name").count.each do |k, v| + ProjectLanguage.where.not(projects_count: 0).group("project_languages.name").sum(:projects_count).each do |k, v| $redis_cache.hset(platform_project_language_count_key, k, v) end end diff --git a/db/migrate/20210621090005_add_project_language_index_to_projects.rb b/db/migrate/20210621090005_add_project_language_index_to_projects.rb new file mode 100644 index 000000000..d0959168e --- /dev/null +++ b/db/migrate/20210621090005_add_project_language_index_to_projects.rb @@ -0,0 +1,7 @@ +class AddProjectLanguageIndexToProjects < ActiveRecord::Migration[5.2] + def change + add_index :projects, :project_category_id + add_index :projects, :project_language_id + add_index :projects, :license_id + end +end From 2d37df1c00ee9cfb82f99100875e558ee88068d0 Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Mon, 21 Jun 2021 17:12:13 +0800 Subject: [PATCH 03/49] fix: set cache user nil --- app/jobs/reset_user_cache_job.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/jobs/reset_user_cache_job.rb b/app/jobs/reset_user_cache_job.rb index 3562475ce..7b2c5c63b 100644 --- a/app/jobs/reset_user_cache_job.rb +++ b/app/jobs/reset_user_cache_job.rb @@ -2,6 +2,7 @@ class ResetUserCacheJob < ApplicationJob queue_as :cache def perform(user) + return if user.nil? Cache::UserFollowCountService.new(user).reset Cache::UserIssueCountService.new(user).reset Cache::UserProjectCountService.new(user).reset From 526920f5648777d250a3ae7f975588decdf49817 Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Mon, 21 Jun 2021 18:50:45 +0800 Subject: [PATCH 04/49] fix: version issues count except pull requests count --- app/controllers/issues_controller.rb | 2 +- app/controllers/versions_controller.rb | 7 +++---- app/views/versions/index.json.jbuilder | 4 ++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 4b073415a..5fb45a0b4 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -303,7 +303,7 @@ class IssuesController < ApplicationController if issue_ids.present? if update_hash.blank? normal_status(-1, "请选择批量更新内容") - elsif Issue.where(id: issue_ids).update_all(update_hash) + elsif Issue.where(id: issue_ids)&.update(update_hash) normal_status(0, "批量更新成功") else normal_status(-1, "批量更新失败") diff --git a/app/controllers/versions_controller.rb b/app/controllers/versions_controller.rb index 5eb9ee271..58cd9e87f 100644 --- a/app/controllers/versions_controller.rb +++ b/app/controllers/versions_controller.rb @@ -25,7 +25,7 @@ class VersionsController < ApplicationController end def show - version_issues = @version.issues.issue_includes + version_issues = @version.issues.issue_issue.issue_includes status_type = params[:status_type] || "1" # @close_issues_size = version_issues.where(status_id: 5).size @@ -52,14 +52,13 @@ class VersionsController < ApplicationController (params[:done_ratio].present? && params[:done_ratio].to_s != "all") || (params[:issue_type].present? && params[:issue_type].to_s != "all") || (params[:issue_tag_id].present? && params[:issue_tag_id].to_s != "all") - @version_close_issues_size = has_filter_params ? version_issues.closed.size : @version.issues.issue_includes.closed.size - @version_issues_size = has_filter_params ? version_issues.size : @version.issues.issue_includes.size + @version_close_issues_size = has_filter_params ? version_issues.closed.size : @version.issues.issue_issue.issue_includes.closed.size + @version_issues_size = has_filter_params ? version_issues.size : @version.issues.issue_issue.issue_includes.size if status_type.to_s == "1" #表示开启中的 version_issues = version_issues.where.not(status_id: 5) else version_issues = version_issues.where(status_id: 5) end - puts cookies.to_json @page = params[:page] || 1 @limit = params[:limit] || 15 diff --git a/app/views/versions/index.json.jbuilder b/app/views/versions/index.json.jbuilder index fbff16a39..4c15d45e1 100644 --- a/app/views/versions/index.json.jbuilder +++ b/app/views/versions/index.json.jbuilder @@ -7,8 +7,8 @@ json.versions do json.array! @versions.each.to_a do |version| json.extract! version, :id, :name, :description, :effective_date,:status,:percent - json.open_issues_count (version.issues_count - version.issues.closed.size) - json.close_issues_count version.issues.closed.size + json.open_issues_count (version.issues.issue_issue.size - version.issues.issue_issue.closed.size) + json.close_issues_count version.issues.issue_issue.closed.size json.created_at format_time(version.created_on) json.updated_at format_time(version.updated_on) json.user_name version.version_user.try(:show_real_name) From fff21a1bc8280d7e0620581c271815d47a9ff367 Mon Sep 17 00:00:00 2001 From: jasder Date: Tue, 22 Jun 2021 09:39:44 +0800 Subject: [PATCH 05/49] =?UTF-8?q?FIX=20=E5=A4=84=E7=90=86=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=BA=93zip=E3=80=81gzip=E5=8C=85=E9=93=BE=E6=8E=A5?= =?UTF-8?q?=E4=B8=BA=E6=97=A0=E6=95=88=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/projects_controller.rb | 2 +- app/controllers/repositories_controller.rb | 19 +++++++-- app/helpers/projects_helper.rb | 8 ++-- .../gitea/repository/archive_service.rb | 40 +++++++++++++++++++ app/views/projects/branches.json.jbuilder | 4 +- app/views/repositories/entries.json.jbuilder | 5 ++- config/routes.rb | 2 +- 7 files changed, 67 insertions(+), 13 deletions(-) create mode 100644 app/services/gitea/repository/archive_service.rb diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 3e40619c5..c9e1a3a14 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -5,7 +5,7 @@ class ProjectsController < ApplicationController include Acceleratorable before_action :require_login, except: %i[index branches group_type_list simple show fork_users praise_users watch_users recommend about menu_list] - before_action :load_project, except: %i[index group_type_list migrate create recommend] + before_action :load_repository, except: %i[index group_type_list migrate create recommend] before_action :authorizate_user_can_edit_project!, only: %i[update] before_action :project_public?, only: %i[fork_users praise_users watch_users] diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index 93ba02a92..062a8f046 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -5,9 +5,9 @@ class RepositoriesController < ApplicationController before_action :require_login, only: %i[edit update create_file update_file delete_file sync_mirror] before_action :load_repository - before_action :authorizate!, except: [:sync_mirror, :tags, :commit] + before_action :authorizate!, except: [:sync_mirror, :tags, :commit, :archive] before_action :authorizate_user_can_edit_repo!, only: %i[sync_mirror] - before_action :get_ref, only: %i[entries sub_entries top_counts file] + before_action :get_ref, only: %i[entries sub_entries top_counts file archive] before_action :get_latest_commit, only: %i[entries sub_entries top_counts] before_action :get_statistics, only: %i[top_counts] @@ -192,6 +192,19 @@ class RepositoriesController < ApplicationController render json: languages_precentagable end + def archive + domain = Gitea.gitea_config[:domain] + api_url = Gitea.gitea_config[:base_url] + archive_url = "/repos/#{@owner.login}/#{@repository.identifier}/archive/#{params[:archive]}" + + file_path = [domain, api_url, archive_url].join + file_path = [file_path, "access_token=#{current_user&.gitea_token}"].join("?") if @repository.hidden? + + return render_not_found if !request.format.zip? && !request.format.gzip? + + redirect_to file_path + end + private def find_project @@ -266,7 +279,7 @@ class RepositoriesController < ApplicationController # uploadPushInfo end - + def create_new_pr(params) if params[:new_branch].present? && params[:new_branch] != params[:branch] local_params = { diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 226096c24..12a0097bd 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -13,12 +13,12 @@ module ProjectsHelper end end - def render_zip_url(project, archive_name) - [gitea_domain, project.owner.login, project.identifier, "archive", "#{archive_name}.zip"].join('/') + def render_zip_url(owner, repository, archive) + [base_url, archive_repositories_path(owner&.login, repository, "#{archive}.zip")].join end - def render_tar_url(project, archive_name) - [gitea_domain, project.owner.login, project.identifier, "archive", "#{archive_name}.tar.gz"].join('/') + def render_tar_url(owner, repository, archive) + [base_url, archive_repositories_path(owner&.login, repository, "#{archive}.tar.gz")].join end def render_http_url(project) diff --git a/app/services/gitea/repository/archive_service.rb b/app/services/gitea/repository/archive_service.rb new file mode 100644 index 000000000..1b5e1e2a3 --- /dev/null +++ b/app/services/gitea/repository/archive_service.rb @@ -0,0 +1,40 @@ +class Gitea::Repository::ArchiveService < Gitea::ClientService + attr_reader :owner, :repo, :archive, :token + + def initialize(owner, repo, archive, token=nil) + @owner = owner + @repo = repo + @archive = archive + @token = token + end + + def call + response = get(url, params) + response_payload(response) + end + + private + def params + Hash.new.merge(token: token) + end + + def url + "/repos/#{owner}/#{repo}/archive/#{archive}".freeze + end + + def response_payload(response) + status = response.status + body = response&.body + + log_error(status, body) + status_payload(status, body) + end + + def status_payload(status, body) + case status + when 200 then success + when 404 then error("你操作的链接不存在!") + else error("系统错误!") + end + end +end diff --git a/app/views/projects/branches.json.jbuilder b/app/views/projects/branches.json.jbuilder index d6f451373..dd722c9d9 100644 --- a/app/views/projects/branches.json.jbuilder +++ b/app/views/projects/branches.json.jbuilder @@ -4,8 +4,8 @@ json.array! @branches do |branch| json.user_can_merge branch['user_can_merge'] json.protected branch['protected'] json.http_url render_http_url(@project) - json.zip_url render_zip_url(@project, branch['name']) - json.tar_url render_tar_url(@project, branch['name']) + json.zip_url render_zip_url(@owner, @repository, branch['name']) + json.tar_url render_tar_url(@owner, @repository, branch['name']) json.last_commit do json.sha branch['commit']['id'] json.message branch['commit']['message'] diff --git a/app/views/repositories/entries.json.jbuilder b/app/views/repositories/entries.json.jbuilder index a12c088b0..8c028e6a2 100644 --- a/app/views/repositories/entries.json.jbuilder +++ b/app/views/repositories/entries.json.jbuilder @@ -42,8 +42,9 @@ if @project.forge? #json.tags_count @tags_count #json.branches_count @branches_count json.commits_count @commits_count - json.zip_url render_zip_url(@project, @ref) - json.tar_url render_tar_url(@project, @ref) + # json.zip_url archive_repositories_path(@owner&.login, @repository, @ref) + json.zip_url render_zip_url(@owner, @repository, @ref) + json.tar_url render_tar_url(@owner, @repository, @ref) json.entries do json.array! @entries do |entry| json.name entry['name'] diff --git a/config/routes.rb b/config/routes.rb index 5a883fcb1..de2206fdc 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -416,7 +416,6 @@ Rails.application.routes.draw do member do get :files get :detail - get :archive get :entries match :sub_entries, :via => [:get, :put] get :commits @@ -431,6 +430,7 @@ Rails.application.routes.draw do get 'commits/:sha', to: 'repositories#commit', as: 'commit' get 'readme' get 'languages' + get 'archive/:archive', to: 'repositories#archive', as: "archive", constraints: { archive: /.+/, format: /(zip|gzip)/ } end end From 0bfed83bc0cb08776c75b7bfe496cd329b03ace5 Mon Sep 17 00:00:00 2001 From: jasder Date: Tue, 22 Jun 2021 15:05:10 +0800 Subject: [PATCH 06/49] =?UTF-8?q?FIX=20=E8=A7=A3=E5=86=B3=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=B9=B3=E5=8F=B0base=20url=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E7=9A=84https=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/application_controller.rb | 2 +- config/configuration.yml.example | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 8b98a920b..7ef5879a2 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -771,7 +771,7 @@ class ApplicationController < ActionController::Base end def base_url - request.base_url + Rails.application.config_for(:configuration)['platform_url'] || request.base_url end def convert_image! diff --git a/config/configuration.yml.example b/config/configuration.yml.example index b45c9532c..c8fe96ca2 100644 --- a/config/configuration.yml.example +++ b/config/configuration.yml.example @@ -1,6 +1,7 @@ default: &default # 用户登入的时候设置/登出的时候清空 autologin_cookie_name: 'autologin_trustie' + platform_url: 'http://localhost:3000' #附件上传路径 From 4126ea7b4e3806b9789070204d5908d22ca79632 Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Tue, 22 Jun 2021 15:54:42 +0800 Subject: [PATCH 07/49] fix: some bug from security --- app/controllers/issues_controller.rb | 5 +++++ app/models/concerns/project_operable.rb | 2 +- app/services/projects/create_service.rb | 5 +++++ app/services/projects/migrate_service.rb | 5 +++++ config/initializers/session_store.rb | 2 +- 5 files changed, 17 insertions(+), 2 deletions(-) diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 5fb45a0b4..9780d4729 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -3,6 +3,7 @@ class IssuesController < ApplicationController before_action :load_project before_action :set_user before_action :check_issue_permission + before_action :operate_issue_permission, only:[:create, :update, :destroy, :clean, :series_update] before_action :check_project_public, only: [:index ,:show, :copy, :index_chosen, :close_issue] before_action :set_issue, only: [:edit, :update, :destroy, :show, :copy, :close_issue, :lock_issue] @@ -412,6 +413,10 @@ class IssuesController < ApplicationController end end + def operate_issue_permission + return render_forbidden("您没有权限进行此操作.") unless current_user.admin? || @project.member?(current_user) + end + def export_issues(issues) @table_columns = %w(ID 类型 标题 描述 状态 指派给 优先级 标签 发布人 创建时间 里程碑 开始时间 截止时间 完成度 分类 金额 属于) @export_issues = [] diff --git a/app/models/concerns/project_operable.rb b/app/models/concerns/project_operable.rb index 79d099a2e..a228a7028 100644 --- a/app/models/concerns/project_operable.rb +++ b/app/models/concerns/project_operable.rb @@ -94,7 +94,7 @@ module ProjectOperable end def operator?(user) - user.admin? || !reporter?(user) + user.admin? || (member?(user.id) && !reporter?(user)) end def set_developer_role(member, role_name) diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index f014b8d7f..e7e4924ae 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -8,6 +8,7 @@ class Projects::CreateService < ApplicationService def call Rails.logger.info("#############__________project_params______###########{project_params}") + raise Error, "user_id不正确." unless authroize_user_id_success @project = Project.new(project_params) ActiveRecord::Base.transaction do @@ -27,6 +28,10 @@ class Projects::CreateService < ApplicationService private + def authroize_user_id_success + (user.id == params[:user_id].to_i) || (user.organizations.find_by_id(params[:user_id]).present?) + end + def project_params { name: params[:name], diff --git a/app/services/projects/migrate_service.rb b/app/services/projects/migrate_service.rb index 7df08f9eb..68ed9f642 100644 --- a/app/services/projects/migrate_service.rb +++ b/app/services/projects/migrate_service.rb @@ -8,6 +8,8 @@ class Projects::MigrateService < ApplicationService end def call + raise Error, "user_id不正确." unless authroize_user_id_success + @project = Project.new(project_params) if @project.save! ProjectUnit.init_types(@project.id, project.project_type) @@ -24,6 +26,9 @@ class Projects::MigrateService < ApplicationService end private + def authroize_user_id_success + (user.id == params[:user_id].to_i) || (user.organizations.find_by_id(params[:user_id]).present?) + end def project_params { diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb index def30285a..12faf10f2 100644 --- a/config/initializers/session_store.rb +++ b/config/initializers/session_store.rb @@ -4,5 +4,5 @@ # Rails.application.config.session_store :active_record_store # Be sure to restart your server when you modify this file. -Rails.application.config.session_store :cache_store, :expire_after => 24.hours, :httponly => false, :secure => false, key: '_educoder_session', domain: :all +Rails.application.config.session_store :cache_store, :expire_after => 24.hours, :httponly => true, :secure => false, key: '_educoder_session', domain: :all From b7dd12927b8a33c0c18603be2b52fc40998e12ca Mon Sep 17 00:00:00 2001 From: jasder Date: Thu, 24 Jun 2021 16:08:32 +0800 Subject: [PATCH 08/49] ADD conflicts file for pull api --- app/models/gitea/pull.rb | 11 +++++++++++ app/models/pull_request.rb | 8 ++++++++ app/views/pull_requests/show.json.jbuilder | 2 ++ config/database.yml.example | 8 ++++++++ 4 files changed, 29 insertions(+) create mode 100644 app/models/gitea/pull.rb diff --git a/app/models/gitea/pull.rb b/app/models/gitea/pull.rb new file mode 100644 index 000000000..a8ce4a194 --- /dev/null +++ b/app/models/gitea/pull.rb @@ -0,0 +1,11 @@ +class Gitea::Pull < Gitea::Base + self.inheritance_column = nil # FIX The single-table inheritance mechanism failed + # establish_connection :gitea_db + + self.table_name = "pull_request" + + serialize :conflicted_files, Array + + belongs_to :pull_request, class_name: '::PullRequest', foreign_key: :id, primary_key: :gpid, optional: true + +end diff --git a/app/models/pull_request.rb b/app/models/pull_request.rb index 4226d561b..8b4715d72 100644 --- a/app/models/pull_request.rb +++ b/app/models/pull_request.rb @@ -37,6 +37,7 @@ class PullRequest < ApplicationRecord has_many :pull_request_tags, foreign_key: :pull_request_id has_many :project_trends, as: :trend, dependent: :destroy has_many :attachments, as: :container, dependent: :destroy + has_one :gitea_pull, foreign_key: :id, primary_key: :gpid, class_name: 'Gitea::Pull' scope :merged_and_closed, ->{where.not(status: 0)} scope :opening, -> {where(status: 0)} @@ -82,4 +83,11 @@ class PullRequest < ApplicationRecord pr.update_column(:commits_count, commits_result.size) unless commits_result.blank? end end + + def conflict_files + file_names = self&.gitea_pull&.conflicted_files + return [] if file_names.blank? + + JSON.parse file_names + end end diff --git a/app/views/pull_requests/show.json.jbuilder b/app/views/pull_requests/show.json.jbuilder index 9c2681861..6f6343903 100644 --- a/app/views/pull_requests/show.json.jbuilder +++ b/app/views/pull_requests/show.json.jbuilder @@ -32,3 +32,5 @@ json.issue do json.version @issue.version.try(:name) json.issue_tags @issue.get_issue_tags end + +json.conflict_files @pull_request.conflict_files diff --git a/config/database.yml.example b/config/database.yml.example index dae8f8816..62b69492b 100644 --- a/config/database.yml.example +++ b/config/database.yml.example @@ -23,6 +23,14 @@ development: host: 127.0.0.1 database: forge_development +gitea_db: + adapter: mysql2 + database: gitea_development + host: 127.0.0.1 + username: root + password: "123456" + encoding: utf8 + # Warning: The database defined as "test" will be erased and # re-generated from your development database when you run "rake". # Do not set this db to the same as development or production. From 8d300e11f960a03154a94cad025b175477d03ffc Mon Sep 17 00:00:00 2001 From: jasder Date: Thu, 24 Jun 2021 16:18:34 +0800 Subject: [PATCH 09/49] FIX [bug]conflicts file for pull api --- app/models/gitea/base.rb | 8 +++++--- config/database.yml.example | 15 +++++++-------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/app/models/gitea/base.rb b/app/models/gitea/base.rb index d14249bf6..652fd777d 100644 --- a/app/models/gitea/base.rb +++ b/app/models/gitea/base.rb @@ -1,4 +1,6 @@ -class Gitea::Base < Gitea::Database - self.abstract_class = true - +class Gitea::Base < ApplicationRecord + db_config = Rails.configuration.database_configuration[Rails.env]["gitea_server"] + raise 'gitea database config missing' if db_config.blank? + + establish_connection db_config end diff --git a/config/database.yml.example b/config/database.yml.example index 62b69492b..b0f1f2bef 100644 --- a/config/database.yml.example +++ b/config/database.yml.example @@ -17,20 +17,19 @@ default: &default username: root password: 123456 # socket: /var/run/mysqld/mysqld.sock + gitea_server: + aadapter: mysql2 + database: gitea_development + host: 127.0.0.1 + username: root + password: "123456" + encoding: utf8 development: <<: *default host: 127.0.0.1 database: forge_development -gitea_db: - adapter: mysql2 - database: gitea_development - host: 127.0.0.1 - username: root - password: "123456" - encoding: utf8 - # Warning: The database defined as "test" will be erased and # re-generated from your development database when you run "rake". # Do not set this db to the same as development or production. From 62d1a2378cdd89791672b286b1202c92ec812a96 Mon Sep 17 00:00:00 2001 From: jasder Date: Fri, 25 Jun 2021 17:31:23 +0800 Subject: [PATCH 10/49] =?UTF-8?q?FIX=20=20[=E6=9B=B4=E6=94=B9=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E5=90=8D=E7=A7=B0]conflicts=20file=20for=20pull=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/pull_requests_controller.rb | 8 +- app/models/applied_message.rb | 15 +++- app/models/applied_project.rb | 15 ++-- app/models/attachment.rb | 77 ++++++++++--------- app/models/ci/user.rb | 17 ++-- app/models/gitea/pull.rb | 35 ++++++++- app/models/laboratory.rb | 1 + app/models/license.rb | 1 - app/models/member.rb | 1 - app/models/organization.rb | 17 ++-- app/models/project.rb | 5 +- app/models/project_category.rb | 5 -- app/models/pull_request.rb | 14 ++-- app/models/repository.rb | 1 - app/models/user.rb | 17 ++-- app/models/user_action.rb | 4 +- app/models/user_agent.rb | 5 +- app/models/user_extension.rb | 3 + .../gitea/pull_request/close_service.rb | 2 +- .../gitea/pull_request/get_service.rb | 2 +- .../gitea/pull_request/open_service.rb | 2 +- app/services/pull_requests/close_service.rb | 2 +- app/services/pull_requests/merge_service.rb | 2 +- app/services/pull_requests/open_service.rb | 2 +- ..._change_columns_name_from_pull_requests.rb | 22 ++++++ 25 files changed, 170 insertions(+), 105 deletions(-) create mode 100644 db/migrate/20210624101058_change_columns_name_from_pull_requests.rb diff --git a/app/controllers/pull_requests_controller.rb b/app/controllers/pull_requests_controller.rb index 8521cd4b3..3d9f32a22 100644 --- a/app/controllers/pull_requests_controller.rb +++ b/app/controllers/pull_requests_controller.rb @@ -91,7 +91,7 @@ class PullRequestsController < ApplicationController if @issue.update_attributes(@issue_params) if @pull_request.update_attributes(@local_params.compact) gitea_pull = Gitea::PullRequest::UpdateService.call(@owner.login, @repository.identifier, - @pull_request.gpid, @requests_params, current_user.gitea_token) + @pull_request.gitea_number, @requests_params, current_user.gitea_token) if gitea_pull[:status] === :success if params[:issue_tag_ids].present? @@ -139,7 +139,7 @@ class PullRequestsController < ApplicationController @issue_user = @issue.user @issue_assign_to = @issue.get_assign_user @gitea_pull = Gitea::PullRequest::GetService.call(@owner.login, - @repository.identifier, @pull_request.gpid, current_user&.gitea_token) + @repository.identifier, @pull_request.gitea_number, current_user&.gitea_token) end def pr_merge @@ -191,12 +191,12 @@ class PullRequestsController < ApplicationController def files - @files_result = Gitea::PullRequest::FilesService.call(@owner.login, @project.identifier, @pull_request.gpid, current_user&.gitea_token) + @files_result = Gitea::PullRequest::FilesService.call(@owner.login, @project.identifier, @pull_request.gitea_number, current_user&.gitea_token) # render json: @files_result end def commits - @commits_result = Gitea::PullRequest::CommitsService.call(@owner.login, @project.identifier, @pull_request.gpid, current_user&.gitea_token) + @commits_result = Gitea::PullRequest::CommitsService.call(@owner.login, @project.identifier, @pull_request.gitea_number, current_user&.gitea_token) # render json: @commits_result end diff --git a/app/models/applied_message.rb b/app/models/applied_message.rb index 5c942b7b3..01f5fa7e5 100644 --- a/app/models/applied_message.rb +++ b/app/models/applied_message.rb @@ -1,19 +1,26 @@ # == Schema Information # -# Table name: applied_messages +# Table name: forge_applied_messages # # id :integer not null, primary key # user_id :integer -# applied_id :integer # applied_type :string(255) +# applied_id :integer # viewed :integer default("0") # status :integer default("0") -# created_at :datetime not null -# updated_at :datetime not null # name :string(255) # applied_user_id :integer # role :integer # project_id :integer +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_forge_applied_messages_on_applied_type_and_applied_id (applied_type,applied_id) +# index_forge_applied_messages_on_applied_user_id (applied_user_id) +# index_forge_applied_messages_on_project_id (project_id) +# index_forge_applied_messages_on_user_id (user_id) # class AppliedMessage < ApplicationRecord diff --git a/app/models/applied_project.rb b/app/models/applied_project.rb index e0b4b6c48..ea7ca6eee 100644 --- a/app/models/applied_project.rb +++ b/app/models/applied_project.rb @@ -1,14 +1,19 @@ # == Schema Information # -# Table name: applied_projects +# Table name: forge_applied_projects # # id :integer not null, primary key -# project_id :integer not null -# user_id :integer not null +# project_id :integer +# user_id :integer # role :integer default("0") # status :integer default("0") -# created_at :datetime -# updated_at :datetime +# created_at :datetime not null +# updated_at :datetime not null +# +# Indexes +# +# index_forge_applied_projects_on_project_id (project_id) +# index_forge_applied_projects_on_user_id (user_id) # class AppliedProject < ApplicationRecord diff --git a/app/models/attachment.rb b/app/models/attachment.rb index c6a50d93e..3451246af 100644 --- a/app/models/attachment.rb +++ b/app/models/attachment.rb @@ -1,41 +1,42 @@ -# == Schema Information -# -# Table name: attachments -# -# id :integer not null, primary key -# container_id :integer -# container_type :string(30) -# filename :string(255) default(""), not null -# disk_filename :string(255) default(""), not null -# filesize :integer default("0"), not null -# content_type :string(255) default("") -# digest :string(60) default(""), not null -# downloads :integer default("0"), not null -# author_id :integer default("0"), not null -# created_on :datetime -# description :text(65535) -# disk_directory :string(255) -# attachtype :integer default("1") -# is_public :integer default("1") -# copy_from :integer -# quotes :integer default("0") -# is_publish :integer default("1") -# publish_time :datetime -# resource_bank_id :integer -# unified_setting :boolean default("1") -# cloud_url :string(255) default("") -# course_second_category_id :integer default("0") -# delay_publish :boolean default("0") -# -# Indexes -# -# index_attachments_on_author_id (author_id) -# index_attachments_on_container_id_and_container_type (container_id,container_type) -# index_attachments_on_course_second_category_id (course_second_category_id) -# index_attachments_on_created_on (created_on) -# index_attachments_on_is_public (is_public) -# index_attachments_on_quotes (quotes) -# +# == Schema Information +# +# Table name: attachments +# +# id :integer not null, primary key +# container_id :integer +# container_type :string(30) +# filename :string(255) default(""), not null +# disk_filename :string(255) default(""), not null +# filesize :integer default("0"), not null +# content_type :string(255) default("") +# digest :string(60) default(""), not null +# downloads :integer default("0"), not null +# author_id :integer default("0"), not null +# created_on :datetime +# description :text(65535) +# disk_directory :string(255) +# attachtype :integer default("1") +# is_public :integer default("1") +# copy_from :string(255) +# quotes :integer default("0") +# is_publish :integer default("1") +# publish_time :datetime +# resource_bank_id :integer +# unified_setting :boolean default("1") +# cloud_url :string(255) default("") +# course_second_category_id :integer default("0") +# delay_publish :boolean default("0") +# link :string(255) +# clone_id :integer +# +# Indexes +# +# index_attachments_on_author_id (author_id) +# index_attachments_on_clone_id (clone_id) +# index_attachments_on_container_id_and_container_type (container_id,container_type) +# index_attachments_on_created_on (created_on) +# + class Attachment < ApplicationRecord diff --git a/app/models/ci/user.rb b/app/models/ci/user.rb index c263a1723..e4a4d0623 100644 --- a/app/models/ci/user.rb +++ b/app/models/ci/user.rb @@ -39,17 +39,15 @@ # business :boolean default("0") # profile_completed :boolean default("0") # laboratory_id :integer -# platform :string(255) default("0") -# gitea_token :string(255) -# gitea_uid :integer # is_shixun_marker :boolean default("0") +# admin_visitable :boolean default("0") +# collaborator :boolean default("0") +# gitea_uid :integer # is_sync_pwd :boolean default("1") # watchers_count :integer default("0") # devops_step :integer default("0") -# sponsor_certification :integer default("0") -# sponsor_num :integer default("0") -# sponsored_num :integer default("0") -# award_time :datetime +# gitea_token :string(255) +# platform :string(255) # # Indexes # @@ -57,8 +55,9 @@ # index_users_on_homepage_engineer (homepage_engineer) # index_users_on_homepage_teacher (homepage_teacher) # index_users_on_laboratory_id (laboratory_id) -# index_users_on_login (login) -# index_users_on_mail (mail) +# index_users_on_login (login) UNIQUE +# index_users_on_mail (mail) UNIQUE +# index_users_on_phone (phone) UNIQUE # index_users_on_type (type) # diff --git a/app/models/gitea/pull.rb b/app/models/gitea/pull.rb index a8ce4a194..591e36c42 100644 --- a/app/models/gitea/pull.rb +++ b/app/models/gitea/pull.rb @@ -1,3 +1,36 @@ +# == Schema Information +# +# Table name: pull_request +# +# id :integer not null, primary key +# type :integer +# status :integer +# conflicted_files :text(65535) +# commits_ahead :integer +# commits_behind :integer +# changed_protected_files :text(65535) +# issue_id :integer +# index :integer +# head_repo_id :integer +# base_repo_id :integer +# head_branch :string(255) +# base_branch :string(255) +# merge_base :string(40) +# has_merged :boolean +# merged_commit_id :string(40) +# merger_id :integer +# merged_unix :integer +# +# Indexes +# +# IDX_pull_request_base_repo_id (base_repo_id) +# IDX_pull_request_has_merged (has_merged) +# IDX_pull_request_head_repo_id (head_repo_id) +# IDX_pull_request_issue_id (issue_id) +# IDX_pull_request_merged_unix (merged_unix) +# IDX_pull_request_merger_id (merger_id) +# + class Gitea::Pull < Gitea::Base self.inheritance_column = nil # FIX The single-table inheritance mechanism failed # establish_connection :gitea_db @@ -6,6 +39,6 @@ class Gitea::Pull < Gitea::Base serialize :conflicted_files, Array - belongs_to :pull_request, class_name: '::PullRequest', foreign_key: :id, primary_key: :gpid, optional: true + belongs_to :pull_request, class_name: '::PullRequest', foreign_key: :id, primary_key: :gitea_number, optional: true end diff --git a/app/models/laboratory.rb b/app/models/laboratory.rb index 699800c92..9d3ca07dd 100644 --- a/app/models/laboratory.rb +++ b/app/models/laboratory.rb @@ -10,6 +10,7 @@ # sync_course :boolean default("0") # sync_subject :boolean default("0") # sync_shixun :boolean default("0") +# is_local :boolean default("0") # # Indexes # diff --git a/app/models/license.rb b/app/models/license.rb index dcd5528fb..0a14fb85e 100644 --- a/app/models/license.rb +++ b/app/models/license.rb @@ -7,7 +7,6 @@ # content :text(65535) # created_at :datetime not null # updated_at :datetime not null -# is_secret :boolean default("0") # class License < ApplicationRecord diff --git a/app/models/member.rb b/app/models/member.rb index 408710a03..e72ae7c6b 100644 --- a/app/models/member.rb +++ b/app/models/member.rb @@ -11,7 +11,6 @@ # course_group_id :integer default("0") # is_collect :integer default("1") # graduation_group_id :integer default("0") -# is_apply_signature :boolean default("0") # # Indexes # diff --git a/app/models/organization.rb b/app/models/organization.rb index 666e13ff2..843c2b05f 100644 --- a/app/models/organization.rb +++ b/app/models/organization.rb @@ -39,17 +39,15 @@ # business :boolean default("0") # profile_completed :boolean default("0") # laboratory_id :integer -# platform :string(255) default("0") -# gitea_token :string(255) -# gitea_uid :integer # is_shixun_marker :boolean default("0") +# admin_visitable :boolean default("0") +# collaborator :boolean default("0") +# gitea_uid :integer # is_sync_pwd :boolean default("1") # watchers_count :integer default("0") # devops_step :integer default("0") -# sponsor_certification :integer default("0") -# sponsor_num :integer default("0") -# sponsored_num :integer default("0") -# award_time :datetime +# gitea_token :string(255) +# platform :string(255) # # Indexes # @@ -57,8 +55,9 @@ # index_users_on_homepage_engineer (homepage_engineer) # index_users_on_homepage_teacher (homepage_teacher) # index_users_on_laboratory_id (laboratory_id) -# index_users_on_login (login) -# index_users_on_mail (mail) +# index_users_on_login (login) UNIQUE +# index_users_on_mail (mail) UNIQUE +# index_users_on_phone (phone) UNIQUE # index_users_on_type (type) # diff --git a/app/models/project.rb b/app/models/project.rb index eb8a0bbf4..4d9b8d9d4 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -37,8 +37,6 @@ # rep_identifier :string(255) # project_category_id :integer # project_language_id :integer -# license_id :integer -# ignore_id :integer # praises_count :integer default("0") # watchers_count :integer default("0") # issues_count :integer default("0") @@ -52,9 +50,10 @@ # open_devops_count :integer default("0") # recommend :boolean default("0") # platform :integer default("0") +# license_id :integer +# ignore_id :integer # default_branch :string(255) default("master") # website :string(255) -# order_index :integer default("0") # lesson_url :string(255) # # Indexes diff --git a/app/models/project_category.rb b/app/models/project_category.rb index 3a9819816..67b802998 100644 --- a/app/models/project_category.rb +++ b/app/models/project_category.rb @@ -8,11 +8,6 @@ # projects_count :integer default("0") # created_at :datetime not null # updated_at :datetime not null -# ancestry :string(255) -# -# Indexes -# -# index_project_categories_on_ancestry (ancestry) # class ProjectCategory < ApplicationRecord diff --git a/app/models/pull_request.rb b/app/models/pull_request.rb index 8b4715d72..5c9004a06 100644 --- a/app/models/pull_request.rb +++ b/app/models/pull_request.rb @@ -37,7 +37,7 @@ class PullRequest < ApplicationRecord has_many :pull_request_tags, foreign_key: :pull_request_id has_many :project_trends, as: :trend, dependent: :destroy has_many :attachments, as: :container, dependent: :destroy - has_one :gitea_pull, foreign_key: :id, primary_key: :gpid, class_name: 'Gitea::Pull' + has_one :gitea_pull, foreign_key: :id, primary_key: :gitea_number, class_name: 'Gitea::Pull' scope :merged_and_closed, ->{where.not(status: 0)} scope :opening, -> {where(status: 0)} @@ -55,7 +55,7 @@ class PullRequest < ApplicationRecord end def bind_gitea_pull_request!(gitea_pull_number) - update_column(:gpid, gitea_pull_number) + update_column(:gitea_number, gitea_pull_number) end def merge! @@ -68,18 +68,18 @@ class PullRequest < ApplicationRecord # 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| + PullRequest.includes(:user, :project).select(:id, :user_id, :gitea_number, :project_id, :fork_project_id).each do |pr| puts pr.id - next if pr.gpid.blank? + next if pr.gitea_number.blank? project = pr.project next if project.blank? user = project.owner - next if pr.gpid === 6 || pr.gpid === 7 - files_result = Gitea::PullRequest::FilesService.call(user.login, project.identifier, pr.gpid) + next if pr.gitea_number === 6 || pr.gitea_number === 7 + files_result = Gitea::PullRequest::FilesService.call(user.login, project.identifier, pr.gitea_number) pr.update_column(:files_count, files_result['NumFiles']) unless files_result.blank? - commits_result = Gitea::PullRequest::CommitsService.call(user.login, project.identifier, pr.gpid) + commits_result = Gitea::PullRequest::CommitsService.call(user.login, project.identifier, pr.gitea_number) pr.update_column(:commits_count, commits_result.size) unless commits_result.blank? end end diff --git a/app/models/repository.rb b/app/models/repository.rb index cefdf6ea4..a012b449a 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -27,7 +27,6 @@ # # Indexes # -# index_repositories_on_identifier (identifier) # index_repositories_on_project_id (project_id) # index_repositories_on_user_id (user_id) # diff --git a/app/models/user.rb b/app/models/user.rb index c943e5efa..ce607abad 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -39,17 +39,15 @@ # business :boolean default("0") # profile_completed :boolean default("0") # laboratory_id :integer -# platform :string(255) default("0") -# gitea_token :string(255) -# gitea_uid :integer # is_shixun_marker :boolean default("0") +# admin_visitable :boolean default("0") +# collaborator :boolean default("0") +# gitea_uid :integer # is_sync_pwd :boolean default("1") # watchers_count :integer default("0") # devops_step :integer default("0") -# sponsor_certification :integer default("0") -# sponsor_num :integer default("0") -# sponsored_num :integer default("0") -# award_time :datetime +# gitea_token :string(255) +# platform :string(255) # # Indexes # @@ -57,8 +55,9 @@ # index_users_on_homepage_engineer (homepage_engineer) # index_users_on_homepage_teacher (homepage_teacher) # index_users_on_laboratory_id (laboratory_id) -# index_users_on_login (login) -# index_users_on_mail (mail) +# index_users_on_login (login) UNIQUE +# index_users_on_mail (mail) UNIQUE +# index_users_on_phone (phone) UNIQUE # index_users_on_type (type) # diff --git a/app/models/user_action.rb b/app/models/user_action.rb index 3ad8010ea..179359695 100644 --- a/app/models/user_action.rb +++ b/app/models/user_action.rb @@ -12,7 +12,9 @@ # # Indexes # -# index_user_actions_on_ip (ip) +# index_user_actions_on_ip (ip) +# index_user_actions_on_user_id (user_id) +# index_user_actions_on_user_id_and_action_type (user_id,action_type) # class UserAction < ApplicationRecord diff --git a/app/models/user_agent.rb b/app/models/user_agent.rb index 49d7b35a1..ba519d6fb 100644 --- a/app/models/user_agent.rb +++ b/app/models/user_agent.rb @@ -10,10 +10,13 @@ # updated_at :datetime not null # register_status :integer default("0") # action_status :integer default("0") +# is_delete :boolean default("0") +# user_id :integer # # Indexes # -# index_user_agents_on_ip (ip) UNIQUE +# index_user_agents_on_ip (ip) +# index_user_agents_on_user_id (user_id) # class UserAgent < ApplicationRecord diff --git a/app/models/user_extension.rb b/app/models/user_extension.rb index 0749d1f79..ee208af7e 100644 --- a/app/models/user_extension.rb +++ b/app/models/user_extension.rb @@ -22,6 +22,9 @@ # school_id :integer # description :string(255) default("") # department_id :integer +# honor :text(65535) +# edu_background :integer +# edu_entry_year :integer # province :string(255) # city :string(255) # custom_department :string(255) diff --git a/app/services/gitea/pull_request/close_service.rb b/app/services/gitea/pull_request/close_service.rb index aed5251b7..3ca062e64 100644 --- a/app/services/gitea/pull_request/close_service.rb +++ b/app/services/gitea/pull_request/close_service.rb @@ -8,7 +8,7 @@ class Gitea::PullRequest::CloseService < Gitea::PullRequest::UpdateService # 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) + # Gitea::PullRequest::CloseService.call(owner.login, repo.identifier, pull.gitea_number, 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 diff --git a/app/services/gitea/pull_request/get_service.rb b/app/services/gitea/pull_request/get_service.rb index 601c669e1..f9a35fdca 100644 --- a/app/services/gitea/pull_request/get_service.rb +++ b/app/services/gitea/pull_request/get_service.rb @@ -3,7 +3,7 @@ class Gitea::PullRequest::GetService < Gitea::ClientService attr_reader :owner, :repo, :number, :token #eq: - # Gitea::PullRequest::GetService.call(user.login, repository.identifier, pull.gpid, user.gitea_token) + # Gitea::PullRequest::GetService.call(user.login, repository.identifier, pull.gitea_number, user.gitea_token) def initialize(owner, repo, number, token=nil) @owner = owner @repo = repo diff --git a/app/services/gitea/pull_request/open_service.rb b/app/services/gitea/pull_request/open_service.rb index affdfe112..4d2137f11 100644 --- a/app/services/gitea/pull_request/open_service.rb +++ b/app/services/gitea/pull_request/open_service.rb @@ -8,7 +8,7 @@ class Gitea::PullRequest::OpenService < Gitea::PullRequest::UpdateService # 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) + # Gitea::PullRequest::OpenService.new(owner.login, repo.identifier, pr.gitea_number, 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 diff --git a/app/services/pull_requests/close_service.rb b/app/services/pull_requests/close_service.rb index e0ac19b4e..60a0ab13f 100644 --- a/app/services/pull_requests/close_service.rb +++ b/app/services/pull_requests/close_service.rb @@ -23,7 +23,7 @@ class PullRequests::CloseService < ApplicationService def close_gitea_pull Gitea::PullRequest::CloseService.call(@owner.login, @repo.identifier, - @pull.gpid, @pull.base, current_user.gitea_token) + @pull.gitea_number, @pull.base, current_user.gitea_token) end def update_pull_status! diff --git a/app/services/pull_requests/merge_service.rb b/app/services/pull_requests/merge_service.rb index d5fc102ec..463412120 100644 --- a/app/services/pull_requests/merge_service.rb +++ b/app/services/pull_requests/merge_service.rb @@ -22,7 +22,7 @@ class PullRequests::MergeService < ApplicationService def gitea_pull_merge! result = Gitea::PullRequest::MergeService.call(@current_user.gitea_token, @owner.login, - @repo.identifier, @pull.gpid, gitea_merge_pull_params) + @repo.identifier, @pull.gitea_number, gitea_merge_pull_params) @status, @message = result end diff --git a/app/services/pull_requests/open_service.rb b/app/services/pull_requests/open_service.rb index 3081e52b5..490071c05 100644 --- a/app/services/pull_requests/open_service.rb +++ b/app/services/pull_requests/open_service.rb @@ -23,7 +23,7 @@ class PullRequests::OpenService < ApplicationService def open_gitea_pull Gitea::PullRequest::OpenService.call(@owner.login, @repo.identifier, - @pull.gpid, @pull.base, @current_user.gitea_token) + @pull.gitea_number, @pull.base, @current_user.gitea_token) end def update_pull_status! diff --git a/db/migrate/20210624101058_change_columns_name_from_pull_requests.rb b/db/migrate/20210624101058_change_columns_name_from_pull_requests.rb new file mode 100644 index 000000000..e24af2313 --- /dev/null +++ b/db/migrate/20210624101058_change_columns_name_from_pull_requests.rb @@ -0,0 +1,22 @@ +class ChangeColumnsNameFromPullRequests < ActiveRecord::Migration[5.2] + def change + rename_column :pull_requests, :pull_request_id, :gitea_id + rename_column :pull_requests, :gpid, :gitea_number + + + PullRequest.find_each do |pr| + next if pr.gitea_number.blank? + + project = pr.project + next if project.blank? + + owner = project&.owner + gitea_pull = Gitea::PullRequest::GetService.call(owner.login, project.identifier, pr.gitea_number, owner&.gitea_token) + + next if gitea_pull.blank? + + pr.update_column(:gitea_id, gitea_pull["id"]) + end + + end +end From 6c3c1ce0933c5386798b9a43c8afdec7aabde0b1 Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Fri, 25 Jun 2021 17:53:49 +0800 Subject: [PATCH 11/49] fix: issue show permission --- app/controllers/issues_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 9780d4729..ea6ba0046 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -231,7 +231,7 @@ class IssuesController < ApplicationController end def show - @user_permission = current_user.present? && current_user.logged? && (!@issue.is_lock || @project.member?(current_user) || current_user.admin? || @issue.user == current_user) + @user_permission = current_user.present? && current_user.logged? && (@project.member?(current_user) || current_user.admin? || @issue.user == current_user) @issue_attachments = @issue.attachments @issue_user = @issue.user @issue_assign_to = @issue.get_assign_user @@ -416,7 +416,7 @@ class IssuesController < ApplicationController def operate_issue_permission return render_forbidden("您没有权限进行此操作.") unless current_user.admin? || @project.member?(current_user) end - + def export_issues(issues) @table_columns = %w(ID 类型 标题 描述 状态 指派给 优先级 标签 发布人 创建时间 里程碑 开始时间 截止时间 完成度 分类 金额 属于) @export_issues = [] From 3a475a4674a702422651298d7a850e0f63af6314 Mon Sep 17 00:00:00 2001 From: jasder Date: Mon, 28 Jun 2021 09:59:47 +0800 Subject: [PATCH 12/49] FIX get conflict files bug with create pr api --- app/controllers/pull_requests_controller.rb | 2 +- app/controllers/repositories_controller.rb | 2 +- app/models/pull_request.rb | 6 ++++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/controllers/pull_requests_controller.rb b/app/controllers/pull_requests_controller.rb index 3d9f32a22..987bb156e 100644 --- a/app/controllers/pull_requests_controller.rb +++ b/app/controllers/pull_requests_controller.rb @@ -56,7 +56,7 @@ class PullRequestsController < ApplicationController ActiveRecord::Base.transaction do @pull_request, @gitea_pull_request = PullRequests::CreateService.call(current_user, @owner, @project, params) if @gitea_pull_request[:status] == :success - @pull_request.bind_gitea_pull_request!(@gitea_pull_request[:body]["number"]) + @pull_request.bind_gitea_pull_request!(@gitea_pull_request[:body]["number"], @gitea_pull_request[:body]["id"]) render_ok else render_error("create pull request error: #{@gitea_pull_request[:status]}") diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index 062a8f046..f375b636b 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -316,7 +316,7 @@ class RepositoriesController < ApplicationController local_requests = PullRequest.new(local_params.merge(user_id: current_user.try(:id), project_id: @project.id, issue_id: @pull_issue.id)) if local_requests.save gitea_request = Gitea::PullRequest::CreateService.new(current_user.try(:gitea_token), @owner.login, @project.try(:identifier), requests_params).call - if gitea_request[:status] == :success && local_requests.update_attributes(gpid: gitea_request["body"]["number"]) + if gitea_request[:status] == :success && local_requests.update_attributes(gitea_number: gitea_request["body"]["number"]) local_requests.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "create") end end diff --git a/app/models/pull_request.rb b/app/models/pull_request.rb index 5c9004a06..ce0cb04ad 100644 --- a/app/models/pull_request.rb +++ b/app/models/pull_request.rb @@ -54,8 +54,10 @@ class PullRequest < ApplicationRecord Project.find_by(id: self.fork_project_id) end - def bind_gitea_pull_request!(gitea_pull_number) - update_column(:gitea_number, gitea_pull_number) + def bind_gitea_pull_request!(gitea_pull_number, gitea_pull_id) + update_columns( + gitea_number: gitea_pull_number, + gitea_id: gitea_pull_id) end def merge! From 01341d4389a6574371e54789107f5f65048c3ce3 Mon Sep 17 00:00:00 2001 From: jasder Date: Mon, 28 Jun 2021 10:04:48 +0800 Subject: [PATCH 13/49] =?UTF-8?q?FIX=20pull=E3=80=81=20gitea=20pull=20mode?= =?UTF-8?q?l=20relation=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/gitea/pull.rb | 2 +- app/models/pull_request.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/gitea/pull.rb b/app/models/gitea/pull.rb index 591e36c42..7adb8c366 100644 --- a/app/models/gitea/pull.rb +++ b/app/models/gitea/pull.rb @@ -39,6 +39,6 @@ class Gitea::Pull < Gitea::Base serialize :conflicted_files, Array - belongs_to :pull_request, class_name: '::PullRequest', foreign_key: :id, primary_key: :gitea_number, optional: true + belongs_to :pull_request, class_name: '::PullRequest', foreign_key: :id, primary_key: :gitea_id, optional: true end diff --git a/app/models/pull_request.rb b/app/models/pull_request.rb index ce0cb04ad..aec320858 100644 --- a/app/models/pull_request.rb +++ b/app/models/pull_request.rb @@ -37,7 +37,7 @@ class PullRequest < ApplicationRecord has_many :pull_request_tags, foreign_key: :pull_request_id has_many :project_trends, as: :trend, dependent: :destroy has_many :attachments, as: :container, dependent: :destroy - has_one :gitea_pull, foreign_key: :id, primary_key: :gitea_number, class_name: 'Gitea::Pull' + has_one :gitea_pull, foreign_key: :id, primary_key: :gitea_id, class_name: 'Gitea::Pull' scope :merged_and_closed, ->{where.not(status: 0)} scope :opening, -> {where(status: 0)} From 259090b8e31a336c32e502467ac2a628ed66cdf6 Mon Sep 17 00:00:00 2001 From: viletyy Date: Mon, 28 Jun 2021 21:07:10 +0800 Subject: [PATCH 14/49] fix --- app/models/concerns/project_operable.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/concerns/project_operable.rb b/app/models/concerns/project_operable.rb index a228a7028..a6dc0dd35 100644 --- a/app/models/concerns/project_operable.rb +++ b/app/models/concerns/project_operable.rb @@ -65,7 +65,7 @@ module ProjectOperable if owner.is_a?(User) managers.exists?(user_id: user.id) elsif owner.is_a?(Organization) - managers.exists?(user_id: user.id) || owner.is_only_admin?(user.id) + managers.exists?(user_id: user.id) || owner.is_owner?(user.id) || owner.is_only_admin?(user.id) else false end From 0e7f3a89057725c125bcbf28cfd871ebf12f5448 Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Tue, 29 Jun 2021 10:36:58 +0800 Subject: [PATCH 15/49] fix: project permission and update user lastname --- app/models/concerns/project_operable.rb | 2 +- app/models/user.rb | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/models/concerns/project_operable.rb b/app/models/concerns/project_operable.rb index a228a7028..a6dc0dd35 100644 --- a/app/models/concerns/project_operable.rb +++ b/app/models/concerns/project_operable.rb @@ -65,7 +65,7 @@ module ProjectOperable if owner.is_a?(User) managers.exists?(user_id: user.id) elsif owner.is_a?(Organization) - managers.exists?(user_id: user.id) || owner.is_only_admin?(user.id) + managers.exists?(user_id: user.id) || owner.is_owner?(user.id) || owner.is_only_admin?(user.id) else false end diff --git a/app/models/user.rb b/app/models/user.rb index c943e5efa..4b3934702 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -186,7 +186,7 @@ class User < Owner :show_email, :show_location, :show_department, :technical_title, :province, :city, :custom_department, to: :user_extension, allow_nil: true - before_save :update_hashed_password + before_save :update_hashed_password, :set_lastname after_create do SyncTrustieJob.perform_later("user", 1) if allow_sync_to_trustie? end @@ -779,6 +779,10 @@ class User < Owner self.laboratory = Laboratory.current if laboratory_id.blank? end + + def set_lastname + self.lastname = self.nickname if changes[:nickname].present? + end end From 8331d849d5afdec5cd1dda89eb69b6c8de2f1d70 Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Tue, 29 Jun 2021 17:36:15 +0800 Subject: [PATCH 16/49] fix: forked projects private set --- app/controllers/projects_controller.rb | 4 +- app/models/project.rb | 158 +++++++++--------- .../sync_projects_by_forked_project.rake | 22 +++ 3 files changed, 105 insertions(+), 79 deletions(-) create mode 100644 lib/tasks/sync_projects_by_forked_project.rake diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index c9e1a3a14..1fc0e8176 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -116,10 +116,11 @@ class ProjectsController < ApplicationController Projects::UpdateForm.new(validate_params).validate! - private = params[:private] || false + 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) @project.update_attributes!(new_project_params) + @project.forked_projects&.update(is_public: @project.is_public) gitea_params = { private: private, default_branch: @project.default_branch, @@ -144,6 +145,7 @@ class ProjectsController < ApplicationController ActiveRecord::Base.transaction do Gitea::Repository::DeleteService.new(@project.owner, @project.identifier).call @project.destroy! + @project.forked_projects&.update(forked_from_project_id: nil) render_ok end else diff --git a/app/models/project.rb b/app/models/project.rb index 251b40de1..4a5a9577f 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -1,81 +1,81 @@ -# == Schema Information -# -# Table name: projects -# -# id :integer not null, primary key -# name :string(255) default(""), not null -# description :text(4294967295) -# homepage :string(255) default("") -# is_public :boolean default("1"), not null -# parent_id :integer -# created_on :datetime -# updated_on :datetime -# identifier :string(255) -# status :integer default("1"), not null -# lft :integer -# rgt :integer -# inherit_members :boolean default("0"), not null -# project_type :integer default("0") -# hidden_repo :boolean default("0"), not null -# attachmenttype :integer default("1") -# user_id :integer -# dts_test :integer default("0") -# enterprise_name :string(255) -# organization_id :integer -# project_new_type :integer -# gpid :integer -# forked_from_project_id :integer -# forked_count :integer default("0") -# publish_resource :integer default("0") -# visits :integer default("0") -# hot :integer default("0") -# invite_code :string(255) -# qrcode :string(255) -# qrcode_expiretime :integer default("0") -# script :text(65535) -# training_status :integer default("0") -# rep_identifier :string(255) -# project_category_id :integer -# project_language_id :integer -# license_id :integer -# ignore_id :integer -# praises_count :integer default("0") -# watchers_count :integer default("0") -# issues_count :integer default("0") -# pull_requests_count :integer default("0") -# language :string(255) -# versions_count :integer default("0") -# issue_tags_count :integer default("0") -# closed_issues_count :integer default("0") -# open_devops :boolean default("0") -# gitea_webhook_id :integer -# open_devops_count :integer default("0") -# recommend :boolean default("0") -# platform :integer default("0") -# default_branch :string(255) default("master") -# website :string(255) -# order_index :integer default("0") -# lesson_url :string(255) -# -# Indexes -# -# index_projects_on_forked_from_project_id (forked_from_project_id) -# index_projects_on_identifier (identifier) -# index_projects_on_invite_code (invite_code) -# index_projects_on_is_public (is_public) -# index_projects_on_lft (lft) -# index_projects_on_license_id (license_id) -# index_projects_on_name (name) -# index_projects_on_platform (platform) -# index_projects_on_project_category_id (project_category_id) -# index_projects_on_project_language_id (project_language_id) -# index_projects_on_project_type (project_type) -# index_projects_on_recommend (recommend) -# index_projects_on_rgt (rgt) -# index_projects_on_status (status) -# index_projects_on_updated_on (updated_on) -# - +# == Schema Information +# +# Table name: projects +# +# id :integer not null, primary key +# name :string(255) default(""), not null +# description :text(4294967295) +# homepage :string(255) default("") +# is_public :boolean default("1"), not null +# parent_id :integer +# created_on :datetime +# updated_on :datetime +# identifier :string(255) +# status :integer default("1"), not null +# lft :integer +# rgt :integer +# inherit_members :boolean default("0"), not null +# project_type :integer default("0") +# hidden_repo :boolean default("0"), not null +# attachmenttype :integer default("1") +# user_id :integer +# dts_test :integer default("0") +# enterprise_name :string(255) +# organization_id :integer +# project_new_type :integer +# gpid :integer +# forked_from_project_id :integer +# forked_count :integer default("0") +# publish_resource :integer default("0") +# visits :integer default("0") +# hot :integer default("0") +# invite_code :string(255) +# qrcode :string(255) +# qrcode_expiretime :integer default("0") +# script :text(65535) +# training_status :integer default("0") +# rep_identifier :string(255) +# project_category_id :integer +# project_language_id :integer +# license_id :integer +# ignore_id :integer +# praises_count :integer default("0") +# watchers_count :integer default("0") +# issues_count :integer default("0") +# pull_requests_count :integer default("0") +# language :string(255) +# versions_count :integer default("0") +# issue_tags_count :integer default("0") +# closed_issues_count :integer default("0") +# open_devops :boolean default("0") +# gitea_webhook_id :integer +# open_devops_count :integer default("0") +# recommend :boolean default("0") +# platform :integer default("0") +# default_branch :string(255) default("master") +# website :string(255) +# order_index :integer default("0") +# lesson_url :string(255) +# +# Indexes +# +# index_projects_on_forked_from_project_id (forked_from_project_id) +# index_projects_on_identifier (identifier) +# index_projects_on_invite_code (invite_code) +# index_projects_on_is_public (is_public) +# index_projects_on_lft (lft) +# index_projects_on_license_id (license_id) +# index_projects_on_name (name) +# index_projects_on_platform (platform) +# index_projects_on_project_category_id (project_category_id) +# index_projects_on_project_language_id (project_language_id) +# index_projects_on_project_type (project_type) +# index_projects_on_recommend (recommend) +# index_projects_on_rgt (rgt) +# index_projects_on_status (status) +# index_projects_on_updated_on (updated_on) +# + @@ -101,10 +101,12 @@ class Project < ApplicationRecord belongs_to :organization_extension, foreign_key: :user_id, primary_key: :organization_id, optional: true, counter_cache: :num_projects belongs_to :project_category, optional: true , :counter_cache => true belongs_to :project_language, optional: true , :counter_cache => true + belongs_to :forked_from_project, class_name: 'Project', optional: true, foreign_key: :forked_from_project_id has_many :project_trends, dependent: :destroy has_many :watchers, as: :watchable, dependent: :destroy has_many :fork_users, dependent: :destroy has_many :forked_users, class_name: 'ForkUser', foreign_key: :fork_project_id, dependent: :destroy + has_many :forked_projects, class_name: 'Project', foreign_key: :forked_from_project_id has_one :project_educoder, dependent: :destroy has_one :project_score, dependent: :destroy diff --git a/lib/tasks/sync_projects_by_forked_project.rake b/lib/tasks/sync_projects_by_forked_project.rake new file mode 100644 index 000000000..0e7876974 --- /dev/null +++ b/lib/tasks/sync_projects_by_forked_project.rake @@ -0,0 +1,22 @@ +namespace :sync_projects_by_forked_project do + desc "sync projects is_public by forked project" + task is_public: :environment do + count = 0 + Project.where.not(forked_from_project_id: nil).find_each do |project| + project.update(is_public: project&.forked_from_project&.is_public) + count +=1 + end + puts "共同步了#{count}个项目" + end + + task destroy: :environment do + count = 0 + Project.where.not(forked_from_project_id: nil).find_each do |project| + if project.forked_from_project.nil? + project.update(forked_from_project_id: nil) + count +=1 + end + end + puts "共同步了#{count}个项目" + end +end \ No newline at end of file From 4cc46f4cb45a73072d73d63146135ee4bf50a28c Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Tue, 29 Jun 2021 18:05:37 +0800 Subject: [PATCH 17/49] fix --- app/controllers/projects_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 1fc0e8176..fee3ae759 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -120,7 +120,7 @@ class ProjectsController < ApplicationController new_project_params = project_params.except(:private).merge(is_public: !private) @project.update_attributes!(new_project_params) - @project.forked_projects&.update(is_public: @project.is_public) + @project.forked_projects.update_all(is_public: @project.is_public) gitea_params = { private: private, default_branch: @project.default_branch, @@ -145,7 +145,7 @@ class ProjectsController < ApplicationController ActiveRecord::Base.transaction do Gitea::Repository::DeleteService.new(@project.owner, @project.identifier).call @project.destroy! - @project.forked_projects&.update(forked_from_project_id: nil) + @project.forked_projects.update_all(forked_from_project_id: nil) render_ok end else From f19219a467809f28d99790ac7ea9a83749e57688 Mon Sep 17 00:00:00 2001 From: jasder Date: Wed, 30 Jun 2021 14:30:01 +0800 Subject: [PATCH 18/49] =?UTF-8?q?FIX=20=E8=A7=A3=E5=86=B3=E6=A0=87?= =?UTF-8?q?=E7=AD=BE=E5=88=97=E8=A1=A8=E5=92=8C=E5=8F=91=E8=A1=8C=E7=89=88?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E4=B8=AD=E4=B8=8B=E5=91=A8zip=E5=8C=85?= =?UTF-8?q?=E3=80=81tar=E5=8C=85=E5=AF=BC=E8=87=B4=E7=9A=84404=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/repositories/tags.json.jbuilder | 4 ++-- app/views/version_releases/index.json.jbuilder | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/views/repositories/tags.json.jbuilder b/app/views/repositories/tags.json.jbuilder index 23dae4265..9db3ff93e 100644 --- a/app/views/repositories/tags.json.jbuilder +++ b/app/views/repositories/tags.json.jbuilder @@ -2,8 +2,8 @@ json.array! @tags do |tag| if tag.present? json.name tag['name'] json.id tag['id'] - json.zipball_url tag['zipball_url'] - json.tarball_url tag['tarball_url'] + json.zipball_url render_zip_url(@owner, @repository, tag['name']) + json.tarball_url render_tar_url(@owner, @repository, tag['name']) json.commit do json.sha tag['commit']['sha'] end diff --git a/app/views/version_releases/index.json.jbuilder b/app/views/version_releases/index.json.jbuilder index f1730ffa9..88ae36f26 100644 --- a/app/views/version_releases/index.json.jbuilder +++ b/app/views/version_releases/index.json.jbuilder @@ -14,8 +14,8 @@ json.releases do json.name re["name"] json.body re["body"] json.url re["url"] - json.tarball_url re["tarball_url"] - json.zipball_url re["zipball_url"] + json.tarball_url render_tar_url(@owner, @repository, re["tag_name"]) + json.zipball_url render_zip_url(@owner, @repository, re["tag_name"]) json.draft re["draft"] ? "草稿" : (re["prerelease"] ? "预发行" : "稳定") json.created_at format_time(version.created_at.to_s.to_time) json.published_at format_time(version.created_at.to_s.to_time) @@ -30,8 +30,8 @@ json.releases do json.name re["name"] json.body re["body"] json.url re["url"] - json.tarball_url re["tarball_url"] - json.zipball_url re["zipball_url"] + json.tarball_url render_tar_url(@owner, @repository, re["tag_name"]) + json.zipball_url render_zip_url(@owner, @repository, re["tag_name"]) json.draft re["draft"] ? "草稿" : (re["prerelease"] ? "预发行" : "稳定") json.created_at format_time(version.created_at.to_s.to_time) json.published_at format_time(version.created_at.to_s.to_time) From 2a72fc56a4ef6ac194ed5fe3dd051db0a32874dd Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Thu, 1 Jul 2021 13:56:15 +0800 Subject: [PATCH 19/49] fix: copy issue author id --- app/controllers/issues_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index ea6ba0046..2360dc787 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -316,6 +316,7 @@ class IssuesController < ApplicationController def copy @new_issue = @issue.dup + @new_issue.author_id = current_user.id if @new_issue.save issue_tags = @issue.issue_tags.pluck(:id) if issue_tags.present? From d1939116a3219f824e821a89701c6549712f857a Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Thu, 1 Jul 2021 13:58:36 +0800 Subject: [PATCH 20/49] fix: authorize --- app/controllers/issues_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 2360dc787..3af2f6536 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -3,7 +3,7 @@ class IssuesController < ApplicationController before_action :load_project before_action :set_user before_action :check_issue_permission - before_action :operate_issue_permission, only:[:create, :update, :destroy, :clean, :series_update] + before_action :operate_issue_permission, only:[:create, :update, :destroy, :clean, :series_update, :copy] before_action :check_project_public, only: [:index ,:show, :copy, :index_chosen, :close_issue] before_action :set_issue, only: [:edit, :update, :destroy, :show, :copy, :close_issue, :lock_issue] From 312fca7e2bcf6f9792a6c420bab3ba5ff8e58971 Mon Sep 17 00:00:00 2001 From: viletyy Date: Thu, 1 Jul 2021 17:55:48 +0800 Subject: [PATCH 21/49] fix: update shell simple --- lib/tasks/sync_projects_by_forked_project.rake | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/tasks/sync_projects_by_forked_project.rake b/lib/tasks/sync_projects_by_forked_project.rake index 0e7876974..d6cd1f210 100644 --- a/lib/tasks/sync_projects_by_forked_project.rake +++ b/lib/tasks/sync_projects_by_forked_project.rake @@ -2,9 +2,13 @@ namespace :sync_projects_by_forked_project do desc "sync projects is_public by forked project" task is_public: :environment do count = 0 - Project.where.not(forked_from_project_id: nil).find_each do |project| - project.update(is_public: project&.forked_from_project&.is_public) - count +=1 + Project.where.not(forked_from_project_id: nil).group(:forked_from_project_id).count.each do |k, _| + project = Project.find_by_id(k) + need_update_forked_projects = Project.where(forked_from_project_id: k) + need_update_forked_projects.update_all(is_public: project&.is_public) + need_update_forked_repositories = Repository.where(project_id: need_update_forked_projects.ids) + need_update_forked_repositories.update_all(hidden: !project&.is_public) + count +=need_update_forked_projects.size end puts "共同步了#{count}个项目" end From e76d475fefb3c74bf216763c5447b3474adb6bcd Mon Sep 17 00:00:00 2001 From: jasder Date: Tue, 6 Jul 2021 11:04:00 +0800 Subject: [PATCH 22/49] FIX show realname for create project --- app/views/owners/index.json.jbuilder | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/owners/index.json.jbuilder b/app/views/owners/index.json.jbuilder index 677aff71a..6b7e5222e 100644 --- a/app/views/owners/index.json.jbuilder +++ b/app/views/owners/index.json.jbuilder @@ -2,6 +2,6 @@ json.total_count @owners.size json.owners @owners.each do |owner| json.id owner.id json.type owner.type - json.name owner.login + json.name owner&.show_real_name json.avatar_url url_to_avatar(owner) end \ No newline at end of file From ff21916f182d185c40ccf9e6cd2d9981c20f09e0 Mon Sep 17 00:00:00 2001 From: viletyy Date: Fri, 9 Jul 2021 13:48:48 +0800 Subject: [PATCH 23/49] fix: merge from develop --- app/models/project.rb | 85 +------------------------------------------ 1 file changed, 2 insertions(+), 83 deletions(-) diff --git a/app/models/project.rb b/app/models/project.rb index 14810b713..6fc1f1db4 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -1,82 +1,3 @@ -<<<<<<< HEAD -# == Schema Information -# -# Table name: projects -# -# id :integer not null, primary key -# name :string(255) default(""), not null -# description :text(4294967295) -# homepage :string(255) default("") -# is_public :boolean default("1"), not null -# parent_id :integer -# created_on :datetime -# updated_on :datetime -# identifier :string(255) -# status :integer default("1"), not null -# lft :integer -# rgt :integer -# inherit_members :boolean default("0"), not null -# project_type :integer default("0") -# hidden_repo :boolean default("0"), not null -# attachmenttype :integer default("1") -# user_id :integer -# dts_test :integer default("0") -# enterprise_name :string(255) -# organization_id :integer -# project_new_type :integer -# gpid :integer -# forked_from_project_id :integer -# forked_count :integer default("0") -# publish_resource :integer default("0") -# visits :integer default("0") -# hot :integer default("0") -# invite_code :string(255) -# qrcode :string(255) -# qrcode_expiretime :integer default("0") -# script :text(65535) -# training_status :integer default("0") -# rep_identifier :string(255) -# project_category_id :integer -# project_language_id :integer -# praises_count :integer default("0") -# watchers_count :integer default("0") -# issues_count :integer default("0") -# pull_requests_count :integer default("0") -# language :string(255) -# versions_count :integer default("0") -# issue_tags_count :integer default("0") -# closed_issues_count :integer default("0") -# open_devops :boolean default("0") -# gitea_webhook_id :integer -# open_devops_count :integer default("0") -# recommend :boolean default("0") -# platform :integer default("0") -# license_id :integer -# ignore_id :integer -# default_branch :string(255) default("master") -# website :string(255) -# lesson_url :string(255) -# -# Indexes -# -# index_projects_on_forked_from_project_id (forked_from_project_id) -# index_projects_on_identifier (identifier) -# index_projects_on_invite_code (invite_code) -# index_projects_on_is_public (is_public) -# index_projects_on_lft (lft) -# index_projects_on_license_id (license_id) -# index_projects_on_name (name) -# index_projects_on_platform (platform) -# index_projects_on_project_category_id (project_category_id) -# index_projects_on_project_language_id (project_language_id) -# index_projects_on_project_type (project_type) -# index_projects_on_recommend (recommend) -# index_projects_on_rgt (rgt) -# index_projects_on_status (status) -# index_projects_on_updated_on (updated_on) -# - -======= # == Schema Information # # Table name: projects @@ -116,8 +37,6 @@ # rep_identifier :string(255) # project_category_id :integer # project_language_id :integer -# license_id :integer -# ignore_id :integer # praises_count :integer default("0") # watchers_count :integer default("0") # issues_count :integer default("0") @@ -131,9 +50,10 @@ # open_devops_count :integer default("0") # recommend :boolean default("0") # platform :integer default("0") +# license_id :integer +# ignore_id :integer # default_branch :string(255) default("master") # website :string(255) -# order_index :integer default("0") # lesson_url :string(255) # # Indexes @@ -155,7 +75,6 @@ # index_projects_on_updated_on (updated_on) # ->>>>>>> develop From 3614f3e15b700d16c0b4ae5910d296975d437d41 Mon Sep 17 00:00:00 2001 From: jasder Date: Fri, 9 Jul 2021 16:57:11 +0800 Subject: [PATCH 24/49] =?UTF-8?q?FIX=20=E8=A7=A3=E5=86=B3=E7=A7=81?= =?UTF-8?q?=E6=9C=89=E7=89=88=E6=9C=AC=E5=BA=93=E5=BA=93=E4=B8=8D=E8=83=BD?= =?UTF-8?q?=E8=AE=BF=E9=97=AE=E3=80=81=E4=B8=8B=E8=BD=BD=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/repositories_helper.rb | 37 ++++++++++++++++++- .../repositories/_simple_entry.json.jbuilder | 11 +++++- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb index e704acb83..95c669b76 100644 --- a/app/helpers/repositories_helper.rb +++ b/app/helpers/repositories_helper.rb @@ -15,7 +15,7 @@ module RepositoriesHelper end def image_type?(str) - default_type = %w(png jpg gif tif psd svg) + default_type = %w(png jpg gif tif psd svg gif bmp webp jpeg) default_type.include?(str&.downcase) end @@ -86,4 +86,39 @@ module RepositoriesHelper render_decode64_content(entry['content']) end end + + def base64_to_image(path, content) + # generate to https://git.trusite.net/pawm36ozq/-/raw/branch/master/entrn.png" + content = Base64.decode64(content) + File.open(path, 'wb') { |f| f.write(content) } + end + + def render_download_image_url(dir_path, file_path, content) + # 用户名/项目标识/文件路径 + dir_path = generate_dir_path(dir_path) + + file_path = [dir_path, file_path].join('/') + + puts "##### render_download_image_url file_path: #{file_path}" + base64_to_image(file_path, content) + + file_path = file_path.split('public')[1] + File.join(base_url, file_path) + end + + def generate_dir_path(dir_path) + # tmp_dir_path + # eg: jasder/forgeplus/raw/branch/ref + dir_path = ["public", tmp_dir, dir_path].join('/') + puts "#### dir_path: #{dir_path}" + unless Dir.exists?(dir_path) + FileUtils.mkdir_p(dir_path) ##不成功这里会抛异常 + end + dir_path + end + + def tmp_dir + "repo" + end + end diff --git a/app/views/repositories/_simple_entry.json.jbuilder b/app/views/repositories/_simple_entry.json.jbuilder index ec2a045bb..7d41bbd23 100644 --- a/app/views/repositories/_simple_entry.json.jbuilder +++ b/app/views/repositories/_simple_entry.json.jbuilder @@ -11,7 +11,16 @@ if @project.forge? json.content decode64_content(entry, @owner, @repository, @ref) json.target entry['target'] - json.download_url entry['download_url'] + + download_url = + if image_type + dir_path = [@owner.login, @repository.identifier, "raw/branch", @ref].join('/') + render_download_image_url(dir_path, entry['path'], decode64_content(entry, @owner, @repository, @ref)) + else + entry['download_url'] + end + json.download_url download_url + json.direct_download direct_download json.image_type image_type json.is_readme_file is_readme?(entry['type'], entry['name']) From fa8594d2ab27c305cf13ab3d3d5509afa388d46d Mon Sep 17 00:00:00 2001 From: viletyy Date: Mon, 12 Jul 2021 12:02:34 +0800 Subject: [PATCH 25/49] add: merge pr check status --- app/controllers/pull_requests_controller.rb | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/app/controllers/pull_requests_controller.rb b/app/controllers/pull_requests_controller.rb index 8521cd4b3..6409aa19a 100644 --- a/app/controllers/pull_requests_controller.rb +++ b/app/controllers/pull_requests_controller.rb @@ -150,9 +150,16 @@ class PullRequestsController < ApplicationController else ActiveRecord::Base.transaction do begin - result = PullRequests::MergeService.call(@owner, @repository, @pull_request, current_user, params) + @gitea_pull = Gitea::PullRequest::GetService.call(@owner.login, @repository.identifier, @pull_request.gitea_number, current_user&.gitea_token) - if result.status == 200 && @pull_request.merge! + if @gitea_pull["merged_by"].present? + success_condition = true + else + result = PullRequests::MergeService.call(@owner, @repository, @pull_request, current_user, params) + success_condition = result.status == 200 + end + + if success_condition && @pull_request.merge! @pull_request.project_trend_status! @issue&.custom_journal_detail("merge", "", "该合并请求已被合并", current_user&.id) normal_status(1, "合并成功") From d271a684fa053bd891866435437b5f63de08216b Mon Sep 17 00:00:00 2001 From: viletyy Date: Mon, 12 Jul 2021 17:24:23 +0800 Subject: [PATCH 26/49] add: compare code return can merge message --- app/controllers/compare_controller.rb | 36 +++++++++++++++++++++------ app/views/compare/show.json.jbuilder | 1 + 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/app/controllers/compare_controller.rb b/app/controllers/compare_controller.rb index 63ca58aa6..4b6860153 100644 --- a/app/controllers/compare_controller.rb +++ b/app/controllers/compare_controller.rb @@ -6,26 +6,48 @@ class CompareController < ApplicationController end def show + load_compare_params compare + @merge_message = get_merge_message end private + def get_merge_message + if @base.blank? || @head.blank? + return "请选择分支" + else + if @head.include?(":") + fork_project = @project.forked_projects.joins(:owner).where(users: {login: @head.to_s.split("/")[0]}).take + return "请选择正确的仓库" unless fork_project.present? + @exist_pullrequest = @project.pull_requests.where(is_original: true, head: @head.to_s.split(":")[1], base: @base, status: 0, fork_project_id: fork_project.id).take + else + @exist_pullrequest = @project.pull_requests.where(is_original: false, head: @base, base: @head, status: 0).take + end + if @exist_pullrequest.present? + return "在这些分支之间的合并请求已存在:#{@exist_pullrequest.try(:title)}" + else + if @compare_result["Commits"].blank? && @compare_result["Diff"].blank? + return "分支内容相同,无需创建合并请求" + end + end + end + return "可以合并" + end + def compare - base, head = compare_params # TODO: 处理fork的项目向源项目发送PR的base、head参数问题 @compare_result ||= - head.include?(":") ? gitea_compare(base, head) : gitea_compare(head, base) + @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] + def load_compare_params + @base = Addressable::URI.unescape(params[:base]) + @head = params[:head].include?('json') ? params[:head]&.split('.json')[0] : params[:head] - [base, head] end def gitea_compare(base, head) - Gitea::Repository::Commits::CompareService.call(@owner.login, @project.identifier, base, head) + Gitea::Repository::Commits::CompareService.call(@owner.login, @project.identifier, @base, @head) end end diff --git a/app/views/compare/show.json.jbuilder b/app/views/compare/show.json.jbuilder index 8b75fa3dd..91260e560 100644 --- a/app/views/compare/show.json.jbuilder +++ b/app/views/compare/show.json.jbuilder @@ -83,3 +83,4 @@ json.diff do end end +json.message @merge_message \ No newline at end of file From 55a0bcfb82a49fd8351f9379e8d587ec4c7ab5b8 Mon Sep 17 00:00:00 2001 From: viletyy Date: Mon, 12 Jul 2021 17:33:10 +0800 Subject: [PATCH 27/49] fix --- app/models/project.rb | 8 -------- 1 file changed, 8 deletions(-) diff --git a/app/models/project.rb b/app/models/project.rb index fc78de658..a47ee4239 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -1,7 +1,3 @@ -<<<<<<< HEAD -======= - ->>>>>>> develop # == Schema Information # # Table name: projects @@ -79,10 +75,6 @@ # index_projects_on_updated_on (updated_on) # -<<<<<<< HEAD -======= - ->>>>>>> develop class Project < ApplicationRecord include Matchable From 4929734a1a30dc57e144f9e4cf4f4bbd6fa8781d Mon Sep 17 00:00:00 2001 From: viletyy Date: Mon, 12 Jul 2021 17:57:42 +0800 Subject: [PATCH 28/49] fix --- app/controllers/compare_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/compare_controller.rb b/app/controllers/compare_controller.rb index 4b6860153..71f495637 100644 --- a/app/controllers/compare_controller.rb +++ b/app/controllers/compare_controller.rb @@ -48,6 +48,6 @@ class CompareController < ApplicationController end def gitea_compare(base, head) - Gitea::Repository::Commits::CompareService.call(@owner.login, @project.identifier, @base, @head) + Gitea::Repository::Commits::CompareService.call(@owner.login, @project.identifier, base, head) end end From de2b54c39e05e1f6d19cf72f645dfd8b6331378a Mon Sep 17 00:00:00 2001 From: viletyy Date: Mon, 12 Jul 2021 18:10:26 +0800 Subject: [PATCH 29/49] add: compare code return can merge status --- app/controllers/compare_controller.rb | 12 ++++++------ app/views/compare/show.json.jbuilder | 1 + 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/app/controllers/compare_controller.rb b/app/controllers/compare_controller.rb index 71f495637..b36ffde36 100644 --- a/app/controllers/compare_controller.rb +++ b/app/controllers/compare_controller.rb @@ -8,30 +8,30 @@ class CompareController < ApplicationController def show load_compare_params compare - @merge_message = get_merge_message + @merge_status, @merge_message = get_merge_message end private def get_merge_message if @base.blank? || @head.blank? - return "请选择分支" + return -2, "请选择分支" else if @head.include?(":") fork_project = @project.forked_projects.joins(:owner).where(users: {login: @head.to_s.split("/")[0]}).take - return "请选择正确的仓库" unless fork_project.present? + return -2, "请选择正确的仓库" unless fork_project.present? @exist_pullrequest = @project.pull_requests.where(is_original: true, head: @head.to_s.split(":")[1], base: @base, status: 0, fork_project_id: fork_project.id).take else @exist_pullrequest = @project.pull_requests.where(is_original: false, head: @base, base: @head, status: 0).take end if @exist_pullrequest.present? - return "在这些分支之间的合并请求已存在:#{@exist_pullrequest.try(:title)}" + return -2, "在这些分支之间的合并请求已存在:#{@exist_pullrequest.try(:title)}" else if @compare_result["Commits"].blank? && @compare_result["Diff"].blank? - return "分支内容相同,无需创建合并请求" + return -2, "分支内容相同,无需创建合并请求" end end end - return "可以合并" + return 0, "可以合并" end def compare diff --git a/app/views/compare/show.json.jbuilder b/app/views/compare/show.json.jbuilder index 91260e560..0037d8be8 100644 --- a/app/views/compare/show.json.jbuilder +++ b/app/views/compare/show.json.jbuilder @@ -83,4 +83,5 @@ json.diff do end end +json.status @merge_status json.message @merge_message \ No newline at end of file From fd3fab99aec44f17681d41e43a1b4b912f1ecacc Mon Sep 17 00:00:00 2001 From: viletyy Date: Wed, 14 Jul 2021 09:55:12 +0800 Subject: [PATCH 30/49] fix: compare code need token --- app/controllers/compare_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/compare_controller.rb b/app/controllers/compare_controller.rb index b36ffde36..bc81da563 100644 --- a/app/controllers/compare_controller.rb +++ b/app/controllers/compare_controller.rb @@ -48,6 +48,6 @@ class CompareController < ApplicationController end def gitea_compare(base, head) - Gitea::Repository::Commits::CompareService.call(@owner.login, @project.identifier, base, head) + Gitea::Repository::Commits::CompareService.call(@owner.login, @project.identifier, base, head, current_user.gitea_token) end end From 2ddf1dbd0188206152cd532fa73e790f17c2ccaa Mon Sep 17 00:00:00 2001 From: viletyy Date: Wed, 14 Jul 2021 11:48:52 +0800 Subject: [PATCH 31/49] add: gitea user keys api --- .../gitea/user/keys/create_service.rb | 21 +++++++++++++++ .../gitea/user/keys/delete_service.rb | 22 ++++++++++++++++ app/services/gitea/user/keys/get_service.rb | 22 ++++++++++++++++ app/services/gitea/user/keys/list_service.rb | 26 +++++++++++++++++++ 4 files changed, 91 insertions(+) create mode 100644 app/services/gitea/user/keys/create_service.rb create mode 100644 app/services/gitea/user/keys/delete_service.rb create mode 100644 app/services/gitea/user/keys/get_service.rb create mode 100644 app/services/gitea/user/keys/list_service.rb diff --git a/app/services/gitea/user/keys/create_service.rb b/app/services/gitea/user/keys/create_service.rb new file mode 100644 index 000000000..2b720c483 --- /dev/null +++ b/app/services/gitea/user/keys/create_service.rb @@ -0,0 +1,21 @@ +class Gitea::User::Keys::CreateService < Gitea::ClientService + attr_reader :token, :params + def initialize(token, params) + @token = token + @params = params + end + + def call + response = post(url, request_params) + render_response(response) + end + + private + def request_params + Hash.new.merge({token: token, data: params}) + end + + def url + '/user/keys'.freeze + end +end \ No newline at end of file diff --git a/app/services/gitea/user/keys/delete_service.rb b/app/services/gitea/user/keys/delete_service.rb new file mode 100644 index 000000000..2e6a125fd --- /dev/null +++ b/app/services/gitea/user/keys/delete_service.rb @@ -0,0 +1,22 @@ +class Gitea::User::Keys::DeleteService < Gitea::ClientService + attr_reader :token, :key_id + + def initialize(token, key_id) + @token = token + @key_id = key_id + end + + def call + delete(url, params) + end + + private + + def params + Hash.new.merge(token: token) + end + + def url + "/user/keys/#{key_id}".freeze + end +end diff --git a/app/services/gitea/user/keys/get_service.rb b/app/services/gitea/user/keys/get_service.rb new file mode 100644 index 000000000..fbcf1c86e --- /dev/null +++ b/app/services/gitea/user/keys/get_service.rb @@ -0,0 +1,22 @@ +class Gitea::User::Keys::GetService < Gitea::ClientService + attr_reader :token, :key_id + + def initialize(token, key_id) + @token = token + @key_id = key_id + end + + def call + response = get(url, params) + render_response(response) + end + + private + def params + Hash.new.merge({token: token}) + end + + def url + "/user/keys/#{key_id}".freeze + end +end \ No newline at end of file diff --git a/app/services/gitea/user/keys/list_service.rb b/app/services/gitea/user/keys/list_service.rb new file mode 100644 index 000000000..1ddfde413 --- /dev/null +++ b/app/services/gitea/user/keys/list_service.rb @@ -0,0 +1,26 @@ +class Gitea::User::Keys::ListService < Gitea::ClientService + attr_reader :token, :page, :limit, :fingerprint + + def initialize(token, page, limit, fingerprint="") + @token = token + @page = page + @limit = limit + @fingerprint = fingerprint + end + + def call + response = get(url, params) + render_response(response) + end + + private + + def params + Hash.new.merge({token: token, fingerprint: fingerprint, page: page, limit: limit}) + end + + def url + '/user/keys'.freeze + end + +end \ No newline at end of file From 998381585a3db76c2949bf7dfa37f3e37500affd Mon Sep 17 00:00:00 2001 From: viletyy Date: Wed, 14 Jul 2021 15:38:14 +0800 Subject: [PATCH 32/49] add: user public keys controller --- app/controllers/public_keys_controller.rb | 62 +++++ app/docs/slate/source/api.html.md | 1 + .../slate/source/includes/_public_keys.md | 158 +++++++++++ app/models/gitea/public_key.rb | 9 + app/models/user.rb | 1 + app/views/public_keys/create.json.jbuilder | 5 + app/views/public_keys/index.json.jbuilder | 5 + config/routes.rb | 2 + public/docs/api.html | 259 ++++++++++++++++++ 9 files changed, 502 insertions(+) create mode 100644 app/controllers/public_keys_controller.rb create mode 100644 app/docs/slate/source/includes/_public_keys.md create mode 100644 app/models/gitea/public_key.rb create mode 100644 app/views/public_keys/create.json.jbuilder create mode 100644 app/views/public_keys/index.json.jbuilder diff --git a/app/controllers/public_keys_controller.rb b/app/controllers/public_keys_controller.rb new file mode 100644 index 000000000..a16266abd --- /dev/null +++ b/app/controllers/public_keys_controller.rb @@ -0,0 +1,62 @@ +class PublicKeysController < ApplicationController + before_action :require_login + before_action :find_public_key, only: [:destroy] + + def index + @public_keys = current_user.public_keys + @public_keys = kaminari_paginate(@public_keys) + rescue Exception => e + uid_logger_error(e.message) + tip_exception(e.message) + end + + def create + return render_error("请输入密钥") if public_key_params[:key].blank? + return render_error("请输入标题") if public_key_params[:title].blank? + @gitea_response = Gitea::User::Keys::CreateService.call(current_user.gitea_token, public_key_params) + if @gitea_response[0] == 201 + @public_key = @gitea_response[2] + puts @public_key + else + return render_error if @gitea_response[2]["message"].nil? + return render_error("密钥格式不正确") if @gitea_response[2]["message"].starts_with?("Invalid key content") + return render_error("密钥已存在,请勿重复添加") if @gitea_response[2]["message"].starts_with?("Key content has been used as non-deploy key") + puts @gitea_response[2] + @public_key = nil + end + rescue Exception => e + uid_logger_error(e.message) + tip_exception(e.message) + end + + def destroy + return render_not_found unless @public_key.present? + if @public_key.destroy + render_ok + else + render_error + end + rescue Exception => e + uid_logger_error(e.message) + tip_exception(e.message) + end + + private + + def page + params[:page].to_i.zero? ? 1 : params[:page].to_i + end + + def limit + limit = params[:limit] || params[:per_page] + limit = (limit.to_i.zero? || limit.to_i > 15) ? 15 : limit.to_i + end + + def public_key_params + params.require(:public_key).permit(:key, :title) + end + + def find_public_key + @public_key = current_user.public_keys.find_by_id(params[:id]) + end +end \ No newline at end of file diff --git a/app/docs/slate/source/api.html.md b/app/docs/slate/source/api.html.md index a08823a4e..a846317c4 100644 --- a/app/docs/slate/source/api.html.md +++ b/app/docs/slate/source/api.html.md @@ -12,6 +12,7 @@ toc_footers: includes: - licenses - gitignores + - public_keys - users - projects - repositories diff --git a/app/docs/slate/source/includes/_public_keys.md b/app/docs/slate/source/includes/_public_keys.md new file mode 100644 index 000000000..60d73c01a --- /dev/null +++ b/app/docs/slate/source/includes/_public_keys.md @@ -0,0 +1,158 @@ + +# PublicKeys + +## public_keys列表 +获取public_keys列表,支持分页 + +> 示例: + +```shell +curl -X GET \ +http://localhost:3000/api/public_keys.json +``` + +```javascript +await octokit.request('GET /api/public_keys.json') +``` + +### HTTP 请求 +`GET api/public_keys.json` + +### 请求参数 +参数 | 必选 | 默认 | 类型 | 字段说明 +--------- | ------- | ------- | -------- | ---------- +page |否| 1 | int | 页码 | +limit |否| 15 | int | 每页数量 | + +### 返回字段说明 +参数 | 类型 | 字段说明 +--------- | ----------- | ----------- +total_count |int |总数 | +public_keys.id |int |ID| +public_keys.name |string|密钥标题| +public_keys.content |string|密钥内容| +public_keys.fingerprint |string|密钥标识| +public_keys.created_time |string|密钥创建时间| + + +> 返回的JSON示例: + +```json +{ + "total_count": 1, + "public_keys": [ + { + "id": 16, + "name": "xxx", + "content": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDe5ETOTB5PcmcYJkIhfF7+mxmJQDCLg7/LnMoKHpKoo/jYUnFU9OjfsxVo3FTNUvh2475WXMAur5KsFoNKjK9+JHxvoXyJKmyVPWgXU/NRxQyaWPnPLPK8qPRF5ksJE6feBOqtsdxsvBiHs2r1NX/U26Ecnpr6avudD0cmyrEfbYMWbupLrhsd39dswPT73f3W5jc7B9Y47Ioiv8UOju3ABt1+kpuAjaaVC6VtUQoEFiZb1y33yBnyePya7dvFyApyD4ILyyIG2rtZWK7l53YFnwZDuFsTWjEEEQD0U4FBSFdH5wtwx0WQLMSNyTtaFBSG0kJ+uiQQIrxlvikcm63df7zbC3/rWLPsKgW122Zt966dcpFqiCiJNDKZPPw3qpg8TBL6X+qIZ+FxVEk/16/zScpyEfoxQp0GvgxI7hPLErmfkC5tMsib8MAXYBNyvJXna0vg/wOaNNIaI4SAH9Ksh3f/TtalYVjp6WxIwVBfnbq51WnmlnEXePtX6XjAGL+GbF2VQ1nv/IzrY09tNbTV6wQsrSIP3VDzYQxdJ1rdsVNMoJB0H2Pu0NdcSz53Wx45N+myD0QnE05ss+zDp5StY90OYsx2aCo6qAA8Qn2jUjdta7MQWwkPfKrta4tTQ0XbWMjx4/E1+l3J5liwZkl2XOGOwhfXdRsBjaEziZ18kQ== yystopf@163.com", + "fingerprint": "SHA256:cU8AK/+roqUUyiaYXIdS2Nj4+Rb2p6rqWSeRDc+aqKM", + "created_unix": 1626246596, + "created_time": "2021/07/14 15:09" + } + ] +} +``` + + +## 创建public_key +创建public_key + +> 示例: + +```shell +curl -X POST \ +http://localhost:3000/api/public_keys.json +``` + +```javascript +await octokit.request('POST /api/public_keys.json') +``` + +### HTTP 请求 +`POST api/public_keys.json` + +### 请求参数 +参数 | 必选 | 默认 | 类型 | 字段说明 +--------- | ------- | ------- | -------- | ---------- +key |是 | 否 | string | 密钥 | +title |是 | 否 | string | 密钥标题 | + +> 请求的JSON示例: +```json +{ + "public_key": { + "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDe5ETOTB5PcmcYJkIhfF7+mxmJQDCLg7/LnMoKHpKoo/jYUnFU9OjfsxVo3FTNUvh2475WXMAur5KsFoNKjK9+JHxvoXyJKmyVPWgXU/NRxQyaWPnPLPK8qPRF5ksJE6feBOqtsdxsvBiHs2r1NX/U26Ecnpr6avudD0cmyrEfbYMWbupLrhsd39dswPT73f3W5jc7B9Y47Ioiv8UOju3ABt1+kpuAjaaVC6VtUQoEFiZb1y33yBnyePya7dvFyApyD4ILyyIG2rtZWK7l53YFnwZDuFsTWjEEEQD0U4FBSFdH5wtwx0WQLMSNyTtaFBSG0kJ+uiQQIrxlvikcm63df7zbC3/rWLPsKgW122Zt966dcpFqiCiJNDKZPPw3qpg8TBL6X+qIZ+FxVEk/16/zScpyEfoxQp0GvgxI7hPLErmfkC5tMsib8MAXYBNyvJXna0vg/wOaNNIaI4SAH9Ksh3f/TtalYVjp6WxIwVBfnbq51WnmlnEXePtX6XjAGL+GbF2VQ1nv/IzrY09tNbTV6wQsrSIP3VDzYQxdJ1rdsVNMoJB0H2Pu0NdcSz53Wx45N+myD0QnE05ss+zDp5StY90OYsx2aCo6qAA8Qn2jUjdta7MQWwkPfKrta4tTQ0XbWMjx4/E1+l3J5liwZkl2XOGOwhfXdRsBjaEziZ18kQ== yystopf@163.com", + "title": "xxx" + } +} +``` + +### 返回字段说明 +参数 | 类型 | 字段说明 +--------- | ----------- | ----------- +total_count |int |总数 | +id |int |ID| +name |string|密钥标题| +content |string|密钥内容| +fingerprint |string|密钥标识| +created_time |string|密钥创建时间| + + +> 返回的JSON示例: + +```json +{ + "id": 17, + "name": "xxx", + "content": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDe5ETOTB5PcmcYJkIhfF7+mxmJQDCLg7/LnMoKHpKoo/jYUnFU9OjfsxVo3FTNUvh2475WXMAur5KsFoNKjK9+JHxvoXyJKmyVPWgXU/NRxQyaWPnPLPK8qPRF5ksJE6feBOqtsdxsvBiHs2r1NX/U26Ecnpr6avudD0cmyrEfbYMWbupLrhsd39dswPT73f3W5jc7B9Y47Ioiv8UOju3ABt1+kpuAjaaVC6VtUQoEFiZb1y33yBnyePya7dvFyApyD4ILyyIG2rtZWK7l53YFnwZDuFsTWjEEEQD0U4FBSFdH5wtwx0WQLMSNyTtaFBSG0kJ+uiQQIrxlvikcm63df7zbC3/rWLPsKgW122Zt966dcpFqiCiJNDKZPPw3qpg8TBL6X+qIZ+FxVEk/16/zScpyEfoxQp0GvgxI7hPLErmfkC5tMsib8MAXYBNyvJXna0vg/wOaNNIaI4SAH9Ksh3f/TtalYVjp6WxIwVBfnbq51WnmlnEXePtX6XjAGL+GbF2VQ1nv/IzrY09tNbTV6wQsrSIP3VDzYQxdJ1rdsVNMoJB0H2Pu0NdcSz53Wx45N+myD0QnE05ss+zDp5StY90OYsx2aCo6qAA8Qn2jUjdta7MQWwkPfKrta4tTQ0XbWMjx4/E1+l3J5liwZkl2XOGOwhfXdRsBjaEziZ18kQ== yystopf@163.com", + "fingerprint": "SHA256:cU8AK/+roqUUyiaYXIdS2Nj4+Rb2p6rqWSeRDc+aqKM", + "created_time": "2021/07/14 15:26" +} +``` + + + +## 删除public_key +删除public_key + +> 示例: + +```shell +curl -X DELETE \ +http://localhost:3000/api/public_keys/:id.json +``` + +```javascript +await octokit.request('DELETE /api/public_keys/:id.json') +``` + +### HTTP 请求 +`DELETE api/public_keys/:id.json` + +### 请求参数 +参数 | 必选 | 默认 | 类型 | 字段说明 +--------- | ------- | ------- | -------- | ---------- +id |是 | 否 | int | 密钥ID | + + +> 返回的JSON示例: + +```json +{ + "status": 0, + "message": "success" +} +``` + + diff --git a/app/models/gitea/public_key.rb b/app/models/gitea/public_key.rb new file mode 100644 index 000000000..bc37c3bc7 --- /dev/null +++ b/app/models/gitea/public_key.rb @@ -0,0 +1,9 @@ +class Gitea::PublicKey < Gitea::Base + self.inheritance_column = nil # FIX The single-table inheritance mechanism failed + # establish_connection :gitea_db + + self.table_name = "public_key" + + belongs_to :user, class_name: '::User', foreign_key: :gitea_uid, primary_key: :owner_id, optional: true + +end diff --git a/app/models/user.rb b/app/models/user.rb index c70678533..cbf0c66f7 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -169,6 +169,7 @@ class User < Owner accepts_nested_attributes_for :is_pinned_projects has_many :issues, dependent: :destroy, foreign_key: :author_id has_many :pull_requests, dependent: :destroy + has_many :public_keys, class_name: "Gitea::PublicKey",primary_key: :gitea_uid, foreign_key: :owner_id, dependent: :destroy # Groups and active users scope :active, lambda { where(status: STATUS_ACTIVE) } diff --git a/app/views/public_keys/create.json.jbuilder b/app/views/public_keys/create.json.jbuilder new file mode 100644 index 000000000..bcbcb9451 --- /dev/null +++ b/app/views/public_keys/create.json.jbuilder @@ -0,0 +1,5 @@ +json.id @public_key["id"] +json.name @public_key["title"] +json.content @public_key["key"] +json.fingerprint @public_key["fingerprint"] +json.created_time @public_key["created_at"].to_time.strftime("%Y/%m/%d %H:%M") \ No newline at end of file diff --git a/app/views/public_keys/index.json.jbuilder b/app/views/public_keys/index.json.jbuilder new file mode 100644 index 000000000..6710529bb --- /dev/null +++ b/app/views/public_keys/index.json.jbuilder @@ -0,0 +1,5 @@ +json.total_count @public_keys.total_count +json.public_keys @public_keys do |public_key| + json.(public_key, :id, :name, :content, :fingerprint, :created_unix) + json.created_time Time.at(public_key.created_unix).strftime("%Y/%m/%d %H:%M") +end \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index de2206fdc..0cc16406c 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -71,6 +71,8 @@ Rails.application.routes.draw do # end end + resources :public_keys, only: [:index, :create, :destroy] + resources :statistic, only: [:index] do collection do get :platform_profile diff --git a/public/docs/api.html b/public/docs/api.html index 5061a1ac2..47e51427b 100644 --- a/public/docs/api.html +++ b/public/docs/api.html @@ -325,6 +325,20 @@ +
  • + PublicKeys + +
  • Users
      @@ -626,6 +640,251 @@ http://localhost:3000/api/ignores.json + +

      PublicKeys

      public_keys列表

      +

      获取public_keys列表,支持分页

      + +
      +

      示例:

      +
      +
      curl -X GET \
      +http://localhost:3000/api/public_keys.json
      +
      await octokit.request('GET /api/public_keys.json')
      +

      HTTP 请求

      +

      GET api/public_keys.json

      +

      请求参数

      + + + + + + + + + + + + + + + + + + + + + + + +
      参数必选默认类型字段说明
      page1int页码
      limit15int每页数量
      +

      返回字段说明

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      参数类型字段说明
      total_countint总数
      public_keys.idintID
      public_keys.namestring密钥标题
      public_keys.contentstring密钥内容
      public_keys.fingerprintstring密钥标识
      public_keys.created_timestring密钥创建时间
      + +
      +

      返回的JSON示例:

      +
      +
      {
      +    "total_count": 1,
      +    "public_keys": [
      +        {
      +            "id": 16,
      +            "name": "xxx",
      +            "content": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDe5ETOTB5PcmcYJkIhfF7+mxmJQDCLg7/LnMoKHpKoo/jYUnFU9OjfsxVo3FTNUvh2475WXMAur5KsFoNKjK9+JHxvoXyJKmyVPWgXU/NRxQyaWPnPLPK8qPRF5ksJE6feBOqtsdxsvBiHs2r1NX/U26Ecnpr6avudD0cmyrEfbYMWbupLrhsd39dswPT73f3W5jc7B9Y47Ioiv8UOju3ABt1+kpuAjaaVC6VtUQoEFiZb1y33yBnyePya7dvFyApyD4ILyyIG2rtZWK7l53YFnwZDuFsTWjEEEQD0U4FBSFdH5wtwx0WQLMSNyTtaFBSG0kJ+uiQQIrxlvikcm63df7zbC3/rWLPsKgW122Zt966dcpFqiCiJNDKZPPw3qpg8TBL6X+qIZ+FxVEk/16/zScpyEfoxQp0GvgxI7hPLErmfkC5tMsib8MAXYBNyvJXna0vg/wOaNNIaI4SAH9Ksh3f/TtalYVjp6WxIwVBfnbq51WnmlnEXePtX6XjAGL+GbF2VQ1nv/IzrY09tNbTV6wQsrSIP3VDzYQxdJ1rdsVNMoJB0H2Pu0NdcSz53Wx45N+myD0QnE05ss+zDp5StY90OYsx2aCo6qAA8Qn2jUjdta7MQWwkPfKrta4tTQ0XbWMjx4/E1+l3J5liwZkl2XOGOwhfXdRsBjaEziZ18kQ== yystopf@163.com",
      +            "fingerprint": "SHA256:cU8AK/+roqUUyiaYXIdS2Nj4+Rb2p6rqWSeRDc+aqKM",
      +            "created_unix": 1626246596,
      +            "created_time": "2021/07/14 15:09"
      +        }
      +    ]
      +}
      +
      + +

      创建public_key

      +

      创建public_key

      + +
      +

      示例:

      +
      +
      curl -X POST \
      +http://localhost:3000/api/public_keys.json
      +
      await octokit.request('POST /api/public_keys.json')
      +

      HTTP 请求

      +

      POST api/public_keys.json

      +

      请求参数

      + + + + + + + + + + + + + + + + + + + + + + + +
      参数必选默认类型字段说明
      keystring密钥
      titlestring密钥标题
      + +
      +

      请求的JSON示例: +json +{ + "public_key": { + "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDe5ETOTB5PcmcYJkIhfF7+mxmJQDCLg7/LnMoKHpKoo/jYUnFU9OjfsxVo3FTNUvh2475WXMAur5KsFoNKjK9+JHxvoXyJKmyVPWgXU/NRxQyaWPnPLPK8qPRF5ksJE6feBOqtsdxsvBiHs2r1NX/U26Ecnpr6avudD0cmyrEfbYMWbupLrhsd39dswPT73f3W5jc7B9Y47Ioiv8UOju3ABt1+kpuAjaaVC6VtUQoEFiZb1y33yBnyePya7dvFyApyD4ILyyIG2rtZWK7l53YFnwZDuFsTWjEEEQD0U4FBSFdH5wtwx0WQLMSNyTtaFBSG0kJ+uiQQIrxlvikcm63df7zbC3/rWLPsKgW122Zt966dcpFqiCiJNDKZPPw3qpg8TBL6X+qIZ+FxVEk/16/zScpyEfoxQp0GvgxI7hPLErmfkC5tMsib8MAXYBNyvJXna0vg/wOaNNIaI4SAH9Ksh3f/TtalYVjp6WxIwVBfnbq51WnmlnEXePtX6XjAGL+GbF2VQ1nv/IzrY09tNbTV6wQsrSIP3VDzYQxdJ1rdsVNMoJB0H2Pu0NdcSz53Wx45N+myD0QnE05ss+zDp5StY90OYsx2aCo6qAA8Qn2jUjdta7MQWwkPfKrta4tTQ0XbWMjx4/E1+l3J5liwZkl2XOGOwhfXdRsBjaEziZ18kQ== yystopf@163.com", + "title": "xxx" + } +} +

      +
      +

      返回字段说明

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      参数类型字段说明
      total_countint总数
      idintID
      namestring密钥标题
      contentstring密钥内容
      fingerprintstring密钥标识
      created_timestring密钥创建时间
      + +
      +

      返回的JSON示例:

      +
      +
      {
      +    "id": 17,
      +    "name": "xxx",
      +    "content": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDe5ETOTB5PcmcYJkIhfF7+mxmJQDCLg7/LnMoKHpKoo/jYUnFU9OjfsxVo3FTNUvh2475WXMAur5KsFoNKjK9+JHxvoXyJKmyVPWgXU/NRxQyaWPnPLPK8qPRF5ksJE6feBOqtsdxsvBiHs2r1NX/U26Ecnpr6avudD0cmyrEfbYMWbupLrhsd39dswPT73f3W5jc7B9Y47Ioiv8UOju3ABt1+kpuAjaaVC6VtUQoEFiZb1y33yBnyePya7dvFyApyD4ILyyIG2rtZWK7l53YFnwZDuFsTWjEEEQD0U4FBSFdH5wtwx0WQLMSNyTtaFBSG0kJ+uiQQIrxlvikcm63df7zbC3/rWLPsKgW122Zt966dcpFqiCiJNDKZPPw3qpg8TBL6X+qIZ+FxVEk/16/zScpyEfoxQp0GvgxI7hPLErmfkC5tMsib8MAXYBNyvJXna0vg/wOaNNIaI4SAH9Ksh3f/TtalYVjp6WxIwVBfnbq51WnmlnEXePtX6XjAGL+GbF2VQ1nv/IzrY09tNbTV6wQsrSIP3VDzYQxdJ1rdsVNMoJB0H2Pu0NdcSz53Wx45N+myD0QnE05ss+zDp5StY90OYsx2aCo6qAA8Qn2jUjdta7MQWwkPfKrta4tTQ0XbWMjx4/E1+l3J5liwZkl2XOGOwhfXdRsBjaEziZ18kQ== yystopf@163.com",
      +    "fingerprint": "SHA256:cU8AK/+roqUUyiaYXIdS2Nj4+Rb2p6rqWSeRDc+aqKM",
      +    "created_time": "2021/07/14 15:26"
      +}
      +
      + +

      删除public_key

      +

      删除public_key

      + +
      +

      示例:

      +
      +
      curl -X DELETE \
      +http://localhost:3000/api/public_keys/:id.json
      +
      await octokit.request('DELETE /api/public_keys/:id.json')
      +

      HTTP 请求

      +

      DELETE api/public_keys/:id.json

      +

      请求参数

      + + + + + + + + + + + + + + + + +
      参数必选默认类型字段说明
      idint密钥ID
      + +
      +

      返回的JSON示例:

      +
      +
      {
      +    "status": 0,
      +    "message": "success"
      +}
      +
      +