confilct fix

dev_forge
SylorHuang 5 years ago
commit 212cbc6c78

@ -27,7 +27,7 @@ POST accounts/remote_register
curl -X POST \ curl -X POST \
-d "email=2456233122@qq.com" \ -d "email=2456233122@qq.com" \
-d "password=djs_D_00001" \ -d "password=djs_D_00001" \
-d "phone=18816895620" \ -d "username=16895620" \
-d "platform=forge" \ -d "platform=forge" \
http://localhost:3000/api/accounts/remote_register | jq http://localhost:3000/api/accounts/remote_register | jq
``` ```
@ -36,7 +36,7 @@ http://localhost:3000/api/accounts/remote_register | jq
|参数名|必选|类型|说明| |参数名|必选|类型|说明|
-|-|-|- -|-|-|-
|email |是|string |邮箱 | |email |是|string |邮箱 |
|phone |是|string |手机号 | |username |是|string |登录名 |
|password |是|string |秘密 | |password |是|string |秘密 |
|platform |否|string |用户来源的相关平台,取值范围['educoder', 'trustie', 'forge'], 默认值为forge | |platform |否|string |用户来源的相关平台,取值范围['educoder', 'trustie', 'forge'], 默认值为forge |
@ -293,14 +293,13 @@ POST api/projects/migrate
``` ```
curl -X POST \ curl -X POST \
-d "user_id=36401" \ -d "user_id=36401" \
-d "clone_addr=https://gitea.com/CasperVector/slew.git" -d "clone_addr=https://gitea.com/CasperVector/slew.git" \
-d "name=项目" \ -d "name=ni项目" \
-d "description=my first project" \ -d "description=my first project" \
-d "repository_name=gorails" \ -d "repository_name=mirror_demo" \
-d "project_category_id=1" \ -d "project_category_id=1" \
-d "project_language_id=2" \ -d "project_language_id=2" \
-d "private=true" http://localhost:3000/api/projects/migrate | jq
http://localhost:3000/api/projects/ | jq
``` ```
*请求参数说明:* *请求参数说明:*
@ -313,7 +312,7 @@ http://localhost:3000/api/projects/ | jq
|repository_name |是|string |仓库名称, 只含有数字、字母、下划线不能以下划线开头和结尾,且唯一 | |repository_name |是|string |仓库名称, 只含有数字、字母、下划线不能以下划线开头和结尾,且唯一 |
|project_category_id|是|int |项目类别id | |project_category_id|是|int |项目类别id |
|project_language_id|是|int |项目语言id | |project_language_id|是|int |项目语言id |
|private |否|boolean|项目是否私有, true为私有false: 公开,默认为公开 | |private |否|boolean|项目是否私有, true为私有false: 非私有,默认为公开 |
*返回参数说明:* *返回参数说明:*
@ -327,8 +326,102 @@ http://localhost:3000/api/projects/ | jq
返回值 返回值
``` ```
{ {
"id": 3240, "id": 3263,
"name": "好项目" "name": "ni项目"
}
```
---
#### 项目详情
```
POST api/projects/:identifier
```
*示例*
```
curl -X GET \
-d "user_id=36401" \
-d "clone_addr=https://gitea.com/CasperVector/slew.git" \
-d "name=ni项目" \
-d "description=my first project" \
-d "repository_name=mirror_demo" \
-d "project_category_id=1" \
-d "project_language_id=2" \
http://localhost:3000/api/projects/migrate | jq
```
*请求参数说明:*
|参数名|必选|类型|说明|
-|-|-|-
|user_id |是|int |用户id或者组织id |
|name |是|string |项目名称 |
|clone_addr |是|string |镜像项目clone地址 |
|description |否|string |项目描述 |
|repository_name |是|string |仓库名称, 只含有数字、字母、下划线不能以下划线开头和结尾,且唯一 |
|project_category_id|是|int |项目类别id |
|project_language_id|是|int |项目语言id |
|private |否|boolean|项目是否私有, true为私有false: 非私有,默认为公开 |
*返回参数说明:*
|参数名|类型|说明|
-|-|-
|id |int |id |
|name |string|项目名称|
返回值
```
{
"id": 3263,
"name": "ni项目"
}
```
---
#### 项目列表
```
GET api/projects
```
*示例*
```
curl -X POST \
-d "user_id=36401" \
-d "clone_addr=https://gitea.com/CasperVector/slew.git" \
-d "name=ni项目" \
-d "description=my first project" \
-d "repository_name=mirror_demo" \
-d "project_category_id=1" \
-d "project_language_id=2" \
http://localhost:3000/api/projects/migrate | jq
```
*请求参数说明:*
|参数名|必选|类型|说明|
-|-|-|-
|user_id |是|int |用户id或者组织id |
|name |是|string |项目名称 |
|clone_addr |是|string |镜像项目clone地址 |
|description |否|string |项目描述 |
|repository_name |是|string |仓库名称, 只含有数字、字母、下划线不能以下划线开头和结尾,且唯一 |
|project_category_id|是|int |项目类别id |
|project_language_id|是|int |项目语言id |
|private |否|boolean|项目是否私有, true为私有false: 非私有,默认为公开 |
*返回参数说明:*
|参数名|类型|说明|
-|-|-
|id |int |id |
|name |string|项目名称|
返回值
```
{
"id": 3263,
"name": "ni项目"
} }
``` ```
--- ---

@ -8,24 +8,24 @@ class AccountsController < ApplicationController
# 其他平台同步注册的用户 # 其他平台同步注册的用户
def remote_register def remote_register
phone = params[:phone]&.gsub(/\s+/, "") username = params[:username]&.gsub(/\s+/, "")
email = params[:email]&.gsub(/\s+/, "") email = params[:email]&.gsub(/\s+/, "")
password = params[:password] password = params[:password]
platform = (params[:platform] || 'forge')&.gsub(/\s+/, "") platform = (params[:platform] || 'forge')&.gsub(/\s+/, "")
@user = User.new(admin: false, login: phone, mail: email, phone: phone, type: "User") @user = User.new(admin: false, login: username, mail: email, type: "User")
@user.admin = false
@user.type = 'User'
@user.password = password @user.password = password
@user.platform = platform @user.platform = platform
@user.activate @user.activate
ActiveRecord::Base.transaction do ActiveRecord::Base.transaction do
interactor = Gitea::RegisterInteractor.call({username: phone, email: email, password: password}) interactor = Gitea::RegisterInteractor.call({username: username, email: email, password: password})
if interactor.success? if interactor.success?
result = Gitea::User::GenerateTokenService.new(phone, password).call gitea_user = interactor.result
result = Gitea::User::GenerateTokenService.new(username, password).call
@user.gitea_token = result['sha1'] @user.gitea_token = result['sha1']
@user.gitea_uid = gitea_user['id']
if @user.save! if @user.save!
UserExtension.create!(user_id: @user.id)
render_ok({user: {id: @user.id, token: @user.gitea_token}}) render_ok({user: {id: @user.id, token: @user.gitea_token}})
end end
else else

@ -1,7 +1,9 @@
class ProjectsController < ApplicationController class ProjectsController < ApplicationController
before_action :require_login before_action :require_login
before_action :find_project, only: %i[branches]
def index def index
end end
def create def create
@ -24,7 +26,15 @@ class ProjectsController < ApplicationController
tip_exception(e.message) tip_exception(e.message)
end end
def branches
@branches = Gitea::Repository::BranchesService.new(current_user, @project.identifier).call
end
private private
def find_project
@project = Project.find_by_identifier! params[:id]
end
def project_params def project_params
params.permit(:user_id, :name, :description, :repository_name, params.permit(:user_id, :name, :description, :repository_name,
:project_category_id, :project_language_id, :license_id, :ignore_id) :project_category_id, :project_language_id, :license_id, :ignore_id)

@ -1,4 +1,5 @@
class Gitea::UserForm class Gitea::UserForm
include ActiveModel::Model
EMAIL_REGEX = /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/ EMAIL_REGEX = /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/
include ActiveModel::Model include ActiveModel::Model
@ -8,6 +9,8 @@ class Gitea::UserForm
validates :email, presence: true, format: { with: EMAIL_REGEX, multiline: true } validates :email, presence: true, format: { with: EMAIL_REGEX, multiline: true }
validates :password, presence: true validates :password, presence: true
validate :check_username, :check_email
attr_reader :record attr_reader :record
def persist def persist
@ -21,4 +24,14 @@ class Gitea::UserForm
false false
end end
end end
private
def check_username
# errors.add(:login, :exist)
raise "#{username} 已使用." if User.exists?(login: username.strip)
end
def check_email
raise "#{email} 已使用." if User.exists?(mail: email.strip)
end
end end

@ -6,7 +6,7 @@ module Gitea
interactor interactor
end end
attr_reader :error attr_reader :error, :result
def initialize(params) def initialize(params)
@params = params @params = params
@ -16,10 +16,14 @@ module Gitea
@error.nil? @error.nil?
end end
def result
@result
end
def run def run
Gitea::UserForm.new(params).validate! Gitea::UserForm.new(params).validate!
Gitea::User::RegisterService.new(params).call response = Gitea::User::RegisterService.new(params).call
# Gitea::Client.new.register("nifewf", "123@qq.com", "djs_D_00001") render_result(response)
rescue Exception => exception rescue Exception => exception
Rails.logger.info "Exception ===========> #{exception.message}" Rails.logger.info "Exception ===========> #{exception.message}"
fail!(exception.message) fail!(exception.message)
@ -33,5 +37,9 @@ module Gitea
def fail!(error) def fail!(error)
@error = error @error = error
end end
def render_result(response)
@result = response
end
end end
end end

@ -43,5 +43,8 @@ class Project < ApplicationRecord
members.joins("left join users on members.user_id = users.id").select("users.id", "users.login","users.firstname","users.lastname") members.joins("left join users on members.user_id = users.id").select("users.id", "users.login","users.firstname","users.lastname")
.pluck("users.id", "users.login","users.lastname", "users.firstname") .pluck("users.id", "users.login","users.lastname", "users.firstname")
end end
def to_param
self.identifier.parameterize
end
end end

@ -19,7 +19,7 @@ class User < ApplicationRecord
EDU_NORMAL = 8 # 普通用户 EDU_NORMAL = 8 # 普通用户
VALID_EMAIL_REGEX = /^[a-zA-Z0-9]+([.\-_\\]*[a-zA-Z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/i VALID_EMAIL_REGEX = /^[a-zA-Z0-9]+([.\-_\\]*[a-zA-Z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/i
VALID_PHONE_REGEX = /^1\d{10}$/ # VALID_PHONE_REGEX = /^1\d{10}$/
# 身份证 # 身份证
VALID_NUMBER_REGEX = /(^[1-9]\d{5}(18|19|20|(3\d))\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^([A-Z]\d{6,10}(\(\w{1}\))?)$)/ VALID_NUMBER_REGEX = /(^[1-9]\d{5}(18|19|20|(3\d))\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^([A-Z]\d{6,10}(\(\w{1}\))?)$)/
@ -172,7 +172,7 @@ class User < ApplicationRecord
delegate :gender, :department_id, :school_id, :location, :location_city, :technical_title, to: :user_extension, allow_nil: true delegate :gender, :department_id, :school_id, :location, :location_city, :technical_title, to: :user_extension, allow_nil: true
before_save :update_hashed_password, :set_laboratory before_save :update_hashed_password
after_create do after_create do
SyncTrustieJob.perform_later("user", 1) if allow_sync_to_trustie? SyncTrustieJob.perform_later("user", 1) if allow_sync_to_trustie?
end end
@ -184,7 +184,7 @@ class User < ApplicationRecord
validates_presence_of :login, :if => Proc.new { |user| !user.is_a?(AnonymousUser) }, case_sensitive: false validates_presence_of :login, :if => Proc.new { |user| !user.is_a?(AnonymousUser) }, case_sensitive: false
validates_uniqueness_of :login, :if => Proc.new { |user| user.login_changed? && user.login.present? }, case_sensitive: false validates_uniqueness_of :login, :if => Proc.new { |user| user.login_changed? && user.login.present? }, case_sensitive: false
validates_uniqueness_of :mail, :if => Proc.new { |user| user.mail_changed? && user.mail.present? }, case_sensitive: false validates_uniqueness_of :mail, :if => Proc.new { |user| user.mail_changed? && user.mail.present? }, case_sensitive: false
validates_uniqueness_of :phone, :if => Proc.new { |user| user.phone_changed? && user.phone.present? }, case_sensitive: false # validates_uniqueness_of :phone, :if => Proc.new { |user| user.phone_changed? && user.phone.present? }, case_sensitive: false
validates_length_of :login, maximum: LOGIN_LENGTH_LIMIT validates_length_of :login, maximum: LOGIN_LENGTH_LIMIT
validates_length_of :mail, maximum: MAIL_LENGTH_LMIT validates_length_of :mail, maximum: MAIL_LENGTH_LMIT
# validates_format_of :mail, with: VALID_EMAIL_REGEX, multiline: true # validates_format_of :mail, with: VALID_EMAIL_REGEX, multiline: true
@ -736,11 +736,6 @@ class User < ApplicationRecord
end end
end end
def set_laboratory
return unless new_record?
self.laboratory = Laboratory.current if laboratory_id.blank?
end
end end

@ -15,7 +15,7 @@ class Gitea::ClientService < ApplicationService
# token: {}, # token: {},
# data: {} # data: {}
# } # }
def post(url, params) def post(url, params={})
puts "[gitea] request params: #{params}" puts "[gitea] request params: #{params}"
request_url = [api_url, url].join('').freeze request_url = [api_url, url].join('').freeze
auth_token = authen_params(params[:token]) auth_token = authen_params(params[:token])
@ -29,11 +29,10 @@ class Gitea::ClientService < ApplicationService
def get(url, params={}) def get(url, params={})
auth_token = authen_params(params[:token]) auth_token = authen_params(params[:token])
response = conn(auth_token).get do |req| conn(auth_token).get do |req|
req.url full_url(url) req.url full_url(url)
req.body = params[:data].to_json req.body = params[:data].to_json
end end
render_status(response)
end end
def delete(url, params={}) def delete(url, params={})
@ -109,6 +108,8 @@ class Gitea::ClientService < ApplicationService
# return {status: -1, message: result[0]} # return {status: -1, message: result[0]}
raise Error, result[0] raise Error, result[0]
when 204 when 204
puts "[gitea] "
raise Error, "[gitea] delete ok" raise Error, "[gitea] delete ok"
else else
result = JSON.parse(response&.body) result = JSON.parse(response&.body)
@ -120,4 +121,13 @@ class Gitea::ClientService < ApplicationService
def authen_params(token) def authen_params(token)
(token.is_a? String) ? {token: token} : Hash(token) (token.is_a? String) ? {token: token} : Hash(token)
end end
def render_data(response)
case response.status
when 201, 200
JSON.parse(response.body)
else
nil
end
end
end end

@ -0,0 +1,35 @@
# Check if a pull request has been merged
class Gitea::PullRequest::CheckService < Gitea::ClientService
attr_reader :user, :repo, :pull_request_id
# user: 用户
# repo: 仓库名称/标识
# pull_request_id: pull request主键id
def initialize(user, repo, pull_request_id)
super({token: user.gitea_token})
@user = user
@repo = repo
@pull_request_id = pull_request_id
end
def call
response = get(url, params)
render_response(response)
end
private
def params
Hash.new.merge(token: user.gitea_token)
end
def url
"/repos/#{user.login}/#{repo}/pulls/#{pull_request_id}/merge".freeze
end
def render_response(response)
case response.status
when 204 then true
when 404 then false
end
end
end

@ -0,0 +1,32 @@
# Create a pull request
class Gitea::PullRequest::CreateService < Gitea::ClientService
attr_reader :user, :repo, :params
# params ex:
# {
# title: 'pull request title',
# body: 'pull request content',
# head: 'develop', // from branch 源分支
# base: 'master' // to branch 目标分支
# }
# 以上列子说明从develop分支合并到master分支
# repo: 仓库名称
def initialize(user, repo, params={})
@user = user
@repo = repo
@params = params
end
def call
post(url, request_params)
end
private
def url
"/repos/#{user.login}/#{repo}/pulls".freeze
end
def request_params
Hash.new.merge(token: user.gitea_token, data: params)
end
end

@ -0,0 +1,37 @@
# Get a pull request
class Gitea::PullRequest::GetService < Gitea::ClientService
attr_reader :user, :repo, :pull_request_id
# user: 用户
# repo: 仓库名称/标识
# pull_request_id: pull request主键id
def initialize(user, repo, pull_request_id)
super({token: user.gitea_token})
@user = user
@repo = repo
@pull_request_id = pull_request_id
end
def call
response = get(url, params)
render_result(response)
end
private
def params
Hash.new.merge(token: user.gitea_token)
end
def url
"/repos/#{user.login}/#{repo}/pulls/#{pull_request_id}".freeze
end
def render_result(response)
case response.status
when 200
JSON.parse(response.body)
else
nil
end
end
end

@ -0,0 +1,7 @@
# List a repo's pull requests
class Gitea::PullRequest::ListService < Gitea::ClientService
def url
"/repos/{owner}/{repo}/pulls"
end
end

@ -0,0 +1,42 @@
# Merge a pull request
class Gitea::PullRequest::MergeService < Gitea::ClientService
attr_reader :user, :repo, :pull_request_id, :params
# parameters:
# repo: name of the repo
# pull_request_id: index of the pull request to merge
# params:
# title: merge标题
# message: merge说明
def initialize(user, repo, pull_request_id, params={})
@user = user
@repo = repo
@params = params
@pull_request_id = pull_request_id
end
def call
post(url, request_params)
end
private
def url
"/repos/#{user.login}/#{repo}/pulls/#{pull_request_id}/merge"
end
def request_params
Hash.new.merge(token: user.gitea_token, data: body)
end
def body
# TODO
# 暂时只支持 merge模式
#params Do: Enum [ merge, rebase, rebase-merge, squash ], default merge
body = {
Do: 'merge'
}
body = body.merge(MergeTitleField: params[:title]) if params[:title]
body = body.merge(MergeMessageField: params[:message]) if params[:message]
body
end
end

@ -0,0 +1,22 @@
class Gitea::Repository::BranchesService < Gitea::ClientService
attr_reader :user, :repo
def initialize(user, repo)
@user = user
@repo = repo
end
def call
response = get(url, params)
render_data(response)
end
private
def params
Hash.new.merge(token: user.gitea_token)
end
def url
"/repos/#{user.login}/#{repo}/branches".freeze
end
end

@ -7,11 +7,11 @@ class Gitea::Repository::GetService < Gitea::ClientService
end end
def call def call
get(url, params) response = get(url, params)
render_result(response)
end end
private private
def params def params
Hash.new.merge(token: user.gitea_token) Hash.new.merge(token: user.gitea_token)
end end
@ -19,4 +19,13 @@ class Gitea::Repository::GetService < Gitea::ClientService
def url def url
"/repos/#{user.login}/#{repo_name}".freeze "/repos/#{user.login}/#{repo_name}".freeze
end end
def render_result(response)
case response.status
when 200
JSON.parse(response.body)
else
nil
end
end
end end

@ -12,7 +12,7 @@ class Repositories::CreateService < ApplicationService
ActiveRecord::Base.transaction do ActiveRecord::Base.transaction do
if @repository.save! if @repository.save!
gitea_repository = Gitea::Repository::CreateService.new(user.gitea_token, gitea_repository_params).call gitea_repository = Gitea::Repository::CreateService.new(user.gitea_token, gitea_repository_params).call
sync_project(gitea_repository) sync_project(@repository, gitea_repository)
sync_repository(@repository, gitea_repository) sync_repository(@repository, gitea_repository)
end end
@repository @repository
@ -24,7 +24,8 @@ class Repositories::CreateService < ApplicationService
private private
def sync_project(gitea_repository) def sync_project(repository, gitea_repository)
project.update_column('identifier', repository.identifier)
project.update_columns(gpid: gitea_repository["id"]) if gitea_repository project.update_columns(gpid: gitea_repository["id"]) if gitea_repository
end end

@ -37,7 +37,7 @@ class Repositories::MigrateService < ApplicationService
end end
def repository_params def repository_params
params.merge(project_id: project.id,) params.merge(project_id: project.id)
end end
def gitea_repository_params def gitea_repository_params

@ -0,0 +1,3 @@
json.array! @branches do |branch|
json.name branch['name']
end

@ -43,6 +43,9 @@ Rails.application.routes.draw do
collection do collection do
post :migrate post :migrate
end end
member do
get :branches
end
end end
# resources :memos do # resources :memos do

@ -0,0 +1,6 @@
class AddIndexesToUsers < ActiveRecord::Migration[5.2]
def change
add_index :users, :login
add_index :users, :mail
end
end
Loading…
Cancel
Save