Date: Mon, 26 Apr 2021 16:45:26 +0800
Subject: [PATCH 09/40] FIX admin projects api bug
---
app/views/admins/projects/shared/_list.html.erb | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/views/admins/projects/shared/_list.html.erb b/app/views/admins/projects/shared/_list.html.erb
index bd6300283..fe8d96e9d 100644
--- a/app/views/admins/projects/shared/_list.html.erb
+++ b/app/views/admins/projects/shared/_list.html.erb
@@ -23,7 +23,7 @@
| <%= list_index_no((params[:page] || 1).to_i, index) %> |
<%= project.id %> |
- <%= link_to(project.name, "/projects/#{project.id}", target: '_blank') %>
+ <%= link_to(project.name, "/projects/#{project&.owner&.login}/#{project.identifier}", target: '_blank') %>
|
<%= project.is_public ? '√' : '' %> |
<%= project.issues.size %> |
@@ -33,7 +33,7 @@
<%= project.versions.size %> |
<%= project.members.size %> |
- <%= project.owner ? link_to(project.owner&.real_name, "/users/#{project.owner&.login}", target: '_blank') : "" %>
+ <%= link_to_project(project) %>
|
<%= project.created_on&.strftime('%Y-%m-%d %H:%M') %> |
From 1a22491e36af66c80b6dfe7502ca1ad20834433f Mon Sep 17 00:00:00 2001
From: jasder
Date: Mon, 26 Apr 2021 16:45:58 +0800
Subject: [PATCH 10/40] ADD admin role to org api
---
app/controllers/organizations/base_controller.rb | 1 +
1 file changed, 1 insertion(+)
diff --git a/app/controllers/organizations/base_controller.rb b/app/controllers/organizations/base_controller.rb
index e6163bf8c..e18ab9aef 100644
--- a/app/controllers/organizations/base_controller.rb
+++ b/app/controllers/organizations/base_controller.rb
@@ -17,6 +17,7 @@ class Organizations::BaseController < ApplicationController
end
def org_privacy_condition
+ return false if current_user.admin?
@organization.organization_extension.privacy? && @organization.organization_users.where(user_id: current_user.id).blank?
end
From 0d828ead1f5e52915c64f330a7f733095bc0a15a Mon Sep 17 00:00:00 2001
From: "vilet.yy"
Date: Mon, 26 Apr 2021 16:50:50 +0800
Subject: [PATCH 11/40] fix:some bug
---
.../users/applied_transfer_projects_controller.rb | 2 +-
.../send_transfer_project_applied_message_job.rb | 13 +++++++++++--
app/services/projects/accept_transfer_service.rb | 12 +++++++++---
app/services/projects/refuse_transfer_service.rb | 10 ++++++++--
app/services/projects/transfer_service.rb | 1 +
5 files changed, 30 insertions(+), 8 deletions(-)
diff --git a/app/controllers/users/applied_transfer_projects_controller.rb b/app/controllers/users/applied_transfer_projects_controller.rb
index 74366bb55..b1777f526 100644
--- a/app/controllers/users/applied_transfer_projects_controller.rb
+++ b/app/controllers/users/applied_transfer_projects_controller.rb
@@ -7,7 +7,7 @@ class Users::AppliedTransferProjectsController < Users::BaseController
user_collection_sql = AppliedTransferProject.where(owner_id: @_observed_user.id).to_sql
org_collection_sql = AppliedTransferProject.where(owner_id: Organization.joins(team_users: :team).where(team_users: {user_id: @_observed_user.id}, teams: {authorize: %w(admin owner)} )).to_sql
@applied_transfer_projects = AppliedTransferProject.from("( #{ user_collection_sql } UNION #{ org_collection_sql } ) AS applied_transfer_projects")
- @applied_transfer_projects = paginate @applied_transfer_projects
+ @applied_transfer_projects = paginate @applied_transfer_projects.order("created_at desc")
end
# 接受迁移
diff --git a/app/jobs/send_transfer_project_applied_message_job.rb b/app/jobs/send_transfer_project_applied_message_job.rb
index ef05f266d..5f0c24c65 100644
--- a/app/jobs/send_transfer_project_applied_message_job.rb
+++ b/app/jobs/send_transfer_project_applied_message_job.rb
@@ -3,7 +3,7 @@ class SendTransferProjectAppliedMessageJob < ApplicationJob
def perform(applied_transfer_project, applied_user, message_status)
project = applied_transfer_project.project
- owner = applied_transfer_project.owner
+ owner = project.owner
return unless project.present?
return unless owner.present?
if owner.is_a?(Organization)
@@ -12,13 +12,22 @@ class SendTransferProjectAppliedMessageJob < ApplicationJob
receivers = project.managers
end
receivers.each do |rec|
+ next if applied_user.id == rec.user_id # 自己不要给自己发通知
AppliedMessage.create!(user_id: rec.user_id,
applied: applied_transfer_project,
status: message_status,
- name: build_name(project.name, owner.real_name, message_status),
+ name: build_name(project.name, applied_transfer_project&.owner&.real_name, message_status),
applied_user_id: applied_user.id,
project_id: project.id)
end
+ if message_status == 'successed' # 如果转移成功,给转移发起者发通知已转移成功
+ AppliedMessage.find_or_create_by!(user_id: applied_transfer_project.user_id,
+ applied: applied_transfer_project,
+ status: message_status,
+ name: build_name(project.name, applied_transfer_project&.owner&.real_name, message_status),
+ applied_user_id: applied_user.id,
+ project_id: project.id)
+ end
end
private
diff --git a/app/services/projects/accept_transfer_service.rb b/app/services/projects/accept_transfer_service.rb
index 284499002..c99885ca0 100644
--- a/app/services/projects/accept_transfer_service.rb
+++ b/app/services/projects/accept_transfer_service.rb
@@ -1,11 +1,12 @@
class Projects::AcceptTransferService < ApplicationService
- attr_accessor :applied_transfer_project
+ attr_accessor :applied_transfer_project, :owner
attr_reader :user, :project
def initialize(user, project)
@user = user
@project = project
@applied_transfer_project = project.applied_transfer_project
+ @owner = @applied_transfer_project.owner
end
def call
@@ -26,7 +27,12 @@ class Projects::AcceptTransferService < ApplicationService
private
def validate!
raise Error, '该仓库未在迁移' unless @applied_transfer_project.present? && @project.is_transfering
- raise Error, '未拥有接受转移权限' unless @user.admin? || @project.manager?(@user)
+ raise Error, '未拥有接受转移权限' unless is_permit_operator
+ end
+
+ def is_permit_operator
+ return true if @user == @owner
+ return @owner.is_a?(Organization) && @owner.is_admin?(@user)
end
def update_apply
@@ -34,7 +40,7 @@ class Projects::AcceptTransferService < ApplicationService
end
def operate_project
- @project = Projects::TransferService.call(@project, @applied_transfer_project.owner)
+ @project = Projects::TransferService.call(@project, @owner)
end
def send_apply_message
diff --git a/app/services/projects/refuse_transfer_service.rb b/app/services/projects/refuse_transfer_service.rb
index b8199e65e..1b81b5741 100644
--- a/app/services/projects/refuse_transfer_service.rb
+++ b/app/services/projects/refuse_transfer_service.rb
@@ -1,11 +1,12 @@
class Projects::RefuseTransferService < ApplicationService
- attr_accessor :applied_transfer_project
+ attr_accessor :applied_transfer_project, :owner
attr_reader :user, :project
def initialize(user, project)
@user = user
@project = project
@applied_transfer_project = project.applied_transfer_project
+ @owner = @applied_transfer_project.owner
end
def call
@@ -21,7 +22,12 @@ class Projects::RefuseTransferService < ApplicationService
private
def validate!
raise Error, '该仓库未在迁移' unless @applied_transfer_project.present? && @project.is_transfering
- raise Error, '未拥有拒绝转移权限' unless @user.admin? || @project.manager?(@user)
+ raise Error, '未拥有拒绝转移权限' unless is_permit_operator
+ end
+
+ def is_permit_operator
+ return true if @user == @owner
+ return @owner.is_a?(Organization) && @owner.is_admin?(@user)
end
def update_apply
diff --git a/app/services/projects/transfer_service.rb b/app/services/projects/transfer_service.rb
index b32b24817..4582a2103 100644
--- a/app/services/projects/transfer_service.rb
+++ b/app/services/projects/transfer_service.rb
@@ -23,6 +23,7 @@ class Projects::TransferService < ApplicationService
private
def update_owner
+ project.members.find_by(user_id: owner.id).destroy! if owner.is_a?(User)
project.update!(user_id: new_owner.id)
end
From 5bd33c033cd708ef47b7c816e77a7f5297c493fa Mon Sep 17 00:00:00 2001
From: jasder
Date: Mon, 26 Apr 2021 16:52:48 +0800
Subject: [PATCH 12/40] FIX bug
---
app/helpers/admins/projects_helper.rb | 14 ++++++++++++++
1 file changed, 14 insertions(+)
create mode 100644 app/helpers/admins/projects_helper.rb
diff --git a/app/helpers/admins/projects_helper.rb b/app/helpers/admins/projects_helper.rb
new file mode 100644
index 000000000..c6d94c4ca
--- /dev/null
+++ b/app/helpers/admins/projects_helper.rb
@@ -0,0 +1,14 @@
+module Admins::ProjectsHelper
+
+ def link_to_project(project)
+ owner = project.owner
+
+ if owner.is_a?(User)
+ link_to(project.owner&.real_name, "/users/#{project&.owner&.login}", target: '_blank')
+ elsif owner.is_a?(Organization)
+ link_to(project.owner&.real_name, "/organize/#{project&.owner&.login}", target: '_blank')
+ else
+ ""
+ end
+ end
+end
\ No newline at end of file
From 01360de423159d32f2c005feace855a30a771dbd Mon Sep 17 00:00:00 2001
From: "vilet.yy"
Date: Tue, 27 Apr 2021 13:56:12 +0800
Subject: [PATCH 13/40] fix: acceptor must exist
---
app/services/projects/apply_transfer_service.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/services/projects/apply_transfer_service.rb b/app/services/projects/apply_transfer_service.rb
index e8839167d..28097bed5 100644
--- a/app/services/projects/apply_transfer_service.rb
+++ b/app/services/projects/apply_transfer_service.rb
@@ -22,9 +22,9 @@ class Projects::ApplyTransferService < ApplicationService
private
def validate!
raise Error, '仓库标识不正确' if @project.identifier != params[:identifier]
- raise Error, '新拥有者已经存在同名仓库!' if Project.where(user_id: @owner.id, identifier: params[:identifier]).present?
raise Error, '该仓库正在迁移' if @project.is_transfering
raise Error, '新拥有者不存在' unless @owner.present?
+ raise Error, '新拥有者已经存在同名仓库!' if Project.where(user_id: @owner.id, identifier: params[:identifier]).present?
raise Error, '未拥有转移权限' unless is_permit_owner
end
From b68c9945e54f34f3bcf45a474d2131555749a337 Mon Sep 17 00:00:00 2001
From: "vilet.yy"
Date: Tue, 27 Apr 2021 14:40:18 +0800
Subject: [PATCH 14/40] add: project edit transfer
---
app/views/repositories/edit.json.jbuilder | 5 ++++-
app/views/users/_user_simple.json.jbuilder | 14 +++++++++-----
2 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/app/views/repositories/edit.json.jbuilder b/app/views/repositories/edit.json.jbuilder
index d268696cc..7a11411f4 100644
--- a/app/views/repositories/edit.json.jbuilder
+++ b/app/views/repositories/edit.json.jbuilder
@@ -9,4 +9,7 @@ json.website @project.website
json.project_units @project.project_units.pluck(:unit_type)
json.lesson_url @project.lesson_url
json.permission render_permission(current_user, @project)
-json.is_transfering @project.is_transfering
\ No newline at end of file
+json.is_transfering @project.is_transfering
+json.transfer do
+ json.partial! "/users/user_simple", locals: {user: @project&.applied_transfer_project&.owner}
+end
\ No newline at end of file
diff --git a/app/views/users/_user_simple.json.jbuilder b/app/views/users/_user_simple.json.jbuilder
index cfd06a405..5da161509 100644
--- a/app/views/users/_user_simple.json.jbuilder
+++ b/app/views/users/_user_simple.json.jbuilder
@@ -1,5 +1,9 @@
-json.id user.id
-json.type user.type
-json.name user.real_name
-json.login user.login
-json.image_url url_to_avatar(user)
\ No newline at end of file
+if user.present?
+ json.id user.id
+ json.type user.type
+ json.name user.real_name
+ json.login user.login
+ json.image_url url_to_avatar(user)
+else
+ json.nil!
+end
\ No newline at end of file
From 120a33bc8ab5ae09c79fb589c6eecb3a50269513 Mon Sep 17 00:00:00 2001
From: "vilet.yy"
Date: Tue, 27 Apr 2021 15:43:37 +0800
Subject: [PATCH 15/40] add: undo count
---
app/controllers/users_controller.rb | 2 ++
app/jobs/send_transfer_project_applied_message_job.rb | 6 +++---
app/views/users/show.json.jbuilder | 2 ++
3 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index c6ac626a3..395a5a6d9 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -32,6 +32,8 @@ class UsersController < ApplicationController
@common_applied_transfer_projects = AppliedTransferProject.where(owner_id: @user.id).common + AppliedTransferProject.where(owner_id: Organization.joins(team_users: :team).where(team_users: {user_id: @user.id}, teams: {authorize: %w(admin owner)} )).common
@undo_events = @waiting_applied_messages.size + @common_applied_transfer_projects.size
else
+ @waiting_applied_messages = AppliedMessage.none
+ @common_applied_transfer_projects = AppliedTransferProject.none
@undo_events = 0
end
#用户的组织数量
diff --git a/app/jobs/send_transfer_project_applied_message_job.rb b/app/jobs/send_transfer_project_applied_message_job.rb
index 5f0c24c65..92ea306d1 100644
--- a/app/jobs/send_transfer_project_applied_message_job.rb
+++ b/app/jobs/send_transfer_project_applied_message_job.rb
@@ -16,7 +16,7 @@ class SendTransferProjectAppliedMessageJob < ApplicationJob
AppliedMessage.create!(user_id: rec.user_id,
applied: applied_transfer_project,
status: message_status,
- name: build_name(project.name, applied_transfer_project&.owner&.real_name, message_status),
+ name: build_name(project.name, applied_transfer_project&.owner&.real_name, message_status, applied_user&.real_name),
applied_user_id: applied_user.id,
project_id: project.id)
end
@@ -31,7 +31,7 @@ class SendTransferProjectAppliedMessageJob < ApplicationJob
end
private
- def build_name(repo_name, owner_name, message_status)
+ def build_name(repo_name, owner_name, message_status, applied_name="")
case message_status
when 'canceled'
return "取消转移【#{repo_name}】仓库"
@@ -40,7 +40,7 @@ class SendTransferProjectAppliedMessageJob < ApplicationJob
when 'successed'
return "【#{repo_name}】仓库成功转移给【#{owner_name}】"
when 'failure'
- return "【#{repo_name}】仓库转移失败"
+ return "拒绝转移【#{repo_name}】仓库"
end
""
end
diff --git a/app/views/users/show.json.jbuilder b/app/views/users/show.json.jbuilder
index 54f85c5c2..e80ac7494 100644
--- a/app/views/users/show.json.jbuilder
+++ b/app/views/users/show.json.jbuilder
@@ -10,6 +10,8 @@ json.user_identity @user.identity
json.is_watch current_user&.watched?(@user)
json.watched_count @user.fan_count #粉丝
json.watching_count @user.follow_count #关注数
+json.undo_messages @waiting_applied_messages.size
+json.undo_transfer_projects @common_applied_transfer_projects.size
json.undo_events @undo_events
json.user_composes_count @user_composes_count
json.user_org_count @user_org_count
From 65d51e857804d1bf2bbdea7adc6297aed45fecec Mon Sep 17 00:00:00 2001
From: "vilet.yy"
Date: Wed, 28 Apr 2021 15:15:45 +0800
Subject: [PATCH 16/40] add: project operate add organization team users
---
app/controllers/pull_requests_controller.rb | 2 +-
app/helpers/tag_chosen_helper.rb | 15 ++++++---------
app/models/concerns/project_operable.rb | 6 ++++++
app/models/user.rb | 3 +++
app/views/pull_requests/_merge_item.json.jbuilder | 10 +++++-----
5 files changed, 21 insertions(+), 15 deletions(-)
diff --git a/app/controllers/pull_requests_controller.rb b/app/controllers/pull_requests_controller.rb
index c59a196b5..48735e787 100644
--- a/app/controllers/pull_requests_controller.rb
+++ b/app/controllers/pull_requests_controller.rb
@@ -215,7 +215,7 @@ class PullRequestsController < ApplicationController
def get_relatived
@project_tags = @project.issue_tags&.select(:id,:name, :color).as_json
@project_versions = @project.versions&.select(:id,:name, :status).as_json
- @project_members = @project.members_user_infos
+ @project_members = @project.all_collaborators
@project_priories = IssuePriority&.select(:id,:name, :position).as_json
end
diff --git a/app/helpers/tag_chosen_helper.rb b/app/helpers/tag_chosen_helper.rb
index afd51170d..1e7879d18 100644
--- a/app/helpers/tag_chosen_helper.rb
+++ b/app/helpers/tag_chosen_helper.rb
@@ -124,14 +124,13 @@ module TagChosenHelper
end
def render_cache_collaborators(project)
- cache_key = "all_collaborators/#{project.members.maximum('created_on')}"
-
+ cache_key = "all_collaborators/#{project.all_collaborators.maximum('created_on')}"
Rails.cache.fetch(cache_key) do
- project.members.includes(:user).collect do |event|
+ project.all_collaborators.order(created_on: :desc).collect do |user|
{
- id: event.user&.id,
- name: event.user&.show_real_name,
- avatar_url: url_to_avatar(event.user),
+ id: user&.id,
+ name: user&.show_real_name,
+ avatar_url: url_to_avatar(user),
is_chosen: '0'
}
end
@@ -171,10 +170,8 @@ module TagChosenHelper
# depended_issues_id = @depended_issues_id
end
- project_members = project.members_user_infos
project_members_info = [] #指派给
- project_members.includes(user: :user_extension).each do |member|
- user = member&.user
+ project.all_collaborators.includes(:user_extension).each do |user|
if user
real_name = user.try(:show_real_name)
user_id = user.id
diff --git a/app/models/concerns/project_operable.rb b/app/models/concerns/project_operable.rb
index e151613d5..5937126d3 100644
--- a/app/models/concerns/project_operable.rb
+++ b/app/models/concerns/project_operable.rb
@@ -92,4 +92,10 @@ module ProjectOperable
def has_menu_permission(unit_type)
self.project_units.where(unit_type: unit_type).exists?
end
+
+ def all_collaborators
+ member_sql = User.joins(members: :roles).where(members: {project_id: self.id}, roles: {name: %w(Manager Developer Reporter)}).to_sql
+ team_user_sql = User.joins(teams: :team_projects).where(team_projects: {project_id: self.id}).to_sql
+ return User.from("( #{ member_sql } UNION #{ team_user_sql } ) AS users").distinct
+ end
end
diff --git a/app/models/user.rb b/app/models/user.rb
index e41e47d93..256cc7b41 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -152,6 +152,9 @@ class User < Owner
# 项目
has_many :applied_projects, dependent: :destroy
has_many :operate_applied_transfer_projects, class_name: 'AppliedTransferProject', dependent: :destroy
+ has_many :members, dependent: :destroy
+ has_many :team_users, dependent: :destroy
+ has_many :teams, through: :team_users
# 教学案例
# has_many :libraries, dependent: :destroy
diff --git a/app/views/pull_requests/_merge_item.json.jbuilder b/app/views/pull_requests/_merge_item.json.jbuilder
index 8475c468d..0db17e265 100644
--- a/app/views/pull_requests/_merge_item.json.jbuilder
+++ b/app/views/pull_requests/_merge_item.json.jbuilder
@@ -5,10 +5,10 @@ json.issue_priories @project_priories
json.project_author @project.owner.try(:show_real_name)
json.project_name @project.try(:name)
json.members do
- json.array! @project_members.to_a.each do |member|
- json.id member.user_id
- json.login member.user.try(:login)
- json.name member.user.try(:show_real_name)
- json.avatar_url url_to_avatar(member.user)
+ json.array! @project_members.to_a.each do |user|
+ json.id user.id
+ json.login user.try(:login)
+ json.name user.try(:show_real_name)
+ json.avatar_url url_to_avatar(user)
end
end
\ No newline at end of file
From ea42b0d6edc01ed6daad025b1a4256a37c812ca3 Mon Sep 17 00:00:00 2001
From: "vilet.yy"
Date: Wed, 28 Apr 2021 20:10:21 +0800
Subject: [PATCH 17/40] fix: pull_request can not select reporter and compare
userinfo lose
---
app/controllers/pull_requests_controller.rb | 2 +-
app/models/concerns/project_operable.rb | 6 ++++++
app/views/compare/show.json.jbuilder | 4 ++--
3 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/app/controllers/pull_requests_controller.rb b/app/controllers/pull_requests_controller.rb
index 48735e787..d0221b768 100644
--- a/app/controllers/pull_requests_controller.rb
+++ b/app/controllers/pull_requests_controller.rb
@@ -215,7 +215,7 @@ class PullRequestsController < ApplicationController
def get_relatived
@project_tags = @project.issue_tags&.select(:id,:name, :color).as_json
@project_versions = @project.versions&.select(:id,:name, :status).as_json
- @project_members = @project.all_collaborators
+ @project_members = @project.all_managers
@project_priories = IssuePriority&.select(:id,:name, :position).as_json
end
diff --git a/app/models/concerns/project_operable.rb b/app/models/concerns/project_operable.rb
index 5937126d3..5f8f929e7 100644
--- a/app/models/concerns/project_operable.rb
+++ b/app/models/concerns/project_operable.rb
@@ -98,4 +98,10 @@ module ProjectOperable
team_user_sql = User.joins(teams: :team_projects).where(team_projects: {project_id: self.id}).to_sql
return User.from("( #{ member_sql } UNION #{ team_user_sql } ) AS users").distinct
end
+
+ def all_managers
+ member_sql = User.joins(members: :roles).where(members: {project_id: self.id}, roles: {name: %w(Manager)}).to_sql
+ team_user_sql = User.joins(teams: :team_projects).where(teams: {authorize: %w(owner admin)},team_projects: {project_id: self.id}).to_sql
+ return User.from("( #{ member_sql} UNION #{ team_user_sql } ) AS users").distinct
+ end
end
diff --git a/app/views/compare/show.json.jbuilder b/app/views/compare/show.json.jbuilder
index 8257cc7fa..8b75fa3dd 100644
--- a/app/views/compare/show.json.jbuilder
+++ b/app/views/compare/show.json.jbuilder
@@ -4,7 +4,7 @@ json.commits do
json.array! @compare_result['Commits'] do |commit|
json.author do
# TODO: 获取头像地址待优化
- forge_user = User.includes(:user_extension).select(:id, :login).find_by(login: commit['Author']['Name'])
+ forge_user = User.includes(:user_extension).find_by(login: commit['Author']['Name'])
json.login commit['Author']['Name']
json.name commit['Author']['Name']
json.image_url forge_user.nil? ? '' : url_to_avatar(forge_user)
@@ -12,7 +12,7 @@ json.commits do
json.committer do
# TODO: 获取头像地址待优化
- forge_user = User.includes(:user_extension).select(:id, :login).find_by(login: commit['Committer']['Name'])
+ forge_user = User.includes(:user_extension).find_by(login: commit['Committer']['Name'])
json.login commit['Committer']['Name']
json.name commit['Committer']['Name']
json.image_url forge_user.nil? ? '' : url_to_avatar(forge_user)
From c14c92ac11f1b0e188fbcd5b025d157ae1e7c4d5 Mon Sep 17 00:00:00 2001
From: "vilet.yy"
Date: Thu, 29 Apr 2021 10:23:16 +0800
Subject: [PATCH 18/40] fix: pull_request permit develop create pr
---
app/controllers/pull_requests_controller.rb | 4 ++--
app/models/concerns/project_operable.rb | 6 ++++++
app/models/project_unit.rb | 2 ++
3 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/app/controllers/pull_requests_controller.rb b/app/controllers/pull_requests_controller.rb
index d0221b768..3d18e5032 100644
--- a/app/controllers/pull_requests_controller.rb
+++ b/app/controllers/pull_requests_controller.rb
@@ -140,7 +140,7 @@ class PullRequestsController < ApplicationController
end
def pr_merge
- return render_forbidden("你没有权限操作.") unless current_user.project_manager?(@project)
+ return render_forbidden("你没有权限操作.") unless @project.develper?(current_user)
if params[:do].blank?
normal_status(-1, "请选择合并方式")
@@ -215,7 +215,7 @@ class PullRequestsController < ApplicationController
def get_relatived
@project_tags = @project.issue_tags&.select(:id,:name, :color).as_json
@project_versions = @project.versions&.select(:id,:name, :status).as_json
- @project_members = @project.all_managers
+ @project_members = @project.all_developers
@project_priories = IssuePriority&.select(:id,:name, :position).as_json
end
diff --git a/app/models/concerns/project_operable.rb b/app/models/concerns/project_operable.rb
index 5f8f929e7..a4646f9ee 100644
--- a/app/models/concerns/project_operable.rb
+++ b/app/models/concerns/project_operable.rb
@@ -99,6 +99,12 @@ module ProjectOperable
return User.from("( #{ member_sql } UNION #{ team_user_sql } ) AS users").distinct
end
+ def all_developers
+ member_sql = User.joins(members: :roles).where(members: {project_id: self.id}, roles: {name: %w(Manager Developer)}).to_sql
+ team_user_sql = User.joins(teams: :team_projects).where(teams: {authorize: %w(owner admin write)}, team_projects: {project_id: self.id}).to_sql
+ return User.from("( #{ member_sql } UNION #{ team_user_sql } ) AS users").distinct
+ end
+
def all_managers
member_sql = User.joins(members: :roles).where(members: {project_id: self.id}, roles: {name: %w(Manager)}).to_sql
team_user_sql = User.joins(teams: :team_projects).where(teams: {authorize: %w(owner admin)},team_projects: {project_id: self.id}).to_sql
diff --git a/app/models/project_unit.rb b/app/models/project_unit.rb
index 0f4275345..1cb74fc4a 100644
--- a/app/models/project_unit.rb
+++ b/app/models/project_unit.rb
@@ -27,6 +27,8 @@ class ProjectUnit < ApplicationRecord
end
def self.update_by_unit_types!(project, types)
+ # 默认code类型自动创建
+ types << "code"
project.project_units.where.not(unit_type: types).each(&:destroy!)
types.each do |type|
project.project_units.find_or_create_by!(unit_type: type)
From b673747475c1750372ab426e76218af00d7409b9 Mon Sep 17 00:00:00 2001
From: "vilet.yy"
Date: Thu, 29 Apr 2021 16:26:39 +0800
Subject: [PATCH 19/40] fix: personal projects
---
app/queries/projects/list_my_query.rb | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/app/queries/projects/list_my_query.rb b/app/queries/projects/list_my_query.rb
index 8ad0d0b0a..5bda56120 100644
--- a/app/queries/projects/list_my_query.rb
+++ b/app/queries/projects/list_my_query.rb
@@ -18,7 +18,9 @@ class Projects::ListMyQuery < ApplicationQuery
end
if params[:category].blank?
- projects = projects.members_projects(user.id)
+ normal_projects = projects.members_projects(user.id).to_sql
+ org_projects = projects.joins(team_projects: [team: :team_users]).where(team_users: {user_id: user.id}).to_sql
+ projects = Project.from("( #{ normal_projects} UNION #{ org_projects } ) AS projects").distinct
elsif params[:category].to_s == "join"
normal_projects = projects.where.not(user_id: user.id).members_projects(user.id).to_sql
org_projects = projects.joins(team_projects: [team: :team_users]).where(team_users: {user_id: user.id}).to_sql
From fffe57a211d0d853dd72b3eb527ca67ce785456c Mon Sep 17 00:00:00 2001
From: "vilet.yy"
Date: Thu, 29 Apr 2021 17:36:36 +0800
Subject: [PATCH 20/40] fix: mirror project permission error
---
app/controllers/users_controller.rb | 1 +
app/models/concerns/project_operable.rb | 8 ++++++++
app/models/organization.rb | 7 +++++++
app/services/projects/migrate_service.rb | 2 ++
app/services/projects/transfer_service.rb | 5 ++---
app/services/repositories/create_service.rb | 11 +----------
lib/tasks/sync_org_project_permission.rake | 8 ++++++++
7 files changed, 29 insertions(+), 13 deletions(-)
create mode 100644 lib/tasks/sync_org_project_permission.rake
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 395a5a6d9..6d95e350a 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -41,6 +41,7 @@ class UsersController < ApplicationController
@user_composes_count = 0
user_organizations = User.current.logged? ? @user.organizations.with_visibility(%w(common limited)) + @user.organizations.with_visibility("privacy").joins(:team_users).where(team_users: {user_id: current_user.id}) : @user.organizations.with_visibility("common")
@user_org_count = user_organizations.size
+ normal_projects = @user.projects
user_projects = User.current.logged? && (User.current.admin? || User.current.login == @user.login) ? @user.projects : @user.projects.visible
@projects_common_count = user_projects.common.size
@projects_mirrior_count = user_projects.mirror.size
diff --git a/app/models/concerns/project_operable.rb b/app/models/concerns/project_operable.rb
index a4646f9ee..739ddf27c 100644
--- a/app/models/concerns/project_operable.rb
+++ b/app/models/concerns/project_operable.rb
@@ -11,6 +11,14 @@ module ProjectOperable
has_many :team_projects, dependent: :destroy
end
+ def set_owner_permission(creator)
+ return unless owner.is_a?(Organization)
+ owner.build_permit_team_projects!(id)
+ # 避免自己创建的项目,却无法拥有访问权,因为该用户所在团队暂未获得项目访问权
+ return if creator.nil? || owner.is_owner?(creator.id)
+ add_member!(creator.id, "Manager")
+ end
+
def add_member!(user_id, role_name='Developer')
member = members.create!(user_id: user_id)
set_developer_role(member, role_name)
diff --git a/app/models/organization.rb b/app/models/organization.rb
index fbf3def79..1d7c24b8e 100644
--- a/app/models/organization.rb
+++ b/app/models/organization.rb
@@ -114,6 +114,13 @@ class Organization < Owner
owner_team_users.pluck(:user_id).include?(user_id) && owner_team_users.size == 1
end
+ # 为包含组织所有项目的团队创建项目访问权限
+ def build_permit_team_projects!(project_id)
+ teams.where(includes_all_project: true).each do |team|
+ TeamProject.build(id, team.id, project_id)
+ end
+ end
+
def real_name
name = lastname + firstname
name = name.blank? ? (nickname.blank? ? login : nickname) : name
diff --git a/app/services/projects/migrate_service.rb b/app/services/projects/migrate_service.rb
index d1e14088f..1eba03788 100644
--- a/app/services/projects/migrate_service.rb
+++ b/app/services/projects/migrate_service.rb
@@ -1,5 +1,6 @@
class Projects::MigrateService < ApplicationService
attr_reader :user, :params
+ attr_accessor :project
def initialize(user, params)
@user = user
@@ -11,6 +12,7 @@ class Projects::MigrateService < ApplicationService
if @project.save!
ProjectUnit.init_types(@project.id)
Project.update_mirror_projects_count!
+ @project.set_owner_permission(user)
Repositories::MigrateService.new(user, @project, repository_params).call
else
#
diff --git a/app/services/projects/transfer_service.rb b/app/services/projects/transfer_service.rb
index 4582a2103..a2da34f09 100644
--- a/app/services/projects/transfer_service.rb
+++ b/app/services/projects/transfer_service.rb
@@ -33,9 +33,8 @@ class Projects::TransferService < ApplicationService
def update_visit_teams
if new_owner.is_a?(Organization)
- new_owner.teams.where(includes_all_project: true).each do |team|
- TeamProject.build(new_owner.id, team.id, project.id)
- end
+ # 为包含组织所有项目的团队创建项目访问权限
+ new_owner.build_permit_team_projects(project.id)
else
project.team_projects.each(&:destroy!)
end
diff --git a/app/services/repositories/create_service.rb b/app/services/repositories/create_service.rb
index 18e726440..c341429fe 100644
--- a/app/services/repositories/create_service.rb
+++ b/app/services/repositories/create_service.rb
@@ -15,6 +15,7 @@ class Repositories::CreateService < ApplicationService
create_gitea_repository
sync_project
sync_repository
+ set_owner_permission(user)
# if project.project_type == "common"
# chain_params = {
# type: "create",
@@ -44,19 +45,9 @@ class Repositories::CreateService < ApplicationService
@gitea_repository = Gitea::Repository::CreateService.new(user.gitea_token, gitea_repository_params).call
elsif project.owner.is_a?(Organization)
@gitea_repository = Gitea::Organization::Repository::CreateService.call(user.gitea_token, project.owner.login, gitea_repository_params)
- project.owner.teams.each do |team|
- next unless team.includes_all_project
- TeamProject.build(project.user_id, team.id, project.id)
- end
- create_manager_member
end
end
- def create_manager_member
- return if project.owner.is_owner?(user.id)
- project.add_member!(user.id, "Manager")
- end
-
def sync_project
if gitea_repository
project.update_columns(
diff --git a/lib/tasks/sync_org_project_permission.rake b/lib/tasks/sync_org_project_permission.rake
new file mode 100644
index 000000000..5828d1c8a
--- /dev/null
+++ b/lib/tasks/sync_org_project_permission.rake
@@ -0,0 +1,8 @@
+namespace :sync_org_project_permission do
+ desc "sync organization project team permissions"
+ task mirror: :environment do
+ Project.mirror.includes(:team_projects,:owner).where(team_projects: {id: nil}, users: {type: 'Organization'}).find_each do |project|
+ project.set_owner_permission(nil)
+ end
+ end
+end
\ No newline at end of file
From 1a7b323120acd143bf79e301125ab56af7cc23e0 Mon Sep 17 00:00:00 2001
From: "vilet.yy"
Date: Thu, 29 Apr 2021 17:43:36 +0800
Subject: [PATCH 21/40] fix: user info projects count
---
app/controllers/users_controller.rb | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 6d95e350a..3c62b1145 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -41,8 +41,10 @@ class UsersController < ApplicationController
@user_composes_count = 0
user_organizations = User.current.logged? ? @user.organizations.with_visibility(%w(common limited)) + @user.organizations.with_visibility("privacy").joins(:team_users).where(team_users: {user_id: current_user.id}) : @user.organizations.with_visibility("common")
@user_org_count = user_organizations.size
- normal_projects = @user.projects
- user_projects = User.current.logged? && (User.current.admin? || User.current.login == @user.login) ? @user.projects : @user.projects.visible
+ normal_projects = Project.members_projects(@user.id).to_sql
+ org_projects = Project.joins(team_projects: [team: :team_users]).where(team_users: {user_id: @user.id}).to_sql
+ projects = Project.from("( #{ normal_projects} UNION #{ org_projects } ) AS projects").distinct
+ user_projects = User.current.logged? && (User.current.admin? || User.current.login == @user.login) ? projects : projects.visible
@projects_common_count = user_projects.common.size
@projects_mirrior_count = user_projects.mirror.size
@projects_sync_mirrior_count = user_projects.sync_mirror.size
From 1277e717ffd56453c76eb9a18c15457a7824a077 Mon Sep 17 00:00:00 2001
From: jasder
Date: Thu, 29 Apr 2021 18:35:57 +0800
Subject: [PATCH 22/40] =?UTF-8?q?ADD=20github=20gitlab=E9=95=9C=E5=83=8F?=
=?UTF-8?q?=E5=8A=A0=E9=80=9F=E5=99=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/concerns/.keep | 0
app/controllers/concerns/acceleratorable.rb | 28 ++++
app/controllers/projects_controller.rb | 20 ++-
app/helpers/projects_helper.rb | 5 +-
app/models/project.rb | 145 ++++++++---------
app/models/repository.rb | 2 +
.../gitea/accelerator/migrate_service.rb | 146 ++++++++++++++++++
app/services/projects/migrate_service.rb | 3 +-
app/services/repositories/migrate_service.rb | 4 +-
app/views/repositories/detail.json.jbuilder | 2 +-
config/configuration.yml.example | 12 +-
...016_add_accelerator_url_to_repositories.rb | 5 +
...19_add_source_clone_url_to_repositories.rb | 5 +
13 files changed, 295 insertions(+), 82 deletions(-)
delete mode 100644 app/controllers/concerns/.keep
create mode 100644 app/controllers/concerns/acceleratorable.rb
create mode 100644 app/services/gitea/accelerator/migrate_service.rb
create mode 100644 db/migrate/20210429095016_add_accelerator_url_to_repositories.rb
create mode 100644 db/migrate/20210429100619_add_source_clone_url_to_repositories.rb
diff --git a/app/controllers/concerns/.keep b/app/controllers/concerns/.keep
deleted file mode 100644
index e69de29bb..000000000
diff --git a/app/controllers/concerns/acceleratorable.rb b/app/controllers/concerns/acceleratorable.rb
new file mode 100644
index 000000000..9a11e46c2
--- /dev/null
+++ b/app/controllers/concerns/acceleratorable.rb
@@ -0,0 +1,28 @@
+module Acceleratorable
+ extend ActiveSupport::Concern
+
+ def enable_accelerator?(clone_addr)
+ clone_addr.include?(github_domain) || clone_addr.include?(gitlab_domain)
+ end
+
+ def accelerator_url(repo_name)
+ [accelerator_domain, accelerator_username, "#{repo_name}.git"].join('/')
+ end
+
+ def github_domain
+ 'github.com'
+ end
+
+ def gitlab_domain
+ 'gitlab.com'
+ end
+
+ def accelerator_domain
+ Gitea.gitea_config[:accelerator]["domain"]
+ end
+
+ def accelerator_username
+ Gitea.gitea_config[:accelerator]["access_key_id"]
+ end
+
+end
\ No newline at end of file
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index ca66b4361..e6abf98a4 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -2,6 +2,8 @@ class ProjectsController < ApplicationController
include ApplicationHelper
include OperateProjectAbilityAble
include ProjectsHelper
+ include Acceleratorable
+
before_action :require_login, except: %i[index branches group_type_list simple show fork_users praise_users watch_users recommend about menu_list]
before_action :load_project, except: %i[index group_type_list migrate create recommend]
before_action :authorizate_user_can_edit_project!, only: %i[update]
@@ -53,7 +55,23 @@ class ProjectsController < ApplicationController
def migrate
Projects::MigrateForm.new(mirror_params).validate!
- @project = Projects::MigrateService.new(current_user, mirror_params).call
+
+ @project =
+ if enable_accelerator?(mirror_params[:clone_addr])
+ source_clone_url = mirror_params[:clone_addr]
+ uid_logger("########## 已动加速器 ##########")
+ result = Gitea::Accelerator::MigrateService.call(mirror_params)
+ if result[:status] == :success
+ Rails.logger.info "########## 加速镜像成功 ########## "
+ Projects::MigrateService.call(current_user,
+ mirror_params.merge(source_clone_url: source_clone_url,
+ clone_addr: accelerator_url(mirror_params[:repository_name])))
+ else
+ Projects::MigrateService.call(current_user, mirror_params)
+ end
+ else
+ Projects::MigrateService.call(current_user, mirror_params)
+ end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb
index aec4b38d7..c220701a1 100644
--- a/app/helpers/projects_helper.rb
+++ b/app/helpers/projects_helper.rb
@@ -34,15 +34,14 @@ module ProjectsHelper
end
def json_response(project, user)
- # repo = project.repository
- repo = Repository.includes(:mirror).select(:id, :mirror_url).find_by(project: project)
+ repo = Repository.includes(:mirror).select(:id, :mirror_url, :source_clone_url).find_by(project: project)
tmp_json = {}
unless project.common?
tmp_json = tmp_json.merge({
mirror_status: repo.mirror_status,
mirror_num: repo.mirror_num,
- mirror_url: repo.mirror_url,
+ mirror_url: repo.source_clone_url || repo.mirror_url,
first_sync: repo.first_sync?
})
end
diff --git a/app/models/project.rb b/app/models/project.rb
index 170bae06a..b48680830 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -1,75 +1,76 @@
-# == Schema Information
-#
-# Table name: projects
-#
-# id :integer not null, primary key
-# name :string(255) default(""), not null
-# description :text(4294967295)
-# homepage :string(255) default("")
-# is_public :boolean default("1"), not null
-# parent_id :integer
-# created_on :datetime
-# updated_on :datetime
-# identifier :string(255)
-# status :integer default("1"), not null
-# lft :integer
-# rgt :integer
-# inherit_members :boolean default("0"), not null
-# project_type :integer default("0")
-# hidden_repo :boolean default("0"), not null
-# attachmenttype :integer default("1")
-# user_id :integer
-# dts_test :integer default("0")
-# enterprise_name :string(255)
-# organization_id :integer
-# project_new_type :integer
-# gpid :integer
-# forked_from_project_id :integer
-# forked_count :integer default("0")
-# publish_resource :integer default("0")
-# visits :integer default("0")
-# hot :integer default("0")
-# invite_code :string(255)
-# qrcode :string(255)
-# qrcode_expiretime :integer default("0")
-# script :text(65535)
-# training_status :integer default("0")
-# rep_identifier :string(255)
-# project_category_id :integer
-# project_language_id :integer
-# praises_count :integer default("0")
-# watchers_count :integer default("0")
-# issues_count :integer default("0")
-# pull_requests_count :integer default("0")
-# language :string(255)
-# versions_count :integer default("0")
-# issue_tags_count :integer default("0")
-# closed_issues_count :integer default("0")
-# open_devops :boolean default("0")
-# gitea_webhook_id :integer
-# open_devops_count :integer default("0")
-# recommend :boolean default("0")
-# platform :integer default("0")
-# license_id :integer
-# ignore_id :integer
-# default_branch :string(255) default("master")
-# website :string(255)
-# lesson_url :string(255)
-#
-# Indexes
-#
-# index_projects_on_forked_from_project_id (forked_from_project_id)
-# index_projects_on_identifier (identifier)
-# index_projects_on_is_public (is_public)
-# index_projects_on_lft (lft)
-# index_projects_on_name (name)
-# index_projects_on_platform (platform)
-# index_projects_on_project_type (project_type)
-# index_projects_on_recommend (recommend)
-# index_projects_on_rgt (rgt)
-# index_projects_on_status (status)
-# index_projects_on_updated_on (updated_on)
-#
+# == Schema Information
+#
+# Table name: projects
+#
+# id :integer not null, primary key
+# name :string(255) default(""), not null
+# description :text(4294967295)
+# homepage :string(255) default("")
+# is_public :boolean default("1"), not null
+# parent_id :integer
+# created_on :datetime
+# updated_on :datetime
+# identifier :string(255)
+# status :integer default("1"), not null
+# lft :integer
+# rgt :integer
+# inherit_members :boolean default("0"), not null
+# project_type :integer default("0")
+# hidden_repo :boolean default("0"), not null
+# attachmenttype :integer default("1")
+# user_id :integer
+# dts_test :integer default("0")
+# enterprise_name :string(255)
+# organization_id :integer
+# project_new_type :integer
+# gpid :integer
+# forked_from_project_id :integer
+# forked_count :integer default("0")
+# publish_resource :integer default("0")
+# visits :integer default("0")
+# hot :integer default("0")
+# invite_code :string(255)
+# qrcode :string(255)
+# qrcode_expiretime :integer default("0")
+# script :text(65535)
+# training_status :integer default("0")
+# rep_identifier :string(255)
+# project_category_id :integer
+# project_language_id :integer
+# praises_count :integer default("0")
+# watchers_count :integer default("0")
+# issues_count :integer default("0")
+# pull_requests_count :integer default("0")
+# language :string(255)
+# versions_count :integer default("0")
+# issue_tags_count :integer default("0")
+# closed_issues_count :integer default("0")
+# open_devops :boolean default("0")
+# gitea_webhook_id :integer
+# open_devops_count :integer default("0")
+# recommend :boolean default("0")
+# platform :integer default("0")
+# license_id :integer
+# ignore_id :integer
+# default_branch :string(255) default("master")
+# website :string(255)
+# lesson_url :string(255)
+#
+# Indexes
+#
+# index_projects_on_forked_from_project_id (forked_from_project_id)
+# index_projects_on_identifier (identifier)
+# index_projects_on_is_public (is_public)
+# index_projects_on_lft (lft)
+# index_projects_on_name (name)
+# index_projects_on_platform (platform)
+# index_projects_on_project_type (project_type)
+# index_projects_on_recommend (recommend)
+# index_projects_on_rgt (rgt)
+# index_projects_on_status (status)
+# index_projects_on_updated_on (updated_on)
+#
+
class Project < ApplicationRecord
include Matchable
diff --git a/app/models/repository.rb b/app/models/repository.rb
index 978bc3c57..f4556cea1 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -22,6 +22,8 @@
# version_releases_count :integer default("0")
# fork_url :string(255)
# is_mirror :boolean default("0")
+# accelerator_url :string(255) default("")
+# source_clone_url :string(255) default("")
#
# Indexes
#
diff --git a/app/services/gitea/accelerator/migrate_service.rb b/app/services/gitea/accelerator/migrate_service.rb
new file mode 100644
index 000000000..afe35f139
--- /dev/null
+++ b/app/services/gitea/accelerator/migrate_service.rb
@@ -0,0 +1,146 @@
+class Gitea::Accelerator::MigrateService < ApplicationService
+ attr_reader :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(params)
+ @params = params
+ end
+
+ def call
+ return error('[gitea:] accelerator config missing') if check_accelerator!
+ response = post(url, request_params)
+
+ render_status(response)
+ end
+
+ private
+
+ def request_params
+ {
+ uid: access_uid,
+ clone_addr: params[:clone_addr],
+ repo_name: params[:repository_name],
+ auth_username: params[:auth_username],
+ auth_password: params[:auth_password],
+ mirror: ActiveModel::Type::Boolean.new.cast(params[:is_mirror])
+ }
+ end
+
+ def url
+ "/repos/migrate".freeze
+ end
+
+ def post(url, params)
+ puts "[gitea] request params: #{params}"
+ puts "[gitea] access_username: #{access_username}"
+ puts "[gitea] access_password: #{access_password}"
+ conn.post do |req|
+ req.url full_url(url)
+ req.body = params.to_json
+ end
+ end
+
+ def conn
+ @client ||= begin
+ Faraday.new(url: domain) do |req|
+ req.request :url_encoded
+ req.headers['Content-Type'] = 'application/json'
+ req.response :logger # 显示日志
+ req.adapter Faraday.default_adapter
+ req.basic_auth(access_username, access_password)
+ end
+ end
+ @client
+ end
+
+ def base_url
+ accelerator["base_url"]
+ end
+
+ def domain
+ accelerator["domain"]
+ end
+
+ def api_url
+ [domain, base_url].join('')
+ end
+
+ def full_url(api_rest, action='post')
+ url = [api_url, api_rest].join('').freeze
+ url = action === 'get' ? url : URI.escape(url)
+ puts "[gitea] request url: #{url}"
+ url
+ end
+
+ def access_username
+ accelerator["access_key_id"]
+ end
+
+ def access_password
+ accelerator["access_key_secret"]
+ end
+
+ def access_uid
+ accelerator["access_admin_uid"]
+ end
+
+ def accelerator
+ Gitea.gitea_config[:accelerator]
+ end
+
+ def render_status(response)
+ puts "[gitea] response status: #{response.status}"
+ puts "[gitea] response body: #{response.body}"
+ case response.status
+ when 201
+ success
+ when 403
+ error('APIForbiddenError')
+ when 422
+ error('APIValidationError')
+ end
+ end
+
+ def error(message)
+ {
+ status: :error,
+ message: message,
+ data: nil
+ }
+ end
+
+ def success(data=nil)
+ {
+ status: :success,
+ message: nil,
+ data: data
+ }
+ end
+
+ def check_accelerator!
+ accelerator.blank? || access_username.blank? || access_password.blank? || domain.blank?
+ end
+end
\ No newline at end of file
diff --git a/app/services/projects/migrate_service.rb b/app/services/projects/migrate_service.rb
index d1e14088f..c5c2cf753 100644
--- a/app/services/projects/migrate_service.rb
+++ b/app/services/projects/migrate_service.rb
@@ -48,7 +48,8 @@ class Projects::MigrateService < ApplicationService
user_id: params[:user_id],
login: params[:auth_username],
password: params[:auth_password],
- is_mirror: params[:is_mirror]
+ is_mirror: params[:is_mirror],
+ source_clone_url: params[:source_clone_url]
}
end
diff --git a/app/services/repositories/migrate_service.rb b/app/services/repositories/migrate_service.rb
index 156777cc3..b737b2ef5 100644
--- a/app/services/repositories/migrate_service.rb
+++ b/app/services/repositories/migrate_service.rb
@@ -21,7 +21,9 @@ class Repositories::MigrateService < ApplicationService
private
def repository_params
- params.merge(project_id: project.id, identifier: params[:identifier])
+ params.merge(project_id: project.id,
+ identifier: params[:identifier],
+ source_clone_url: params[:source_clone_url])
end
def gitea_repository_params
diff --git a/app/views/repositories/detail.json.jbuilder b/app/views/repositories/detail.json.jbuilder
index fc1dc830b..644a472ab 100644
--- a/app/views/repositories/detail.json.jbuilder
+++ b/app/views/repositories/detail.json.jbuilder
@@ -21,7 +21,7 @@ json.versions_count @project.versions_count #里程碑数量
json.version_releases_count @project.releases_size(@user.try(:id), "all")
json.version_releasesed_count @project.releases_size(@user.try(:id), "released") #已发行的版本
json.permission render_permission(@user, @project)
-json.mirror_url @project&.repository.mirror_url
+json.mirror_url @project&.repository.source_clone_url
json.mirror @project&.repository.mirror_url.present?
json.type @project.numerical_for_project_type
json.open_devops @project.open_devops?
diff --git a/config/configuration.yml.example b/config/configuration.yml.example
index 823d8547e..b45c9532c 100644
--- a/config/configuration.yml.example
+++ b/config/configuration.yml.example
@@ -45,10 +45,16 @@ default: &default
signature_key: 'test12345678'
gitea:
- access_key_id: 'root'
- access_key_secret: '_Trustie_10010'
- domain: 'https://testgitea.trustie.net'
+ access_key_id: ''
+ access_key_secret: ''
+ domain: 'https://testgit.trustie.net'
base_url: '/api/v1'
+ accelerator:
+ access_key_id: ''
+ access_key_secret: ''
+ access_admin_uid: 1
+ domain: 'https://testgit.trustie.net'
+ base_url: '/api/v1'
production:
diff --git a/db/migrate/20210429095016_add_accelerator_url_to_repositories.rb b/db/migrate/20210429095016_add_accelerator_url_to_repositories.rb
new file mode 100644
index 000000000..0c33ef7b5
--- /dev/null
+++ b/db/migrate/20210429095016_add_accelerator_url_to_repositories.rb
@@ -0,0 +1,5 @@
+class AddAcceleratorUrlToRepositories < ActiveRecord::Migration[5.2]
+ def change
+ add_column :repositories, :accelerator_url, :string, default: ""
+ end
+end
diff --git a/db/migrate/20210429100619_add_source_clone_url_to_repositories.rb b/db/migrate/20210429100619_add_source_clone_url_to_repositories.rb
new file mode 100644
index 000000000..a7f213037
--- /dev/null
+++ b/db/migrate/20210429100619_add_source_clone_url_to_repositories.rb
@@ -0,0 +1,5 @@
+class AddSourceCloneUrlToRepositories < ActiveRecord::Migration[5.2]
+ def change
+ add_column :repositories, :source_clone_url, :string, default: ""
+ end
+end
From 0133ec24cabdfedba9c07c6d31352aa67bec330d Mon Sep 17 00:00:00 2001
From: jasder
Date: Thu, 29 Apr 2021 18:48:54 +0800
Subject: [PATCH 23/40] FIX pr merge bug
---
app/controllers/pull_requests_controller.rb | 2 +-
app/models/concerns/project_operable.rb | 4 ++++
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/app/controllers/pull_requests_controller.rb b/app/controllers/pull_requests_controller.rb
index 3d18e5032..518ad91d9 100644
--- a/app/controllers/pull_requests_controller.rb
+++ b/app/controllers/pull_requests_controller.rb
@@ -140,7 +140,7 @@ class PullRequestsController < ApplicationController
end
def pr_merge
- return render_forbidden("你没有权限操作.") unless @project.develper?(current_user)
+ return render_forbidden("你没有权限操作.") unless @project.operator?(current_user)
if params[:do].blank?
normal_status(-1, "请选择合并方式")
diff --git a/app/models/concerns/project_operable.rb b/app/models/concerns/project_operable.rb
index a4646f9ee..c877b7858 100644
--- a/app/models/concerns/project_operable.rb
+++ b/app/models/concerns/project_operable.rb
@@ -84,6 +84,10 @@ module ProjectOperable
end
end
+ def operator?(user)
+ user.admin? || !reporter?(user)
+ end
+
def set_developer_role(member, role_name)
role = Role.find_by(name: role_name)
member.member_roles.create!(role: role)
From e87413f8a0909e9dd58233234ead802631ba7343 Mon Sep 17 00:00:00 2001
From: jasder
Date: Thu, 29 Apr 2021 19:12:48 +0800
Subject: [PATCH 24/40] FIX migrate repo api bug
---
app/services/gitea/accelerator/migrate_service.rb | 2 ++
1 file changed, 2 insertions(+)
diff --git a/app/services/gitea/accelerator/migrate_service.rb b/app/services/gitea/accelerator/migrate_service.rb
index afe35f139..015a09b16 100644
--- a/app/services/gitea/accelerator/migrate_service.rb
+++ b/app/services/gitea/accelerator/migrate_service.rb
@@ -121,6 +121,8 @@ class Gitea::Accelerator::MigrateService < ApplicationService
error('APIForbiddenError')
when 422
error('APIValidationError')
+ else
+ error("MigrateError")
end
end
From c56f0ca7fc6d59a65aeadac0ae24e9a5defcf00b Mon Sep 17 00:00:00 2001
From: jasder
Date: Thu, 29 Apr 2021 23:17:55 +0800
Subject: [PATCH 25/40] =?UTF-8?q?FIX=20=E8=A7=A3=E5=86=B3=E5=90=88?=
=?UTF-8?q?=E5=B9=B6=E8=AF=B7=E6=B1=82=E7=9A=84=E6=9D=83=E9=99=90=E9=97=AE?=
=?UTF-8?q?=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/models/organization.rb | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/app/models/organization.rb b/app/models/organization.rb
index fbf3def79..b4ebc59a2 100644
--- a/app/models/organization.rb
+++ b/app/models/organization.rb
@@ -108,6 +108,10 @@ class Organization < Owner
team_users.joins(:team).where(user_id: user_id, teams: {authorize: %w(read write admin owner)}).present?
end
+ def is_only_read?(user_id)
+ team_users.joins(:team).where(user_id: user_id, teams: {authorize: %w(read)}).present?
+ end
+
# 是不是所有者团队的最后一个成员
def is_owner_team_last_one?(user_id)
owner_team_users = team_users.joins(:team).where(teams: {authorize: %w(owner)})
From b2e338732d9215a82c6c14ce28771880751cb992 Mon Sep 17 00:00:00 2001
From: jasder
Date: Thu, 29 Apr 2021 23:23:16 +0800
Subject: [PATCH 26/40] =?UTF-8?q?FIX=20=E8=A7=A3=E5=86=B3=E5=90=88?=
=?UTF-8?q?=E5=B9=B6=E8=AF=B7=E6=B1=82=E7=9A=84=E6=9D=83=E9=99=90=E9=97=AE?=
=?UTF-8?q?=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/models/concerns/project_operable.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/models/concerns/project_operable.rb b/app/models/concerns/project_operable.rb
index c877b7858..54bc94a6b 100644
--- a/app/models/concerns/project_operable.rb
+++ b/app/models/concerns/project_operable.rb
@@ -78,7 +78,7 @@ module ProjectOperable
if owner.is_a?(User)
reporters.exists?(user_id: user.id)
elsif owner.is_a?(Organization)
- reporters.exists?(user_id: user.id) || owner.is_read?(user.id)
+ reporters.exists?(user_id: user.id) || owner.is_only_read?(user.id)
else
false
end
From a9c0d18a5ff8bf4ff0dff899ff28bd65b996df50 Mon Sep 17 00:00:00 2001
From: "vilet.yy"
Date: Fri, 30 Apr 2021 15:36:14 +0800
Subject: [PATCH 27/40] add: gitea response process
---
app/controllers/pull_requests_controller.rb | 4 ++--
app/services/gitea/client_service.rb | 19 +++++++++++++++++++
.../gitea/pull_request/merge_service.rb | 2 +-
app/services/pull_requests/merge_service.rb | 6 +++---
config/gitea_response.yml | 7 +++++++
5 files changed, 32 insertions(+), 6 deletions(-)
create mode 100644 config/gitea_response.yml
diff --git a/app/controllers/pull_requests_controller.rb b/app/controllers/pull_requests_controller.rb
index 518ad91d9..0dbcdc942 100644
--- a/app/controllers/pull_requests_controller.rb
+++ b/app/controllers/pull_requests_controller.rb
@@ -149,12 +149,12 @@ class PullRequestsController < ApplicationController
begin
result = PullRequests::MergeService.call(@owner, @repository, @pull_request, current_user, params)
- if result && @pull_request.merge!
+ if result.status == 200 && @pull_request.merge!
@pull_request.project_trend_status!
@issue&.custom_journal_detail("merge", "", "该合并请求已被合并", current_user&.id)
normal_status(1, "合并成功")
else
- normal_status(-1, "合并失败")
+ normal_status(-1, result.message)
end
rescue => e
normal_status(-1, e.message)
diff --git a/app/services/gitea/client_service.rb b/app/services/gitea/client_service.rb
index 1c13bc424..0ef041997 100644
--- a/app/services/gitea/client_service.rb
+++ b/app/services/gitea/client_service.rb
@@ -176,6 +176,25 @@ class Gitea::ClientService < ApplicationService
[status, message, body]
end
+ def render_gitea_response(response)
+ status = response.status
+ body = response&.body
+
+ log_error(status, body)
+ message = nil
+ begin
+ translate = YAML.load(File.read('config/gitea_response.yml'))
+
+ self.class.to_s.underscore.split("/").map{|i| translate=translate[i]}
+ message = body.nil? ? translate[status]['default'] : JSON.parse(body)['message']
+ message = translate[status][message].nil? ? message : translate[status][message]
+
+ return [status, message]
+ rescue
+ return [status, message]
+ end
+ end
+
def get_body_by_status(status, body)
body, message =
case status
diff --git a/app/services/gitea/pull_request/merge_service.rb b/app/services/gitea/pull_request/merge_service.rb
index c33c8781d..bdf2b23be 100644
--- a/app/services/gitea/pull_request/merge_service.rb
+++ b/app/services/gitea/pull_request/merge_service.rb
@@ -20,7 +20,7 @@ class Gitea::PullRequest::MergeService < Gitea::ClientService
def call
response = post(url, request_params)
- render_200_no_body(response)
+ render_gitea_response(response)
end
private
diff --git a/app/services/pull_requests/merge_service.rb b/app/services/pull_requests/merge_service.rb
index a20ee3aa9..d5fc102ec 100644
--- a/app/services/pull_requests/merge_service.rb
+++ b/app/services/pull_requests/merge_service.rb
@@ -1,6 +1,6 @@
class PullRequests::MergeService < ApplicationService
attr_reader :owner, :repo, :pull, :current_user, :params
-
+ attr_accessor :status, :message
# eq:
# PullRequests::MergeService.call(owner, repo, pull, current_user, params)
def initialize(owner, repo, pull, current_user, params)
@@ -15,6 +15,7 @@ class PullRequests::MergeService < ApplicationService
ActiveRecord::Base.transaction do
gitea_pull_merge!
end
+ self
end
private
@@ -22,8 +23,7 @@ class PullRequests::MergeService < ApplicationService
def gitea_pull_merge!
result = Gitea::PullRequest::MergeService.call(@current_user.gitea_token, @owner.login,
@repo.identifier, @pull.gpid, gitea_merge_pull_params)
-
- result[:status] === 200 ? true : false
+ @status, @message = result
end
def gitea_merge_pull_params
diff --git a/config/gitea_response.yml b/config/gitea_response.yml
new file mode 100644
index 000000000..1ff636ac0
--- /dev/null
+++ b/config/gitea_response.yml
@@ -0,0 +1,7 @@
+gitea:
+ pull_request:
+ merge_service:
+ 405:
+ default: "此合并请求有变更与目标分支冲突。"
+ 'User not allowed to merge PR': "用户没有合并请求的权限"
+ 403:
From 3ca629d47d1adf9de2976df05c5e251a032b6964 Mon Sep 17 00:00:00 2001
From: "vilet.yy"
Date: Fri, 30 Apr 2021 16:45:09 +0800
Subject: [PATCH 28/40] fix:create repo error
---
app/services/repositories/create_service.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/services/repositories/create_service.rb b/app/services/repositories/create_service.rb
index c341429fe..f0c584e18 100644
--- a/app/services/repositories/create_service.rb
+++ b/app/services/repositories/create_service.rb
@@ -15,7 +15,7 @@ class Repositories::CreateService < ApplicationService
create_gitea_repository
sync_project
sync_repository
- set_owner_permission(user)
+ @project.set_owner_permission(user)
# if project.project_type == "common"
# chain_params = {
# type: "create",
From 1c111e83b3157f466c350230049b759987a43694 Mon Sep 17 00:00:00 2001
From: "vilet.yy"
Date: Thu, 6 May 2021 14:48:44 +0800
Subject: [PATCH 29/40] fix: project controbutor nil
---
app/views/repositories/detail.json.jbuilder | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/views/repositories/detail.json.jbuilder b/app/views/repositories/detail.json.jbuilder
index 644a472ab..75b474ee0 100644
--- a/app/views/repositories/detail.json.jbuilder
+++ b/app/views/repositories/detail.json.jbuilder
@@ -80,7 +80,7 @@ json.contributors do
total_count = @result[:contributor].size
json.list @result[:contributor].each do |contributor|
user = User.find_by(gitea_uid: contributor["id"])
- if contributor["login"] == "root"
+ if contributor["login"] == "root" || user.nil?
total_count -= 1
next
end
From 604c2595d35f125501a55495acf1ea52cfb8dadc Mon Sep 17 00:00:00 2001
From: "vilet.yy"
Date: Thu, 6 May 2021 15:10:02 +0800
Subject: [PATCH 30/40] add: projects create validate length
---
app/forms/projects/create_form.rb | 6 +++++-
config/locales/forms/projects_create_form.zh-CN.yml | 7 +++++++
2 files changed, 12 insertions(+), 1 deletion(-)
create mode 100644 config/locales/forms/projects_create_form.zh-CN.yml
diff --git a/app/forms/projects/create_form.rb b/app/forms/projects/create_form.rb
index 2838996b6..0b57f215b 100644
--- a/app/forms/projects/create_form.rb
+++ b/app/forms/projects/create_form.rb
@@ -2,11 +2,15 @@ class Projects::CreateForm < BaseForm
REPOSITORY_NAME_REGEX = /^(?!_)(?!.*?_$)[a-zA-Z0-9_-]+$/ #只含有数字、字母、下划线不能以下划线开头和结尾
attr_accessor :user_id, :name, :description, :repository_name, :project_category_id,
:project_language_id, :ignore_id, :license_id, :private, :owner
-
+
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 :name, length: { maximum: 50 }
+ validates :repository_name, length: { maximum: 100 }
+ validates :description, length: { maximum: 200 }
+
validate :check_ignore, :check_license, :check_owner, :check_max_repo_creation
validate do
check_project_category(project_category_id)
diff --git a/config/locales/forms/projects_create_form.zh-CN.yml b/config/locales/forms/projects_create_form.zh-CN.yml
new file mode 100644
index 000000000..e36a0520a
--- /dev/null
+++ b/config/locales/forms/projects_create_form.zh-CN.yml
@@ -0,0 +1,7 @@
+'zh-CN':
+ activemodel:
+ attributes:
+ projects/create_form:
+ name: 项目名称
+ repository_name: 仓库名称
+ description: 项目简介
\ No newline at end of file
From d867823f01dc715b4985c9e17c53b53da6d823db Mon Sep 17 00:00:00 2001
From: "vilet.yy"
Date: Thu, 6 May 2021 17:04:08 +0800
Subject: [PATCH 31/40] add: organization validate
---
.../organizations/organizations_controller.rb | 1 +
app/forms/organizations/create_form.rb | 3 +++
config/locales/forms/organizations_create_form.zh-CN.yml | 9 +++++++++
3 files changed, 13 insertions(+)
create mode 100644 config/locales/forms/organizations_create_form.zh-CN.yml
diff --git a/app/controllers/organizations/organizations_controller.rb b/app/controllers/organizations/organizations_controller.rb
index 09c12fd5a..c8f4f4aa0 100644
--- a/app/controllers/organizations/organizations_controller.rb
+++ b/app/controllers/organizations/organizations_controller.rb
@@ -36,6 +36,7 @@ class Organizations::OrganizationsController < Organizations::BaseController
def update
ActiveRecord::Base.transaction do
+ Organizations::CreateForm.new(organization_params).validate!
login = @organization.login
@organization.login = organization_params[:name] if organization_params[:name].present?
@organization.nickname = organization_params[:nickname] if organization_params[:nickname].present?
diff --git a/app/forms/organizations/create_form.rb b/app/forms/organizations/create_form.rb
index 00c1dd15e..d92a99040 100644
--- a/app/forms/organizations/create_form.rb
+++ b/app/forms/organizations/create_form.rb
@@ -3,6 +3,9 @@ class Organizations::CreateForm < BaseForm
attr_accessor :name, :description, :website, :location, :repo_admin_change_team_access, :visibility, :max_repo_creation, :nickname
validates :name, :nickname, :visibility, presence: true
+ validates :name, :nickname, length: { maximum: 100 }
+ validates :location, length: { maximum: 50 }
+ validates :description, length: { maximum: 200 }
validates :name, format: { with: NAME_REGEX, multiline: true, message: "只能含有数字、字母、下划线且不能以下划线开头和结尾" }
end
diff --git a/config/locales/forms/organizations_create_form.zh-CN.yml b/config/locales/forms/organizations_create_form.zh-CN.yml
new file mode 100644
index 000000000..ab43b0941
--- /dev/null
+++ b/config/locales/forms/organizations_create_form.zh-CN.yml
@@ -0,0 +1,9 @@
+'zh-CN':
+ activemodel:
+ attributes:
+ organizations/create_form:
+ name: 组织账号
+ nickname: 组织名称
+ location: 组织所在地区
+ description: 组织简介
+ visibility: 组织可见性
\ No newline at end of file
From 411c10e8f3c42db704ba616c4674ee61a7a1d4fb Mon Sep 17 00:00:00 2001
From: "vilet.yy"
Date: Thu, 6 May 2021 17:37:30 +0800
Subject: [PATCH 32/40] add: project update valid and user login valid
---
app/controllers/accounts_controller.rb | 4 ++++
app/controllers/projects_controller.rb | 2 +-
app/forms/projects/update_form.rb | 9 ++++++++-
app/forms/users/login_form.rb | 8 ++++++++
config/locales/forms/projects_update_form.zh-CN.yml | 8 ++++++++
config/locales/forms/users_login_form.zh-CN.yml | 6 ++++++
6 files changed, 35 insertions(+), 2 deletions(-)
create mode 100644 app/forms/users/login_form.rb
create mode 100644 config/locales/forms/projects_update_form.zh-CN.yml
create mode 100644 config/locales/forms/users_login_form.zh-CN.yml
diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb
index 8e82a814a..09dfdbdb7 100644
--- a/app/controllers/accounts_controller.rb
+++ b/app/controllers/accounts_controller.rb
@@ -169,6 +169,7 @@ class AccountsController < ApplicationController
# 用户登录
def login
+ Users::LoginForm.new(account_params).validate!
@user = User.try_to_login(params[:login], params[:password])
return normal_status(-2, "错误的账号或密码") if @user.blank?
@@ -345,4 +346,7 @@ class AccountsController < ApplicationController
params.require(:user).permit(:login, :email, :phone)
end
+ def account_params
+ params.require(:account).permit(:login, :password)
+ end
end
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index e6abf98a4..2cc8380a9 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -106,7 +106,7 @@ class ProjectsController < ApplicationController
def update
ActiveRecord::Base.transaction do
- # Projects::CreateForm.new(project_params).validate!
+ Projects::UpdateForm.new(project_params).validate!
private = params[:private] || false
new_project_params = project_params.except(:private).merge(is_public: !private)
diff --git a/app/forms/projects/update_form.rb b/app/forms/projects/update_form.rb
index 4696beaa3..65810a820 100644
--- a/app/forms/projects/update_form.rb
+++ b/app/forms/projects/update_form.rb
@@ -1,4 +1,11 @@
class Projects::UpdateForm < BaseForm
- attr_reader :name, :description, :repository_name, :project_category_id
+ attr_accessor :name, :description, :project_category_id, :project_language_id, :private
+ validates :name, :description, :project_category_id, :project_language_id, presence: true
+ validates :name, length: { maximum: 50 }
+ validates :description, length: { maximum: 200 }
+ validate do
+ check_project_category(project_category_id)
+ check_project_language(project_language_id)
+ end
end
diff --git a/app/forms/users/login_form.rb b/app/forms/users/login_form.rb
new file mode 100644
index 000000000..2634a36cc
--- /dev/null
+++ b/app/forms/users/login_form.rb
@@ -0,0 +1,8 @@
+class Users::LoginForm
+ include ActiveModel::Model
+
+ attr_accessor :password, :login
+
+ validates :login, presence: true
+ validates :password, presence: true, length: { minimum: 8, maximum: 16 }, format: { with: CustomRegexp::PASSWORD, message: "8~16位,支持字母数字和符号" }
+end
\ No newline at end of file
diff --git a/config/locales/forms/projects_update_form.zh-CN.yml b/config/locales/forms/projects_update_form.zh-CN.yml
new file mode 100644
index 000000000..74804f6af
--- /dev/null
+++ b/config/locales/forms/projects_update_form.zh-CN.yml
@@ -0,0 +1,8 @@
+'zh-CN':
+ activemodel:
+ attributes:
+ projects/update_form:
+ name: 项目名称
+ description: 项目简介
+ project_category_id: 项目类别
+ project_language_id: 项目语言
\ No newline at end of file
diff --git a/config/locales/forms/users_login_form.zh-CN.yml b/config/locales/forms/users_login_form.zh-CN.yml
new file mode 100644
index 000000000..8b94db42b
--- /dev/null
+++ b/config/locales/forms/users_login_form.zh-CN.yml
@@ -0,0 +1,6 @@
+'zh-CN':
+ activemodel:
+ attributes:
+ users/login_form:
+ login: 用户名
+ password: 密码
\ No newline at end of file
From fc5876fc32b5136e3bad04c7a6dfb05b6ac4fba4 Mon Sep 17 00:00:00 2001
From: "vilet.yy"
Date: Thu, 6 May 2021 18:22:30 +0800
Subject: [PATCH 33/40] add: team valid
---
app/controllers/organizations/teams_controller.rb | 1 +
app/forms/organizations/create_team_form.rb | 4 +++-
app/models/team.rb | 3 ++-
app/services/organizations/teams/create_service.rb | 6 +++++-
.../locales/forms/organizations_create_team_form.zh-CN.yml | 7 +++++++
5 files changed, 18 insertions(+), 3 deletions(-)
create mode 100644 config/locales/forms/organizations_create_team_form.zh-CN.yml
diff --git a/app/controllers/organizations/teams_controller.rb b/app/controllers/organizations/teams_controller.rb
index a8d06ce46..c599ac420 100644
--- a/app/controllers/organizations/teams_controller.rb
+++ b/app/controllers/organizations/teams_controller.rb
@@ -43,6 +43,7 @@ class Organizations::TeamsController < Organizations::BaseController
end
def update
+ Organizations::CreateTeamForm.new(team_params).validate!
@team = Organizations::Teams::UpdateService.call(current_user, @team, team_params)
rescue Exception => e
uid_logger_error(e.message)
diff --git a/app/forms/organizations/create_team_form.rb b/app/forms/organizations/create_team_form.rb
index 898d69a1d..6d816b0ed 100644
--- a/app/forms/organizations/create_team_form.rb
+++ b/app/forms/organizations/create_team_form.rb
@@ -2,7 +2,9 @@ class Organizations::CreateTeamForm < BaseForm
NAME_REGEX = /^(?!_)(?!.*?_$)[a-zA-Z0-9_-]+$/ #只含有数字、字母、下划线不能以下划线开头和结尾
attr_accessor :name, :nickname, :description, :authorize, :includes_all_project, :can_create_org_project, :unit_types
- validates :name, :nickname, :authorize, presence: true
+ validates :name, :nickname, presence: true
+ validates :name, :nickname, length: { maximum: 100 }
+ validates :description, length: { maximum: 200 }
validates :name, format: { with: NAME_REGEX, multiline: true, message: "只能含有数字、字母、下划线且不能以下划线开头和结尾" }
end
diff --git a/app/models/team.rb b/app/models/team.rb
index d17827da8..c25963905 100644
--- a/app/models/team.rb
+++ b/app/models/team.rb
@@ -33,9 +33,10 @@ class Team < ApplicationRecord
enum authorize: {common: 0, read: 1, write: 2, admin: 3, owner: 4}
- def self.build(organization_id, name, description, authorize, includes_all_project, can_create_org_project)
+ def self.build(organization_id, name, nickname, description, authorize, includes_all_project, can_create_org_project)
self.create!(organization_id: organization_id,
name: name,
+ nickname: nickname,
description: description,
authorize: authorize,
includes_all_project: includes_all_project,
diff --git a/app/services/organizations/teams/create_service.rb b/app/services/organizations/teams/create_service.rb
index 81ad78772..c3fc5f599 100644
--- a/app/services/organizations/teams/create_service.rb
+++ b/app/services/organizations/teams/create_service.rb
@@ -28,6 +28,10 @@ class Organizations::Teams::CreateService < ApplicationService
params[:name]
end
+ def nickname
+ params[:nickname]
+ end
+
def description
params[:description]
end
@@ -45,7 +49,7 @@ class Organizations::Teams::CreateService < ApplicationService
end
def create_team
- @team = Team.build(org.id, name, description, authorize,
+ @team = Team.build(org.id, name, nickname, description, authorize,
includes_all_project, can_create_org_project)
end
diff --git a/config/locales/forms/organizations_create_team_form.zh-CN.yml b/config/locales/forms/organizations_create_team_form.zh-CN.yml
new file mode 100644
index 000000000..ebf40dde0
--- /dev/null
+++ b/config/locales/forms/organizations_create_team_form.zh-CN.yml
@@ -0,0 +1,7 @@
+'zh-CN':
+ activemodel:
+ attributes:
+ organizations/create_team_form:
+ name: 团队标识
+ nickname: 团队名称
+ description: 团队描述
\ No newline at end of file
From 1021731d2bb745bff01a17905e49868feed0d42b Mon Sep 17 00:00:00 2001
From: guotao
Date: Fri, 7 May 2021 10:45:31 +0800
Subject: [PATCH 34/40] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BC=96=E5=8F=B7?=
=?UTF-8?q?=EF=BC=9A45283=20=E6=98=93=E4=BF=AE=E6=A0=87=E9=A2=98=E8=BF=87?=
=?UTF-8?q?=E9=95=BF=E5=AF=BC=E8=87=B4=E6=8E=92=E7=89=88=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/issues_controller.rb | 76 +++++++++----------
app/forms/issues/create_form.rb | 11 +++
app/forms/issues/update_form.rb | 10 +++
.../forms/create_issuse_form.zh-CN.yml | 7 ++
4 files changed, 65 insertions(+), 39 deletions(-)
create mode 100644 app/forms/issues/create_form.rb
create mode 100644 app/forms/issues/update_form.rb
create mode 100644 config/locales/forms/create_issuse_form.zh-CN.yml
diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb
index a3b5fe923..b44a04072 100644
--- a/app/controllers/issues_controller.rb
+++ b/app/controllers/issues_controller.rb
@@ -101,51 +101,46 @@ class IssuesController < ApplicationController
end
def create
- if params[:subject].blank?
- normal_status(-1, "标题不能为空")
- elsif params[:subject].to_s.size > 255
- normal_status(-1, "标题不能超过255个字符")
- else
- issue_params = issue_send_params(params)
-
- @issue = Issue.new(issue_params)
- if @issue.save!
- if params[:attachment_ids].present?
- params[:attachment_ids].each do |id|
- attachment = Attachment.select(:id, :container_id, :container_type)&.find_by_id(id)
- unless attachment.blank?
- attachment.container = @issue
- attachment.author_id = current_user.id
- attachment.description = ""
- attachment.save
- end
- end
- end
- if params[:issue_tag_ids].present?
- params[:issue_tag_ids].each do |tag|
- IssueTagsRelate.create!(issue_id: @issue.id, issue_tag_id: tag)
+ issue_params = issue_send_params(params)
+ Issues::CreateForm.new(issue_params).validate!
+ @issue = Issue.new(issue_params)
+ if @issue.save!
+ if params[:attachment_ids].present?
+ params[:attachment_ids].each do |id|
+ attachment = Attachment.select(:id, :container_id, :container_type)&.find_by_id(id)
+ unless attachment.blank?
+ attachment.container = @issue
+ attachment.author_id = current_user.id
+ attachment.description = ""
+ attachment.save
end
end
- if params[:assigned_to_id].present?
- Tiding.create!(user_id: params[:assigned_to_id], trigger_user_id: current_user.id,
- container_id: @issue.id, container_type: 'Issue',
- parent_container_id: @project.id, parent_container_type: "Project",
- tiding_type: 'issue', status: 0)
- end
-
- #为悬赏任务时, 扣除当前用户的积分
- if params[:issue_type].to_s == "2"
- post_to_chain("minus", params[:token].to_i, current_user.try(:login))
+ end
+ if params[:issue_tag_ids].present?
+ params[:issue_tag_ids].each do |tag|
+ IssueTagsRelate.create!(issue_id: @issue.id, issue_tag_id: tag)
end
+ end
+ if params[:assigned_to_id].present?
+ Tiding.create!(user_id: params[:assigned_to_id], trigger_user_id: current_user.id,
+ container_id: @issue.id, container_type: 'Issue',
+ parent_container_id: @project.id, parent_container_type: "Project",
+ tiding_type: 'issue', status: 0)
+ end
- @issue.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "create")
- render json: {status: 0, message: "创建成", id: @issue.id}
- else
- normal_status(-1, "创建失败")
+ #为悬赏任务时, 扣除当前用户的积分
+ if params[:issue_type].to_s == "2"
+ post_to_chain("minus", params[:token].to_i, current_user.try(:login))
end
+ @issue.project_trends.create(user_id: current_user.id, project_id: @project.id, action_type: "create")
+ render json: {status: 0, message: "创建成", id: @issue.id}
+ else
+ normal_status(-1, "创建失败")
end
-
+ rescue Exception => exception
+ puts exception.message
+ normal_status(-1, exception.message)
end
def edit
@@ -199,7 +194,7 @@ class IssuesController < ApplicationController
normal_status(-1, "不允许修改为关闭状态")
else
issue_params = issue_send_params(params).except(:issue_classify, :author_id, :project_id)
-
+ Issues::UpdateForm.new(issue_params).validate!
if @issue.update_attributes(issue_params)
if params[:status_id].to_i == 5 #任务由非关闭状态到关闭状态时
@issue.issue_times.update_all(end_time: Time.now)
@@ -225,6 +220,9 @@ class IssuesController < ApplicationController
normal_status(-1, "更新失败")
end
end
+ rescue Exception => exception
+ puts exception.message
+ normal_status(-1, exception.message)
end
def show
diff --git a/app/forms/issues/create_form.rb b/app/forms/issues/create_form.rb
new file mode 100644
index 000000000..a8e514c36
--- /dev/null
+++ b/app/forms/issues/create_form.rb
@@ -0,0 +1,11 @@
+class Issues::CreateForm
+ include ActiveModel::Model
+
+ attr_accessor :subject,:description,:is_private,:assigned_to_id,:tracker_id,:status_id,:priority_id,:fixed_version_id,:start_date,:due_date,:estimated_hours,:done_ratio,:issue_type,:token,:issue_tags_value,:closed_on,:branch_name,:issue_classify,:author_id,:project_id
+
+ validates :subject, presence: { message: "不能为空" }
+
+ validates :subject, length: { maximum: 80, too_long: "不能超过80个字符" }
+
+
+end
diff --git a/app/forms/issues/update_form.rb b/app/forms/issues/update_form.rb
new file mode 100644
index 000000000..1c83779c4
--- /dev/null
+++ b/app/forms/issues/update_form.rb
@@ -0,0 +1,10 @@
+class Issues::UpdateForm
+ include ActiveModel::Model
+
+ attr_accessor :subject,:description,:is_private,:assigned_to_id,:tracker_id,:status_id,:priority_id,:fixed_version_id,:start_date,:due_date,:estimated_hours,:done_ratio,:issue_type,:token,:issue_tags_value,:closed_on,:branch_name,:issue_classify,:author_id,:project_id
+
+ validates :subject, presence: { message: "不能为空" }
+
+ validates :subject, length: { maximum: 80, too_long: "不能超过80个字符" }
+
+end
\ No newline at end of file
diff --git a/config/locales/forms/create_issuse_form.zh-CN.yml b/config/locales/forms/create_issuse_form.zh-CN.yml
new file mode 100644
index 000000000..643c68667
--- /dev/null
+++ b/config/locales/forms/create_issuse_form.zh-CN.yml
@@ -0,0 +1,7 @@
+'zh-CN':
+ activemodel:
+ attributes:
+ issues/create_form:
+ subject: 标题
+ issues/update_form:
+ subject: 标题
\ No newline at end of file
From c67686bdf50f335addf1c222d72b03ae679178df Mon Sep 17 00:00:00 2001
From: jasder
Date: Fri, 7 May 2021 11:10:03 +0800
Subject: [PATCH 35/40] FIX code review
---
app/controllers/projects_controller.rb | 2 +-
config/routes.rb | 1 -
2 files changed, 1 insertion(+), 2 deletions(-)
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index e6abf98a4..ed63ab1d1 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -167,7 +167,7 @@ class ProjectsController < ApplicationController
end
def recommend
- @projects = Project.recommend.includes(:repository, :project_category, :owner).limit(5)
+ @projects = Project.recommend.includes(:repository, :project_category, :owner).order(id: :desc).limit(5)
end
def about
diff --git a/config/routes.rb b/config/routes.rb
index fa76ba467..2901e0f56 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -392,7 +392,6 @@ Rails.application.routes.draw do
get :files
get :detail
get :archive
- get :top_counts
get :entries
match :sub_entries, :via => [:get, :put]
get :commits
From b162b3357a979fbd7ecc6f8a18afce32a7509ce8 Mon Sep 17 00:00:00 2001
From: jasder
Date: Fri, 7 May 2021 14:06:40 +0800
Subject: [PATCH 36/40] FIX get mirror url bug
---
app/helpers/projects_helper.rb | 2 +-
app/models/repository.rb | 5 +++++
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb
index c220701a1..226096c24 100644
--- a/app/helpers/projects_helper.rb
+++ b/app/helpers/projects_helper.rb
@@ -41,7 +41,7 @@ module ProjectsHelper
tmp_json = tmp_json.merge({
mirror_status: repo.mirror_status,
mirror_num: repo.mirror_num,
- mirror_url: repo.source_clone_url || repo.mirror_url,
+ mirror_url: repo.remote_mirror_url,
first_sync: repo.first_sync?
})
end
diff --git a/app/models/repository.rb b/app/models/repository.rb
index f4556cea1..0daa4b916 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -78,4 +78,9 @@ class Repository < ApplicationRecord
end
end
+ def remote_mirror_url
+ source_clone_url.blank? ? mirror_url : source_clone_url
+ end
+
+
end
From c96dacbf88788b31f0b19499c791eb134f32c48a Mon Sep 17 00:00:00 2001
From: guotao
Date: Fri, 7 May 2021 16:26:56 +0800
Subject: [PATCH 37/40] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BC=96=E5=8F=B7?=
=?UTF-8?q?=EF=BC=9A45283=20=E6=98=93=E4=BF=AE=E6=A0=87=E9=A2=98=E8=BF=87?=
=?UTF-8?q?=E9=95=BF=E5=AF=BC=E8=87=B4=E6=8E=92=E7=89=88=E9=97=AE=E9=A2=98?=
=?UTF-8?q?=20=E5=8E=BB=E6=8E=89=E5=A4=9A=E4=BD=99=E7=9A=84=E5=B1=9E?=
=?UTF-8?q?=E6=80=A7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/issues_controller.rb | 4 ++--
app/forms/issues/create_form.rb | 2 +-
app/forms/issues/update_form.rb | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb
index b44a04072..3584d6bf5 100644
--- a/app/controllers/issues_controller.rb
+++ b/app/controllers/issues_controller.rb
@@ -102,7 +102,7 @@ class IssuesController < ApplicationController
def create
issue_params = issue_send_params(params)
- Issues::CreateForm.new(issue_params).validate!
+ Issues::CreateForm.new({subject:issue_params[:subject]}).validate!
@issue = Issue.new(issue_params)
if @issue.save!
if params[:attachment_ids].present?
@@ -194,7 +194,7 @@ class IssuesController < ApplicationController
normal_status(-1, "不允许修改为关闭状态")
else
issue_params = issue_send_params(params).except(:issue_classify, :author_id, :project_id)
- Issues::UpdateForm.new(issue_params).validate!
+ Issues::UpdateForm.new({subject:issue_params[:subject]}).validate!
if @issue.update_attributes(issue_params)
if params[:status_id].to_i == 5 #任务由非关闭状态到关闭状态时
@issue.issue_times.update_all(end_time: Time.now)
diff --git a/app/forms/issues/create_form.rb b/app/forms/issues/create_form.rb
index a8e514c36..7dde8ecda 100644
--- a/app/forms/issues/create_form.rb
+++ b/app/forms/issues/create_form.rb
@@ -1,7 +1,7 @@
class Issues::CreateForm
include ActiveModel::Model
- attr_accessor :subject,:description,:is_private,:assigned_to_id,:tracker_id,:status_id,:priority_id,:fixed_version_id,:start_date,:due_date,:estimated_hours,:done_ratio,:issue_type,:token,:issue_tags_value,:closed_on,:branch_name,:issue_classify,:author_id,:project_id
+ attr_accessor :subject
validates :subject, presence: { message: "不能为空" }
diff --git a/app/forms/issues/update_form.rb b/app/forms/issues/update_form.rb
index 1c83779c4..7447c8cc0 100644
--- a/app/forms/issues/update_form.rb
+++ b/app/forms/issues/update_form.rb
@@ -1,7 +1,7 @@
class Issues::UpdateForm
include ActiveModel::Model
- attr_accessor :subject,:description,:is_private,:assigned_to_id,:tracker_id,:status_id,:priority_id,:fixed_version_id,:start_date,:due_date,:estimated_hours,:done_ratio,:issue_type,:token,:issue_tags_value,:closed_on,:branch_name,:issue_classify,:author_id,:project_id
+ attr_accessor :subject
validates :subject, presence: { message: "不能为空" }
From e490ddb1f51fc94e7f3d39c5361442fd6fc52154 Mon Sep 17 00:00:00 2001
From: "vilet.yy"
Date: Fri, 7 May 2021 17:27:37 +0800
Subject: [PATCH 38/40] add: sync mirror project remove pulls module
---
app/models/project_unit.rb | 7 +++++--
app/services/projects/migrate_service.rb | 2 +-
2 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/app/models/project_unit.rb b/app/models/project_unit.rb
index 1cb74fc4a..a07f62b4e 100644
--- a/app/models/project_unit.rb
+++ b/app/models/project_unit.rb
@@ -20,13 +20,16 @@ class ProjectUnit < ApplicationRecord
validates :unit_type, uniqueness: { scope: :project_id}
- def self.init_types(project_id)
- ProjectUnit::unit_types.each do |_, v|
+ def self.init_types(project_id, project_type='common')
+ unit_types = project_type == 'sync_mirror' ? ProjectUnit::unit_types.except("pulls") : ProjectUnit::unit_types
+ unit_types.each do |_, v|
self.create!(project_id: project_id, unit_type: v)
end
end
def self.update_by_unit_types!(project, types)
+ # 同步镜像项目不能有合并请求模块
+ types.delete("pulls") if project.sync_mirror?
# 默认code类型自动创建
types << "code"
project.project_units.where.not(unit_type: types).each(&:destroy!)
diff --git a/app/services/projects/migrate_service.rb b/app/services/projects/migrate_service.rb
index 85648eda9..7df08f9eb 100644
--- a/app/services/projects/migrate_service.rb
+++ b/app/services/projects/migrate_service.rb
@@ -10,7 +10,7 @@ class Projects::MigrateService < ApplicationService
def call
@project = Project.new(project_params)
if @project.save!
- ProjectUnit.init_types(@project.id)
+ ProjectUnit.init_types(@project.id, project.project_type)
Project.update_mirror_projects_count!
@project.set_owner_permission(user)
Repositories::MigrateService.new(user, @project, repository_params).call
From 5c9702b308a4e19d32c85eb8560d3e24570132ae Mon Sep 17 00:00:00 2001
From: "vilet.yy"
Date: Sat, 8 May 2021 15:07:41 +0800
Subject: [PATCH 39/40] fix: build owner team need nickname
---
app/services/organizations/create_service.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/services/organizations/create_service.rb b/app/services/organizations/create_service.rb
index 96bb3f46a..a430ed6f4 100644
--- a/app/services/organizations/create_service.rb
+++ b/app/services/organizations/create_service.rb
@@ -54,7 +54,7 @@ class Organizations::CreateService < ApplicationService
end
def create_owner_info
- @owner_team = Team.build(organization.id, "Owners", "", 4, true, true)
+ @owner_team = Team.build(organization.id, "Owners", "Owner团队", "", 4, true, true)
TeamUnit.unit_types.keys.each do |u_type|
TeamUnit.build(organization.id, owner_team.id, u_type)
end
From d768e81afdcb592e8092b67cf038cd3ecda03e40 Mon Sep 17 00:00:00 2001
From: jasder
Date: Sat, 8 May 2021 16:48:56 +0800
Subject: [PATCH 40/40] Update CHANGELOG.md
---
CHANGELOG.md | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 42422e3bd..401655072 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,22 @@
# Changelog
+## [v3.0.3](https://forgeplus.trustie.net/projects/jasder/forgeplus/releases) - 2021-05-08
+
+* BUGFIXES
+ * Fix 解决易修标题过长导致的排版问题(45469)
+ * Fix 解决合并请求详情页面排版错误的问题(45457)
+ * FIX 解决转移仓库界面专有名词描述错误的问题(45455)
+ * Fix 解决markdown格式文件自动生成数字排序的问题(45454)
+ * Fix 解决镜像项目源地址不显示的问题(45403)
+ * Fix 解决镜像项目导航显示错误问题(45398)
+ * Fix 解决其他相关bug
+
+* ENHANCEMENTS
+ * UPDATE 用户注册时,账号和密码正则匹配调整(45336) (45318) (45290)
+ * ADD 创建组织各属性添加规则匹配功能(45313) (45289)
+ * ADD 创建团建各属性添加规则匹配功能(45334) (45325) (45287)
+ * ADD 仓库转移功能(45017) (45015)
+
## [v3.0.2](https://forgeplus.trustie.net/projects/jasder/forgeplus/releases) - 2021-04-23
* BUGFIXES
|