parent
cd32ece4f2
commit
35a25aaf8b
@ -0,0 +1,5 @@
|
|||||||
|
class Projects::BaseController < ApplicationController
|
||||||
|
include PaginateHelper
|
||||||
|
|
||||||
|
before_action :require_login, :check_auth
|
||||||
|
end
|
@ -0,0 +1,14 @@
|
|||||||
|
class Projects::ProjectAppliesController < Projects::BaseController
|
||||||
|
def create
|
||||||
|
project = Projects::ApplyJoinService.call(current_user, create_params)
|
||||||
|
render_ok(project_id: project.id)
|
||||||
|
rescue Projects::ApplyJoinService::Error => ex
|
||||||
|
render_error(ex.message)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def create_params
|
||||||
|
params.permit(:code, :role)
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,31 @@
|
|||||||
|
# 申请成为 管理员、开发者 加入项目 消息通知
|
||||||
|
class ApplyJoinProjectNotifyJob < ApplicationJob
|
||||||
|
queue_as :notify
|
||||||
|
|
||||||
|
def perform(user_id, project_id, role)
|
||||||
|
user = User.find_by(id: user_id)
|
||||||
|
project = Project.find_by(id: project_id)
|
||||||
|
return if user.blank? || project.blank?
|
||||||
|
|
||||||
|
attrs = %i[user_id trigger_user_id container_id container_type status
|
||||||
|
belong_container_id belong_container_type tiding_type extra created_at updated_at]
|
||||||
|
|
||||||
|
same_attrs = {
|
||||||
|
trigger_user_id: user.id, status: 0, tiding_type: 'Apply', extra: role,
|
||||||
|
container_id: project.id, container_type: 'JoinProject',
|
||||||
|
belong_container_id: project.id, belong_container_type: 'Project'
|
||||||
|
}
|
||||||
|
|
||||||
|
# 报告人员加入时消息为系统通知消息
|
||||||
|
if role == 5
|
||||||
|
same_attrs[:container_type] = 'ReporterJoinProject'
|
||||||
|
same_attrs[:tiding_type] = 'System'
|
||||||
|
end
|
||||||
|
|
||||||
|
Tiding.bulk_insert(*attrs) do |worker|
|
||||||
|
project.manager_members.each do |manager|
|
||||||
|
worker.add(same_attrs.merge(user_id: manager.user_id))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,9 @@
|
|||||||
|
class AppliedProject < ApplicationRecord
|
||||||
|
belongs_to :user
|
||||||
|
belongs_to :project
|
||||||
|
|
||||||
|
has_many :applied_messages, as: :applied, dependent: :destroy
|
||||||
|
has_many :forge_activities, as: :forge_act, dependent: :destroy
|
||||||
|
|
||||||
|
scope :pending, -> { where(status: 0) }
|
||||||
|
end
|
@ -0,0 +1,5 @@
|
|||||||
|
class ForgeActivity < ApplicationRecord
|
||||||
|
belongs_to :user
|
||||||
|
belongs_to :project
|
||||||
|
belongs_to :forge_act, polymorphic: true
|
||||||
|
end
|
@ -1,6 +1,8 @@
|
|||||||
class Member < ApplicationRecord
|
class Member < ApplicationRecord
|
||||||
has_many :member_roles, dependent: :destroy
|
belongs_to :user
|
||||||
belongs_to :course, optional: true
|
belongs_to :course, optional: true
|
||||||
belongs_to :project, optional: true
|
belongs_to :project, optional: true
|
||||||
belongs_to :user
|
|
||||||
|
has_many :member_roles, dependent: :destroy
|
||||||
|
has_many :roles, through: :member_roles
|
||||||
end
|
end
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
class MemberRole < ApplicationRecord
|
class MemberRole < ApplicationRecord
|
||||||
|
belongs_to :role
|
||||||
belongs_to :member
|
belongs_to :member
|
||||||
end
|
end
|
||||||
|
@ -0,0 +1,3 @@
|
|||||||
|
class Role < ApplicationRecord
|
||||||
|
has_many :member_roles, dependent: :destroy
|
||||||
|
end
|
@ -0,0 +1,4 @@
|
|||||||
|
class UserGrade < ApplicationRecord
|
||||||
|
belongs_to :project
|
||||||
|
belongs_to :user
|
||||||
|
end
|
@ -0,0 +1,82 @@
|
|||||||
|
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!
|
||||||
|
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!
|
||||||
|
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 = { 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
|
@ -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
|
Loading…
Reference in new issue