mirror of
https://gitlink.org.cn/Gitlink/forgeplus.git
synced 2026-05-03 03:40:49 +08:00
init project
This commit is contained in:
85
app/services/projects/apply_join_service.rb
Normal file
85
app/services/projects/apply_join_service.rb
Normal file
@@ -0,0 +1,85 @@
|
||||
class Projects::ApplyJoinService < ApplicationService
|
||||
Error = Class.new(StandardError)
|
||||
|
||||
attr_reader :user, :params
|
||||
|
||||
def initialize(user, params)
|
||||
@user = user
|
||||
@params = params
|
||||
end
|
||||
|
||||
def call
|
||||
validate!
|
||||
|
||||
# 项目报告人员直接加入项目
|
||||
if params[:role] == 'reporter'
|
||||
Projects::JoinService.call(project, user, role: 'reporter')
|
||||
return project
|
||||
end
|
||||
|
||||
ActiveRecord::Base.transaction do
|
||||
apply = user.applied_projects.create!(project: project, role: role_value)
|
||||
|
||||
apply.forge_activities.find_or_create_by!(user: user, project: project)
|
||||
|
||||
notify_project_manager!(apply)
|
||||
end
|
||||
|
||||
# notify_project_owner
|
||||
ApplyJoinProjectNotifyJob.perform_later(user.id, project.id, role_value)
|
||||
|
||||
project
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def project
|
||||
@_project ||= Project.find_by(invite_code: params[:code].to_s.strip)
|
||||
end
|
||||
|
||||
def role_value
|
||||
@_role ||=
|
||||
case params[:role]
|
||||
when 'manager' then 3
|
||||
when 'developer' then 4
|
||||
when 'reporter' then 5
|
||||
else raise Error, '角色无效'
|
||||
end
|
||||
end
|
||||
|
||||
def notify_project_manager!(apply)
|
||||
columns = %i[user_id applied_id applied_type status viewed applied_user_id role project_id created_at updated_at]
|
||||
AppliedMessage.bulk_insert(*columns) do |worker|
|
||||
base_attr = {
|
||||
applied_id: apply.id, applied_type: 'AppliedProject', status: false, viewed: false,
|
||||
applied_user_id: user.id, role: role_value, project_id: project.id
|
||||
}
|
||||
|
||||
project.manager_members.each do |manager|
|
||||
worker.add(base_attr.merge(user_id: manager.user_id))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def notify_project_owner
|
||||
owner = project.user
|
||||
return if owner.phone.blank?
|
||||
|
||||
Educoder::Sms.send(mobile: owner.phone, send_type:'applied_project_info',
|
||||
user_name: owner.show_name, name: project.name)
|
||||
rescue Exception => ex
|
||||
Rails.logger.error("发送短信失败 => #{ex.message}")
|
||||
end
|
||||
|
||||
def validate!
|
||||
# params check
|
||||
raise Error, '邀请码不能为空' if params[:code].blank?
|
||||
raise Error, '角色不能为空' if params[:role].blank?
|
||||
raise Error, '角色无效' unless %w(manager developer reporter).include?(params[:role])
|
||||
|
||||
# logical check
|
||||
raise Error, '邀请码无效' if project.blank?
|
||||
raise Error, '您已在该项目中' if project.member?(user)
|
||||
raise Error, '您已经提交过申请' if user.applied_projects.pending.exists?(project: project)
|
||||
end
|
||||
end
|
||||
18
app/services/projects/change_member_role_service.rb
Normal file
18
app/services/projects/change_member_role_service.rb
Normal file
@@ -0,0 +1,18 @@
|
||||
class Projects::ChangeMemberRoleService < ApplicationService
|
||||
attr_reader :project, :user_id, :role
|
||||
|
||||
def initialize(project, user_id, role)
|
||||
@project = project
|
||||
@user_id = user_id
|
||||
@role = role
|
||||
end
|
||||
|
||||
def call
|
||||
ActiveRecord::Base.transaction do
|
||||
tmp_role = Role.find_by_name role
|
||||
@project.change_member_role!(user_id, tmp_role)
|
||||
end
|
||||
rescue => e
|
||||
raise Error, e.message
|
||||
end
|
||||
end
|
||||
51
app/services/projects/create_service.rb
Normal file
51
app/services/projects/create_service.rb
Normal file
@@ -0,0 +1,51 @@
|
||||
class Projects::CreateService < ApplicationService
|
||||
attr_reader :user, :params
|
||||
|
||||
def initialize(user, params)
|
||||
@user = user
|
||||
@params = params
|
||||
end
|
||||
|
||||
def call
|
||||
@project = Project.new(project_params)
|
||||
ActiveRecord::Base.transaction do
|
||||
if @project.save!
|
||||
Repositories::CreateService.new(user, @project, repository_params).call
|
||||
else
|
||||
#
|
||||
end
|
||||
end
|
||||
@project
|
||||
rescue => e
|
||||
puts "create project service error: #{e.message}"
|
||||
raise Error, e.message
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def project_params
|
||||
{
|
||||
name: params[:name],
|
||||
user_id: params[:user_id],
|
||||
description: params[:description],
|
||||
project_category_id: params[:project_category_id],
|
||||
project_language_id: params[:project_language_id],
|
||||
is_public: get_is_public,
|
||||
ignore_id: params[:ignore_id],
|
||||
license_id: params[:license_id],
|
||||
identifier: params[:repository_name] #新增,hs
|
||||
}
|
||||
end
|
||||
|
||||
def repository_params
|
||||
{
|
||||
hidden: get_is_public,
|
||||
user_id: params[:user_id],
|
||||
identifier: params[:repository_name]
|
||||
}
|
||||
end
|
||||
|
||||
def get_is_public
|
||||
params[:private] || true
|
||||
end
|
||||
end
|
||||
38
app/services/projects/fork_service.rb
Normal file
38
app/services/projects/fork_service.rb
Normal file
@@ -0,0 +1,38 @@
|
||||
class Projects::ForkService < ApplicationService
|
||||
attr_reader :target_owner, :project, :organization
|
||||
|
||||
def initialize(target_owner, project, organization=nil)
|
||||
@target_owner = target_owner
|
||||
@project = project
|
||||
@organization = organization
|
||||
end
|
||||
|
||||
def call
|
||||
ActiveRecord::Base.transaction do
|
||||
clone_project =
|
||||
@project.deep_clone include: :repository,
|
||||
only: [:name, :description,:is_public, :identifier,
|
||||
:rep_identifier, :project_category_id, :project_language_id,
|
||||
:license_id, :ignore_id, {repository: [:identifier, :hidden]}]
|
||||
|
||||
clone_project.owner = @target_owner
|
||||
clone_project.forked_from_project_id = @project.id
|
||||
clone_project.save!
|
||||
|
||||
new_repository = clone_project.repository
|
||||
new_repository.user = @target_owner
|
||||
new_repository.save!
|
||||
|
||||
result = Gitea::Repository::ForkService.new(@project.owner, @target_owner, @project.identifier, @organization).call
|
||||
|
||||
@project.update_column('forked_count', @project.forked_count + 1)
|
||||
new_repository.update_column('url', result['clone_url']) if result
|
||||
|
||||
clone_project
|
||||
end
|
||||
rescue => e
|
||||
puts "clone project service error: #{e.message}"
|
||||
raise Error, e.message
|
||||
end
|
||||
|
||||
end
|
||||
35
app/services/projects/join_service.rb
Normal file
35
app/services/projects/join_service.rb
Normal file
@@ -0,0 +1,35 @@
|
||||
class Projects::JoinService < ApplicationService
|
||||
attr_reader :project, :user, :opts
|
||||
|
||||
def initialize(project, user, **opts)
|
||||
@project = project
|
||||
@user = user
|
||||
@opts = opts
|
||||
end
|
||||
|
||||
def call
|
||||
ActiveRecord::Base.transaction do
|
||||
member = project.members.create!(user: user)
|
||||
|
||||
member.member_roles.create!(role_id: role_value)
|
||||
|
||||
project.user_grades.find_or_create_by!(user: user)
|
||||
end
|
||||
|
||||
ApplyJoinProjectNotifyJob.perform_later(user, project, role_value)
|
||||
|
||||
project
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def role_value
|
||||
@_role ||=
|
||||
case opts[:role]
|
||||
when 'manager' then 3
|
||||
when 'developer' then 4
|
||||
when 'reporter' then 5
|
||||
else raise ArgumentError
|
||||
end
|
||||
end
|
||||
end
|
||||
55
app/services/projects/migrate_service.rb
Normal file
55
app/services/projects/migrate_service.rb
Normal file
@@ -0,0 +1,55 @@
|
||||
class Projects::MigrateService < ApplicationService
|
||||
attr_reader :user, :params
|
||||
|
||||
def initialize(user, params)
|
||||
@user = user
|
||||
@params = params
|
||||
end
|
||||
|
||||
def call
|
||||
@project = Project.new(project_params)
|
||||
ActiveRecord::Base.transaction do
|
||||
if @project.save!
|
||||
Repositories::MigrateService.new(user, @project, repository_params).call
|
||||
else
|
||||
#
|
||||
end
|
||||
end
|
||||
@project
|
||||
rescue => e
|
||||
puts "create mirror project service error: #{e.message}"
|
||||
raise Error, e.message
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def project_params
|
||||
{
|
||||
name: params[:name],
|
||||
user_id: params[:user_id],
|
||||
description: params[:description],
|
||||
project_category_id: params[:project_category_id],
|
||||
project_language_id: params[:project_language_id],
|
||||
is_public: project_secretion[:public],
|
||||
project_type: Project.project_types[:mirror]
|
||||
}
|
||||
end
|
||||
|
||||
def repository_params
|
||||
{
|
||||
hidden: project_secretion[:hidden],
|
||||
identifier: params[:repository_name],
|
||||
mirror_url: params[:clone_addr],
|
||||
user_id: user.id,
|
||||
login: user.login
|
||||
}
|
||||
end
|
||||
|
||||
def project_secretion
|
||||
# 默认公开
|
||||
public, hidden = true, false
|
||||
public, hidden = false, true if ActiveModel::Type::Boolean.new.cast(params[:private]) == true
|
||||
|
||||
{ public: public, hidden: hidden }
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user