From c6cf4a26ab96498fd9068a56bf1b5d04e68b6520 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Sat, 11 Jan 2020 15:56:06 +0800 Subject: [PATCH 1/5] FIX migrate repository's bug --- app/services/projects/migrate_service.rb | 12 ++++++++---- app/services/repositories/migrate_service.rb | 8 ++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/services/projects/migrate_service.rb b/app/services/projects/migrate_service.rb index 0a5c8dfde..aea0607d2 100644 --- a/app/services/projects/migrate_service.rb +++ b/app/services/projects/migrate_service.rb @@ -30,14 +30,14 @@ class Projects::MigrateService < ApplicationService description: params[:description], project_category_id: params[:project_category_id], project_language_id: params[:project_language_id], - is_public: get_is_public, + is_public: project_secretion[:public], project_type: Project.project_types[:mirror] } end def repository_params { - hidden: get_is_public, + hidden: project_secretion[:hidden], identifier: params[:repository_name], mirror_url: params[:clone_addr], user_id: user.id, @@ -45,7 +45,11 @@ class Projects::MigrateService < ApplicationService } end - def get_is_public - params[:private] || false + def project_secretion + # 默认公开 + public, hidden = true, false + public, hidden = false, true if ActiveModel::Type::Boolean.new.cast(params[:private]) == true + + { public: public, hidden: hidden } end end diff --git a/app/services/repositories/migrate_service.rb b/app/services/repositories/migrate_service.rb index a413950e7..0991a75c8 100644 --- a/app/services/repositories/migrate_service.rb +++ b/app/services/repositories/migrate_service.rb @@ -25,15 +25,11 @@ class Repositories::MigrateService < ApplicationService private def sync_project(gitea_repository) - project.update_columns(gpid: gitea_repository["id"]) if gitea_repository + project.update_columns(gpid: gitea_repository["id"], identifier: gitea_repository["name"]) if gitea_repository end def sync_repository(repository, gitea_repository) - repository.update_columns(url: remote_repository_url) if gitea_repository - end - - def remote_repository_url - [Gitea.gitea_config[:domain], '/', user.login, '/', params[:identifier], ".git"].join("") + repository.update_columns(url: gitea_repository["clone_url"]) if gitea_repository end def repository_params From 68c7cbc07dbed1f68abbd755e106c21ca7068d2f Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Sat, 11 Jan 2020 17:11:46 +0800 Subject: [PATCH 2/5] ADD gem --- Gemfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Gemfile b/Gemfile index 70838ca40..96450c8a8 100644 --- a/Gemfile +++ b/Gemfile @@ -105,6 +105,8 @@ gem 'enumerize' gem 'diffy' +gem 'deep_cloneable', '~> 3.0.0' + # oauth2 gem 'omniauth', '~> 1.9.0' gem 'omniauth-oauth2', '~> 1.6.0' From ac881d131a312eca04caa61956a3256bb4fb1c57 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Sat, 11 Jan 2020 17:12:53 +0800 Subject: [PATCH 3/5] ADD fork project --- app/controllers/application_controller.rb | 4 +- app/controllers/forks_controller.rb | 20 ++++++++++ app/helpers/forks_helper.rb | 2 + app/models/repository.rb | 2 +- app/services/gitea/client_service.rb | 2 +- app/services/gitea/repository/fork_service.rb | 32 ++++++++++++++++ app/services/projects/fork_service.rb | 38 +++++++++++++++++++ app/views/forks/create.json.jbuilder | 6 +++ 8 files changed, 102 insertions(+), 4 deletions(-) create mode 100644 app/controllers/forks_controller.rb create mode 100644 app/helpers/forks_helper.rb create mode 100644 app/services/gitea/repository/fork_service.rb create mode 100644 app/services/projects/fork_service.rb create mode 100644 app/views/forks/create.json.jbuilder diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index f676959f1..456f503a3 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -328,7 +328,7 @@ class ApplicationController < ActionController::Base def current_user # User.current - User.find_by_id 50207 + User.find_by_id 36401 end ## 默认输出json @@ -643,7 +643,7 @@ class ApplicationController < ActionController::Base end def find_project - @project = Project.find_by_identifier!(params[:id]) || (Project.find params[:project_id]) + @project = Project.find_by_identifier!(params[:id]) || (Project.find params[:project_id]) || (Project.find params[:id]) render_not_found("未找到’#{params[:id]}’相关的项目") unless @project end diff --git a/app/controllers/forks_controller.rb b/app/controllers/forks_controller.rb new file mode 100644 index 000000000..66253a3a4 --- /dev/null +++ b/app/controllers/forks_controller.rb @@ -0,0 +1,20 @@ +class ForksController < ApplicationController + before_action :require_login, :find_project_with_id + before_action :authenticate_project!, :authenticate_user! + + def create + @new_project = Projects::ForkService.new(current_user, @project, params[:organization]).call + end + + private + def authenticate_project! + return if current_user != @project.owner + render_result(1, "自己不能fork自己的项目") + end + + def authenticate_user! + return if @project.is_public + return if @project.member?(current_user) || current_user.admin? + render_forbidden('你没有权限操作') + end +end diff --git a/app/helpers/forks_helper.rb b/app/helpers/forks_helper.rb new file mode 100644 index 000000000..b720976ee --- /dev/null +++ b/app/helpers/forks_helper.rb @@ -0,0 +1,2 @@ +module ForksHelper +end diff --git a/app/models/repository.rb b/app/models/repository.rb index 441a3b236..a1e30f785 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -4,7 +4,7 @@ class Repository < ApplicationRecord belongs_to :user has_many :version_releases, dependent: :destroy - validates :identifier, presence: true, uniqueness: true + validates :identifier, presence: true def to_param self.identifier.parameterize diff --git a/app/services/gitea/client_service.rb b/app/services/gitea/client_service.rb index 6d9fcfd14..41f1f26c1 100644 --- a/app/services/gitea/client_service.rb +++ b/app/services/gitea/client_service.rb @@ -123,7 +123,7 @@ class Gitea::ClientService < ApplicationService mark = "[gitea] " case response.status - when 201, 200 + when 201, 200, 202 if response.body.size > 0 JSON.parse(response&.body) else diff --git a/app/services/gitea/repository/fork_service.rb b/app/services/gitea/repository/fork_service.rb new file mode 100644 index 000000000..dce925b8a --- /dev/null +++ b/app/services/gitea/repository/fork_service.rb @@ -0,0 +1,32 @@ +class Gitea::Repository::ForkService < Gitea::ClientService + attr_reader :old_owner, :target_owner, :repo_name, :organization + + # old_owner: 被clone的项目(源项目)拥有者 + # target_owner: clone后的醒目(新项目)的拥有者 + # body: + # { + # "organization": "string" #组织名称 + # } + def initialize(old_owner, target_owner, repo_name, organization=nil) + @old_owner = old_owner + @target_owner = target_owner + @repo_name = repo_name + end + + def call + post(url, request_params) + end + + private + + def request_params + hash = Hash.new.merge(token: target_owner.gitea_token) + hash = hash.merge(data: {organization: organization}) if organization + hash + end + + def url + "/repos/#{old_owner.login}/#{repo_name}/forks".freeze + end + +end diff --git a/app/services/projects/fork_service.rb b/app/services/projects/fork_service.rb new file mode 100644 index 000000000..9ad9f4fa0 --- /dev/null +++ b/app/services/projects/fork_service.rb @@ -0,0 +1,38 @@ +class Projects::ForkService < ApplicationService + attr_reader :target_owner, :project, :organization + + def initialize(target_owner, project, organization=nil) + @target_owner = target_owner + @project = project + @organization = organization + end + + def call + ActiveRecord::Base.transaction do + clone_project = + @project.deep_clone include: :repository, + only: [:name, :description,:is_public, :identifier, + :rep_identifier, :project_category_id, :project_language_id, + :license_id, :ignore_id, {repository: [:identifier, :hidden]}] + + clone_project.owner = @target_owner + clone_project.forked_from_project_id = @project.id + clone_project.save! + + new_repository = clone_project.repository + new_repository.user = @target_owner + new_repository.save! + + result = Gitea::Repository::ForkService.new(@project.owner, @target_owner, @project.identifier, @organization).call + + @project.update_column('forked_count', @project.forked_count + 1) + new_repository.update_column('url', result['clone_url']) if result + + clone_project + end + rescue => e + puts "clone project service error: #{e.message}" + raise Error, e.message + end + +end diff --git a/app/views/forks/create.json.jbuilder b/app/views/forks/create.json.jbuilder new file mode 100644 index 000000000..f9f960ef4 --- /dev/null +++ b/app/views/forks/create.json.jbuilder @@ -0,0 +1,6 @@ +if @new_project + json.id @new_project.id + json.identifier @new_project.identifier +else + json.nil! +end From d320ae40e94d0ebce062060a6d287481fd441fe0 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Sat, 11 Jan 2020 17:13:11 +0800 Subject: [PATCH 4/5] Update README.md --- README.md | 64 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 51 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 2b2558276..68a59d21d 100644 --- a/README.md +++ b/README.md @@ -371,10 +371,10 @@ POST api/projects/migrate ``` curl -X POST \ -d "user_id=36401" \ --d "clone_addr=https://gitee.com/openeuler/A-Tune.git" \ --d "name=A-Tune" \ --d "description=my first project" \ --d "repository_name=mirror_demo" \ +-d "clone_addr=https://gitea.com/mx8090alex/golden.git" \ +-d "name=golden" \ +-d "description=golden" \ +-d "repository_name=golden" \ -d "project_category_id=1" \ -d "project_language_id=2" \ http://localhost:3000/api/projects/migrate | jq @@ -431,13 +431,22 @@ curl -X GET http://localhost:3000/api/projects/3263 | jq -|-|- |id |int |id | |name |string|项目名称| +|identifier |string|项目标识| +|is_public |boolean|项目是否公开, true:公开,false:私有| +|description |string|项目简介| +|repo_id |int|仓库id| +|repo_identifier|string|仓库标识| 返回值 ``` { - "id": 3240, - "name": "好项目" + "name": "ni项目", + "identifier": "mirror_demo", + "is_public": true, + "description": "my first project mirror_demo", + "repo_id": 75073, + "repo_identifier": "mirror_demo" } ``` --- @@ -449,14 +458,11 @@ PUT api/projects/:id *示例* ``` curl -X PUT \ --d "user_id=36401" \ -d "name=hnfl_demo" \ -d "description=my first project" \ -d "repository_name=hnfl_demo" \ -d "project_category_id=1" \ -d "project_language_id=2" \ --d "ignore_id=2" \ --d "license_id=1" \ http://localhost:3000/api/projects/3263 | jq ``` *请求参数说明:* @@ -495,8 +501,8 @@ POST api/projects/:id/members *示例* ``` curl -X POST \ --d "user_id=36400" \ -http://localhost:3000/api/projects/3263/members | jq +-d "user_id=36406" \ +http://localhost:3000/api/projects/3297/members | jq ``` *请求参数说明:* @@ -558,7 +564,7 @@ http://localhost:3000/api/projects/3263/members/remove | jq ``` --- -#### 更改项目成员角色 +#### 更改项目成员角色/权限 ``` PUT api/projects/:id/members/change_role ``` @@ -655,6 +661,38 @@ http://localhost:3000/api/projects/3263/members | jq ``` --- +#### Fork项目 +``` +POST /api/projects/:project_id/forks +``` +*示例* +``` +curl -X POST http://localhost:3000/api/projects/3297/forks | jq +``` +*请求参数说明:* + +|参数名|必选|类型|说明| +-|-|-|- +|project_id |是|int |项目id | + + +*返回参数说明:* + +|参数名|类型|说明| +-|-|- +|id |int |项目id | +|identifier |string|项目标识| + + +返回值 +``` +{ + "id": 3290, + "identifier": "newadm" +} +``` +--- + #### 获取代码目录列表 ``` POST api/:login/:repo_identifier/entries @@ -731,7 +769,7 @@ GET api/:login/:repo_identifier/sub_entries ``` curl -X GET \ -d "ref=master" \ --d "filepath=test1_create_file6.rb" \ +-d "filepath=test1_create_file.rb" \ http://localhost:3000/api/18816895620/mirror_demo/sub_entries | jq ``` *请求参数说明:* From ce22365511856eb66d1de56ff6258f463603cf39 Mon Sep 17 00:00:00 2001 From: Jasder <2053003901@@qq.com> Date: Sat, 11 Jan 2020 20:22:31 +0800 Subject: [PATCH 5/5] FIX edit file permission --- README.md | 12 ++++++++---- app/helpers/projects_helper.rb | 7 +++++++ app/views/repositories/show.json.jbuilder | 2 ++ 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 68a59d21d..311e91aea 100644 --- a/README.md +++ b/README.md @@ -1279,6 +1279,8 @@ http://localhost:3000/api/18816895620/mirror_demo | jq |watchers_count |int|关注数量| |branches_count |int|分支数量| |commits_count |int|总提交记录数量| +|permission |string|当前登录用户对该仓库的操作权限, Manager:管理员,可以在线编辑文件、在线新建文件、可以设置仓库的基本信息; Developer:开发人员,可在线编辑文件、在线新建文件、不能设置仓库信息; Reporter: 报告人员,只能查看信息,不能设置仓库信息、不能在线编辑文件、不能在线新建文件;用户未登录时也会返回Reporter, 说明也只有读取文件的权限 | +|mirror_url |string|镜像地址, 只有通过镜像过来的项目才会有这个地址| |author |object|提交用户| |-- login |string|用户名称| |-- image_url |string|用户头像| @@ -1288,11 +1290,13 @@ http://localhost:3000/api/18816895620/mirror_demo | jq ``` { "identifier": "mirror_demo", - "praises_count": 0, + "praises_count": 1, "forked_count": 0, - "watchers_count": 0, - "branches_count": 4, - "commits_count": 81, + "watchers_count": 1, + "branches_count": 6, + "commits_count": 105, + "permission": "Manager", + "mirror_url": "https://gitea.com/CasperVector/slew.git", "author": { "name": "18816895620", "image_url": "avatars/User/b" diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index ee77ed698..2096a7dc9 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -22,4 +22,11 @@ module ProjectsHelper def gitea_domain Gitea.gitea_config[:domain] end + + def render_edit_project_permission(user, project) + permission = "Reporter" + member = project.members.includes(:roles).find_by(user: user) + + member&.roles&.last&.name || permission + end end diff --git a/app/views/repositories/show.json.jbuilder b/app/views/repositories/show.json.jbuilder index c2bb14637..1fc9700f7 100644 --- a/app/views/repositories/show.json.jbuilder +++ b/app/views/repositories/show.json.jbuilder @@ -4,4 +4,6 @@ json.forked_count @repo.project.forked_count json.watchers_count @repo.project.watchers_count json.branches_count @branches_count json.commits_count @commits_count +json.permission render_edit_project_permission(current_user, @repo.project) +json.mirror_url @repo.mirror_url json.partial! 'author', locals: { user: @repo.user }