dev_forge
caicai8 5 years ago
commit c0ff34ae36

@ -105,6 +105,8 @@ gem 'enumerize'
gem 'diffy' gem 'diffy'
gem 'deep_cloneable', '~> 3.0.0'
# oauth2 # oauth2
gem 'omniauth', '~> 1.9.0' gem 'omniauth', '~> 1.9.0'
gem 'omniauth-oauth2', '~> 1.6.0' gem 'omniauth-oauth2', '~> 1.6.0'

@ -371,10 +371,10 @@ POST api/projects/migrate
``` ```
curl -X POST \ curl -X POST \
-d "user_id=36401" \ -d "user_id=36401" \
-d "clone_addr=https://gitee.com/openeuler/A-Tune.git" \ -d "clone_addr=https://gitea.com/mx8090alex/golden.git" \
-d "name=A-Tune" \ -d "name=golden" \
-d "description=my first project" \ -d "description=golden" \
-d "repository_name=mirror_demo" \ -d "repository_name=golden" \
-d "project_category_id=1" \ -d "project_category_id=1" \
-d "project_language_id=2" \ -d "project_language_id=2" \
http://localhost:3000/api/projects/migrate | jq http://localhost:3000/api/projects/migrate | jq
@ -431,13 +431,22 @@ curl -X GET http://localhost:3000/api/projects/3263 | jq
-|-|- -|-|-
|id |int |id | |id |int |id |
|name |string|项目名称| |name |string|项目名称|
|identifier |string|项目标识|
|is_public |boolean|项目是否公开, true:公开false:私有|
|description |string|项目简介|
|repo_id |int|仓库id|
|repo_identifier|string|仓库标识|
返回值 返回值
``` ```
{ {
"id": 3240, "name": "ni项目",
"name": "好项目" "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 \ curl -X PUT \
-d "user_id=36401" \
-d "name=hnfl_demo" \ -d "name=hnfl_demo" \
-d "description=my first project" \ -d "description=my first project" \
-d "repository_name=hnfl_demo" \ -d "repository_name=hnfl_demo" \
-d "project_category_id=1" \ -d "project_category_id=1" \
-d "project_language_id=2" \ -d "project_language_id=2" \
-d "ignore_id=2" \
-d "license_id=1" \
http://localhost:3000/api/projects/3263 | jq http://localhost:3000/api/projects/3263 | jq
``` ```
*请求参数说明:* *请求参数说明:*
@ -495,8 +501,8 @@ POST api/projects/:id/members
*示例* *示例*
``` ```
curl -X POST \ curl -X POST \
-d "user_id=36400" \ -d "user_id=36406" \
http://localhost:3000/api/projects/3263/members | jq 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 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 POST api/:login/:repo_identifier/entries
@ -731,7 +769,7 @@ GET api/:login/:repo_identifier/sub_entries
``` ```
curl -X GET \ curl -X GET \
-d "ref=master" \ -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 http://localhost:3000/api/18816895620/mirror_demo/sub_entries | jq
``` ```
*请求参数说明:* *请求参数说明:*
@ -1241,6 +1279,8 @@ http://localhost:3000/api/18816895620/mirror_demo | jq
|watchers_count |int|关注数量| |watchers_count |int|关注数量|
|branches_count |int|分支数量| |branches_count |int|分支数量|
|commits_count |int|总提交记录数量| |commits_count |int|总提交记录数量|
|permission |string|当前登录用户对该仓库的操作权限, Manager:管理员,可以在线编辑文件、在线新建文件、可以设置仓库的基本信息; Developer:开发人员,可在线编辑文件、在线新建文件、不能设置仓库信息; Reporter: 报告人员只能查看信息不能设置仓库信息、不能在线编辑文件、不能在线新建文件用户未登录时也会返回Reporter, 说明也只有读取文件的权限 |
|mirror_url |string|镜像地址, 只有通过镜像过来的项目才会有这个地址|
|author |object|提交用户| |author |object|提交用户|
|-- login |string|用户名称| |-- login |string|用户名称|
|-- image_url |string|用户头像| |-- image_url |string|用户头像|
@ -1250,11 +1290,13 @@ http://localhost:3000/api/18816895620/mirror_demo | jq
``` ```
{ {
"identifier": "mirror_demo", "identifier": "mirror_demo",
"praises_count": 0, "praises_count": 1,
"forked_count": 0, "forked_count": 0,
"watchers_count": 0, "watchers_count": 1,
"branches_count": 4, "branches_count": 6,
"commits_count": 81, "commits_count": 105,
"permission": "Manager",
"mirror_url": "https://gitea.com/CasperVector/slew.git",
"author": { "author": {
"name": "18816895620", "name": "18816895620",
"image_url": "avatars/User/b" "image_url": "avatars/User/b"

@ -328,7 +328,7 @@ class ApplicationController < ActionController::Base
def current_user def current_user
# User.current # User.current
User.find_by_id 50207 User.find_by_id 36401
end end
## 默认输出json ## 默认输出json
@ -643,7 +643,7 @@ class ApplicationController < ActionController::Base
end end
def find_project 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 render_not_found("未找到’#{params[:id]}’相关的项目") unless @project
end end

@ -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

@ -0,0 +1,2 @@
module ForksHelper
end

@ -22,4 +22,11 @@ module ProjectsHelper
def gitea_domain def gitea_domain
Gitea.gitea_config[:domain] Gitea.gitea_config[:domain]
end 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 end

@ -4,7 +4,7 @@ class Repository < ApplicationRecord
belongs_to :user belongs_to :user
has_many :version_releases, dependent: :destroy has_many :version_releases, dependent: :destroy
validates :identifier, presence: true, uniqueness: true validates :identifier, presence: true
def to_param def to_param
self.identifier.parameterize self.identifier.parameterize

@ -123,7 +123,7 @@ class Gitea::ClientService < ApplicationService
mark = "[gitea] " mark = "[gitea] "
case response.status case response.status
when 201, 200 when 201, 200, 202
if response.body.size > 0 if response.body.size > 0
JSON.parse(response&.body) JSON.parse(response&.body)
else else

@ -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

@ -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

@ -30,14 +30,14 @@ class Projects::MigrateService < ApplicationService
description: params[:description], description: params[:description],
project_category_id: params[:project_category_id], project_category_id: params[:project_category_id],
project_language_id: params[:project_language_id], project_language_id: params[:project_language_id],
is_public: get_is_public, is_public: project_secretion[:public],
project_type: Project.project_types[:mirror] project_type: Project.project_types[:mirror]
} }
end end
def repository_params def repository_params
{ {
hidden: get_is_public, hidden: project_secretion[:hidden],
identifier: params[:repository_name], identifier: params[:repository_name],
mirror_url: params[:clone_addr], mirror_url: params[:clone_addr],
user_id: user.id, user_id: user.id,
@ -45,7 +45,11 @@ class Projects::MigrateService < ApplicationService
} }
end end
def get_is_public def project_secretion
params[:private] || false # 默认公开
public, hidden = true, false
public, hidden = false, true if ActiveModel::Type::Boolean.new.cast(params[:private]) == true
{ public: public, hidden: hidden }
end end
end end

@ -25,15 +25,11 @@ class Repositories::MigrateService < ApplicationService
private private
def sync_project(gitea_repository) 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 end
def sync_repository(repository, gitea_repository) def sync_repository(repository, gitea_repository)
repository.update_columns(url: remote_repository_url) if gitea_repository repository.update_columns(url: gitea_repository["clone_url"]) if gitea_repository
end
def remote_repository_url
[Gitea.gitea_config[:domain], '/', user.login, '/', params[:identifier], ".git"].join("")
end end
def repository_params def repository_params

@ -0,0 +1,6 @@
if @new_project
json.id @new_project.id
json.identifier @new_project.identifier
else
json.nil!
end

@ -4,4 +4,6 @@ json.forked_count @repo.project.forked_count
json.watchers_count @repo.project.watchers_count json.watchers_count @repo.project.watchers_count
json.branches_count @branches_count json.branches_count @branches_count
json.commits_count @commits_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 } json.partial! 'author', locals: { user: @repo.user }

Loading…
Cancel
Save