Merge branch 'forge' of https://bdgit.educoder.net/Hjqreturn/educoder into forge
commit
ba4813ccee
@ -1,3 +1,19 @@
|
|||||||
class BaseForm
|
class BaseForm
|
||||||
include ActiveModel::Model
|
include ActiveModel::Model
|
||||||
|
|
||||||
|
def check_project_category(project_category_id)
|
||||||
|
raise "project_category_id参数值无效." if (ProjectCategory.find_by_id project_category_id).blank?
|
||||||
|
end
|
||||||
|
|
||||||
|
def check_project_language(project_language_id)
|
||||||
|
raise "project_language_id参数值无效." if (ProjectLanguage.find_by_id project_language_id).blank?
|
||||||
|
end
|
||||||
|
|
||||||
|
def check_repository_name(user_id, repository_name)
|
||||||
|
raise "仓库名称已被使用." if Repository.where(user_id: user_id, identifier: repository_name.strip).exists?
|
||||||
|
end
|
||||||
|
|
||||||
|
def check_project_name(user_id, project_name)
|
||||||
|
raise "项目名称已被使用." if Project.where(user_id: user_id, name: project_name.strip).exists?
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
@ -0,0 +1,17 @@
|
|||||||
|
class Projects::MigrateForm < BaseForm
|
||||||
|
REPOSITORY_NAME_REGEX = /^(?!_)(?!.*?_$)[a-zA-Z0-9_-]+$/ #只含有数字、字母、下划线不能以下划线开头和结尾
|
||||||
|
URL_REGEX = /\A(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?\z/i
|
||||||
|
|
||||||
|
attr_accessor :user_id, :name, :description, :repository_name, :project_category_id, :project_language_id, :clone_addr, :private
|
||||||
|
|
||||||
|
validates :user_id, :name, :description,:repository_name, :project_category_id, :project_language_id, presence: true
|
||||||
|
validates :repository_name, format: { with: REPOSITORY_NAME_REGEX, multiline: true, message: "只能含有数字、字母、下划线且不能以下划线开头和结尾" }
|
||||||
|
validates :clone_addr, format: { with: URL_REGEX, multiline: true, message: "地址格式不正确" }
|
||||||
|
validate do
|
||||||
|
check_project_name(user_id, name)
|
||||||
|
check_repository_name(user_id, repository_name)
|
||||||
|
check_project_category(project_category_id)
|
||||||
|
check_project_language(project_language_id)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
@ -1,6 +1,7 @@
|
|||||||
class Repository < ApplicationRecord
|
class Repository < ApplicationRecord
|
||||||
self.inheritance_column = nil # FIX The single-table inheritance mechanism failed
|
self.inheritance_column = nil # FIX The single-table inheritance mechanism failed
|
||||||
belongs_to :project
|
belongs_to :project
|
||||||
|
belongs_to :user
|
||||||
|
|
||||||
validates :identifier, presence: true, uniqueness: true
|
validates :identifier, presence: true, uniqueness: true
|
||||||
end
|
end
|
||||||
|
@ -0,0 +1,47 @@
|
|||||||
|
class Gitea::Repository::MigrateService < Gitea::ClientService
|
||||||
|
attr_reader :token, :params
|
||||||
|
|
||||||
|
# params description:
|
||||||
|
# {
|
||||||
|
# auth_username string
|
||||||
|
# clone_addr* string #clone地址
|
||||||
|
# description string
|
||||||
|
# issues boolean
|
||||||
|
# labels boolean
|
||||||
|
# milestones boolean
|
||||||
|
# mirror boolean
|
||||||
|
# private boolean
|
||||||
|
# pull_requests boolean
|
||||||
|
# releases boolean
|
||||||
|
# repo_name* string #仓库名称
|
||||||
|
# uid* integer($int64) #gitea用户id或组织id
|
||||||
|
# wiki boolean
|
||||||
|
# }
|
||||||
|
# EX:
|
||||||
|
# params = {
|
||||||
|
# clone_addr: 'xxx.com',
|
||||||
|
# repo_name: 'repo_name',
|
||||||
|
# uid: 2,
|
||||||
|
# private: false
|
||||||
|
# }
|
||||||
|
|
||||||
|
def initialize(token, params)
|
||||||
|
@token = token
|
||||||
|
@params = params
|
||||||
|
end
|
||||||
|
|
||||||
|
def call
|
||||||
|
post(url, request_params)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def request_params
|
||||||
|
Hash.new.merge(token: token, data: params)
|
||||||
|
end
|
||||||
|
|
||||||
|
def url
|
||||||
|
"/repos/migrate".freeze
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
@ -0,0 +1,49 @@
|
|||||||
|
class Projects::MigrateService < ApplicationService
|
||||||
|
attr_reader :user, :params
|
||||||
|
|
||||||
|
def initialize(user, params)
|
||||||
|
@user = user
|
||||||
|
@params = params
|
||||||
|
end
|
||||||
|
|
||||||
|
def call
|
||||||
|
@project = Project.new(project_params)
|
||||||
|
ActiveRecord::Base.transaction do
|
||||||
|
if @project.save!
|
||||||
|
Repositories::MigrateService.new(user, @project, repository_params).call
|
||||||
|
else
|
||||||
|
#
|
||||||
|
end
|
||||||
|
end
|
||||||
|
@project
|
||||||
|
rescue => e
|
||||||
|
puts "create mirror project service error: #{e.message}"
|
||||||
|
raise Error, e.message
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def project_params
|
||||||
|
{
|
||||||
|
name: params[:name],
|
||||||
|
user_id: params[:user_id],
|
||||||
|
description: params[:description],
|
||||||
|
project_category_id: params[:project_category_id],
|
||||||
|
project_language_id: params[:project_language_id],
|
||||||
|
is_public: get_is_public
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
def repository_params
|
||||||
|
{
|
||||||
|
hidden: get_is_public,
|
||||||
|
identifier: params[:repository_name],
|
||||||
|
mirror_url: params[:clone_addr],
|
||||||
|
user_id: user.id
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_is_public
|
||||||
|
params[:private] || false
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,51 @@
|
|||||||
|
class Repositories::MigrateService < ApplicationService
|
||||||
|
attr_reader :user, :project, :params
|
||||||
|
|
||||||
|
def initialize(user, project, params)
|
||||||
|
@project = project
|
||||||
|
@user = user
|
||||||
|
@params = params
|
||||||
|
end
|
||||||
|
|
||||||
|
def call
|
||||||
|
@repository = Repository.new(repository_params)
|
||||||
|
ActiveRecord::Base.transaction do
|
||||||
|
if @repository.save!
|
||||||
|
gitea_repository = Gitea::Repository::MigrateService.new(user.gitea_token, gitea_repository_params).call
|
||||||
|
sync_project(gitea_repository)
|
||||||
|
sync_repository(@repository, gitea_repository)
|
||||||
|
end
|
||||||
|
@repository
|
||||||
|
end
|
||||||
|
rescue => e
|
||||||
|
puts "create mirror repository service error: #{e.message}"
|
||||||
|
raise Error, e.message
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def sync_project(gitea_repository)
|
||||||
|
project.update_columns(gpid: gitea_repository["id"]) 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("")
|
||||||
|
end
|
||||||
|
|
||||||
|
def repository_params
|
||||||
|
params.merge(project_id: project.id,)
|
||||||
|
end
|
||||||
|
|
||||||
|
def gitea_repository_params
|
||||||
|
{
|
||||||
|
clone_addr: params[:mirror_url],
|
||||||
|
repo_name: params[:identifier],
|
||||||
|
uid: user.gitea_uid,
|
||||||
|
private: params[:hidden]
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1 @@
|
|||||||
|
json.extract! @project, :id, :name
|
@ -0,0 +1,10 @@
|
|||||||
|
class AddUserRefToRepository < ActiveRecord::Migration[5.2]
|
||||||
|
def change
|
||||||
|
add_column :repositories, :user_id, :integer
|
||||||
|
add_index :repositories, :user_id
|
||||||
|
|
||||||
|
Project.joins(:repository).find_each do |project|
|
||||||
|
project&.repository&.update_column(:user_id, project&.user_id) unless project&.repository.blank?
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,5 @@
|
|||||||
|
class AddGiteaUidToUsers < ActiveRecord::Migration[5.2]
|
||||||
|
def change
|
||||||
|
add_column :users, :gitea_uid, :integer
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,5 @@
|
|||||||
|
class AddMirrorUrlToRepositories < ActiveRecord::Migration[5.2]
|
||||||
|
def change
|
||||||
|
add_column :repositories, :mirror_url, :string
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in new issue