ADD fork project

dev_forge
Jasder 5 years ago
parent 68c7cbc07d
commit ac881d131a

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

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

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