DEV: Small refactors for future work (#332)
This commit is contained in:
		
							parent
							
								
									7320fdd94b
								
							
						
					
					
						commit
						fbdfb7143b
					
				| 
						 | 
				
			
			@ -8,7 +8,7 @@ module Jobs
 | 
			
		|||
      raise Discourse::InvalidParameters.new(:assigned_to_id) if args[:assigned_to_id].nil?
 | 
			
		||||
      raise Discourse::InvalidParameters.new(:assigned_to_type) if args[:assigned_to_type].nil?
 | 
			
		||||
      raise Discourse::InvalidParameters.new(:assigned_by_id) if args[:assigned_by_id].nil?
 | 
			
		||||
      raise Discourse::InvalidParameters.new(:silent) if args[:silent].nil?
 | 
			
		||||
      raise Discourse::InvalidParameters.new(:skip_small_action_post) if args[:skip_small_action_post].nil?
 | 
			
		||||
 | 
			
		||||
      topic = Topic.find(args[:topic_id])
 | 
			
		||||
      post = Post.find(args[:post_id])
 | 
			
		||||
| 
						 | 
				
			
			@ -37,7 +37,7 @@ module Jobs
 | 
			
		|||
          )
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        next if args[:silent]
 | 
			
		||||
        next if args[:skip_small_action_post]
 | 
			
		||||
        Notification.create!(
 | 
			
		||||
          notification_type: Notification.types[:assigned] || Notification.types[:custom],
 | 
			
		||||
          user_id: user.id,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -69,9 +69,9 @@ class ::Assigner
 | 
			
		|||
      if is_last_staff_post?(post)
 | 
			
		||||
        assigner = new(post.topic, post.user)
 | 
			
		||||
        if assign_other
 | 
			
		||||
          assigner.assign(assign_other, silent: true)
 | 
			
		||||
          assigner.assign(assign_other, skip_small_action_post: true)
 | 
			
		||||
        elsif assign_self
 | 
			
		||||
          assigner.assign(assign_self, silent: true)
 | 
			
		||||
          assigner.assign(assign_self, skip_small_action_post: true)
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			@ -199,47 +199,33 @@ class ::Assigner
 | 
			
		|||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def assign(assign_to, note: nil, silent: false)
 | 
			
		||||
    type = assign_to.is_a?(User) ? "User" : "Group"
 | 
			
		||||
  def assign(assign_to, note: nil, skip_small_action_post: false)
 | 
			
		||||
    assigned_to_type = assign_to.is_a?(User) ? "User" : "Group"
 | 
			
		||||
 | 
			
		||||
    forbidden_reason = forbidden_reasons(assign_to: assign_to, type: type, note: note)
 | 
			
		||||
    forbidden_reason = forbidden_reasons(assign_to: assign_to, type: assigned_to_type, note: note)
 | 
			
		||||
    return { success: false, reason: forbidden_reason } if forbidden_reason
 | 
			
		||||
 | 
			
		||||
    action_code = {}
 | 
			
		||||
    action_code[:user] = topic.assignment.present? ? "reassigned" : "assigned"
 | 
			
		||||
    action_code[:group] = topic.assignment.present? ? "reassigned_group" : "assigned_group"
 | 
			
		||||
 | 
			
		||||
    silent = silent || no_assignee_change?(assign_to)
 | 
			
		||||
    skip_small_action_post = skip_small_action_post || no_assignee_change?(assign_to)
 | 
			
		||||
 | 
			
		||||
    @target.assignment&.destroy!
 | 
			
		||||
 | 
			
		||||
    assignment = @target.create_assignment!(assigned_to_id: assign_to.id, assigned_to_type: type, assigned_by_user_id: @assigned_by.id, topic_id: topic.id, note: note)
 | 
			
		||||
    assignment = @target.create_assignment!(assigned_to_id: assign_to.id, assigned_to_type: assigned_to_type, assigned_by_user_id: @assigned_by.id, topic_id: topic.id, note: note)
 | 
			
		||||
 | 
			
		||||
    first_post.publish_change_to_clients!(:revised, reload_topic: true)
 | 
			
		||||
 | 
			
		||||
    serializer = assignment.assigned_to_user? ? BasicUserSerializer : BasicGroupSerializer
 | 
			
		||||
 | 
			
		||||
    Jobs.enqueue(:assign_notification,
 | 
			
		||||
                 topic_id: topic.id,
 | 
			
		||||
                 post_id: topic_target? ? first_post.id : @target.id,
 | 
			
		||||
                 assigned_to_id: assign_to.id,
 | 
			
		||||
                 assigned_to_type: type,
 | 
			
		||||
                 assigned_to_type: assigned_to_type,
 | 
			
		||||
                 assigned_by_id: @assigned_by.id,
 | 
			
		||||
                 silent: silent)
 | 
			
		||||
                 skip_small_action_post: skip_small_action_post)
 | 
			
		||||
 | 
			
		||||
    MessageBus.publish(
 | 
			
		||||
      "/staff/topic-assignment",
 | 
			
		||||
      {
 | 
			
		||||
        type: "assigned",
 | 
			
		||||
        topic_id: topic.id,
 | 
			
		||||
        post_id: post_target? && @target.id,
 | 
			
		||||
        post_number: post_target? && @target.post_number,
 | 
			
		||||
        assigned_type: type,
 | 
			
		||||
        assigned_to: serializer.new(assign_to, scope: Guardian.new, root: false).as_json,
 | 
			
		||||
        assignment_note: note,
 | 
			
		||||
      },
 | 
			
		||||
      user_ids: allowed_user_ids
 | 
			
		||||
    )
 | 
			
		||||
    publish_assignment(assignment, assign_to, note)
 | 
			
		||||
 | 
			
		||||
    if assignment.assigned_to_user?
 | 
			
		||||
      if !TopicUser.exists?(
 | 
			
		||||
| 
						 | 
				
			
			@ -262,7 +248,8 @@ class ::Assigner
 | 
			
		|||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    if !silent
 | 
			
		||||
 | 
			
		||||
    unless skip_small_action_post
 | 
			
		||||
      custom_fields = { "action_code_who" => assign_to.is_a?(User) ? assign_to.username : assign_to.name }
 | 
			
		||||
 | 
			
		||||
      if post_target?
 | 
			
		||||
| 
						 | 
				
			
			@ -281,9 +268,9 @@ class ::Assigner
 | 
			
		|||
 | 
			
		||||
    # Create a webhook event
 | 
			
		||||
    if WebHook.active_web_hooks(:assign).exists?
 | 
			
		||||
      type = :assigned
 | 
			
		||||
      assigned_to_type = :assigned
 | 
			
		||||
      payload = {
 | 
			
		||||
        type: type,
 | 
			
		||||
        type: assigned_to_type,
 | 
			
		||||
        topic_id: topic.id,
 | 
			
		||||
        topic_title: topic.title,
 | 
			
		||||
        assigned_by_id: @assigned_by.id,
 | 
			
		||||
| 
						 | 
				
			
			@ -300,7 +287,7 @@ class ::Assigner
 | 
			
		|||
          assigned_to_group_name: assign_to.name,
 | 
			
		||||
        })
 | 
			
		||||
      end
 | 
			
		||||
      WebHook.enqueue_assign_hooks(type, payload.to_json)
 | 
			
		||||
      WebHook.enqueue_assign_hooks(assigned_to_type, payload.to_json)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    { success: true }
 | 
			
		||||
| 
						 | 
				
			
			@ -398,6 +385,23 @@ class ::Assigner
 | 
			
		|||
 | 
			
		||||
  private
 | 
			
		||||
 | 
			
		||||
  def publish_assignment(assignment, assign_to, note)
 | 
			
		||||
    serializer = assignment.assigned_to_user? ? BasicUserSerializer : BasicGroupSerializer
 | 
			
		||||
    MessageBus.publish(
 | 
			
		||||
      "/staff/topic-assignment",
 | 
			
		||||
      {
 | 
			
		||||
        type: "assigned",
 | 
			
		||||
        topic_id: topic.id,
 | 
			
		||||
        post_id: post_target? && @target.id,
 | 
			
		||||
        post_number: post_target? && @target.post_number,
 | 
			
		||||
        assigned_type: assignment.assigned_to_type,
 | 
			
		||||
        assigned_to: serializer.new(assign_to, scope: Guardian.new, root: false).as_json,
 | 
			
		||||
        assignment_note: note,
 | 
			
		||||
      },
 | 
			
		||||
      user_ids: allowed_user_ids
 | 
			
		||||
    )
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def moderator_post_assign_action_code(assignment, action_code)
 | 
			
		||||
    if assignment.target.is_a?(Post)
 | 
			
		||||
      # posts do not have to handle conditions of 'assign' or 'reassign'
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -816,7 +816,7 @@ after_initialize do
 | 
			
		|||
                   assigned_to_id: assignment.assigned_to_id,
 | 
			
		||||
                   assigned_to_type: assignment.assigned_to_type,
 | 
			
		||||
                   assigned_by_id: assignment.assigned_by_user_id,
 | 
			
		||||
                   silent: true)
 | 
			
		||||
                   skip_small_action_post: true)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,7 +29,7 @@ RSpec.describe Jobs::AssignNotification do
 | 
			
		|||
 | 
			
		||||
      it 'sends notification alert' do
 | 
			
		||||
        messages = MessageBus.track_publish("/notification-alert/#{user2.id}") do
 | 
			
		||||
          described_class.new.execute({ topic_id: topic.id, post_id: post.id, assigned_to_id: user2.id, assigned_to_type: 'User', assigned_by_id: user1.id, silent: false })
 | 
			
		||||
          described_class.new.execute({ topic_id: topic.id, post_id: post.id, assigned_to_id: user2.id, assigned_to_type: 'User', assigned_by_id: user1.id, skip_small_action_post: false })
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        expect(messages.length).to eq(1)
 | 
			
		||||
| 
						 | 
				
			
			@ -41,7 +41,7 @@ RSpec.describe Jobs::AssignNotification do
 | 
			
		|||
        assign_allowed_group.add(user)
 | 
			
		||||
 | 
			
		||||
        assert_publish_topic_state(pm, user) do
 | 
			
		||||
          described_class.new.execute({ topic_id: pm.id, post_id: pm_post.id, assigned_to_id: pm.allowed_users.first.id, assigned_to_type: 'User', assigned_by_id: user1.id, silent: false })
 | 
			
		||||
          described_class.new.execute({ topic_id: pm.id, post_id: pm_post.id, assigned_to_id: pm.allowed_users.first.id, assigned_to_type: 'User', assigned_by_id: user1.id, skip_small_action_post: false })
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -58,7 +58,7 @@ RSpec.describe Jobs::AssignNotification do
 | 
			
		|||
            topic_title: topic.title
 | 
			
		||||
          }.to_json
 | 
			
		||||
        )
 | 
			
		||||
        described_class.new.execute({ topic_id: topic.id, post_id: post.id, assigned_to_id: user2.id, assigned_to_type: 'User', assigned_by_id: user1.id, silent: false })
 | 
			
		||||
        described_class.new.execute({ topic_id: topic.id, post_id: post.id, assigned_to_id: user2.id, assigned_to_type: 'User', assigned_by_id: user1.id, skip_small_action_post: false })
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -76,19 +76,19 @@ RSpec.describe Jobs::AssignNotification do
 | 
			
		|||
 | 
			
		||||
      it 'sends notification alert to all group members' do
 | 
			
		||||
        messages = MessageBus.track_publish("/notification-alert/#{user2.id}") do
 | 
			
		||||
          described_class.new.execute({ topic_id: topic.id, post_id: post.id, assigned_to_id: group.id, assigned_to_type: 'Group', assigned_by_id: user1.id, silent: false })
 | 
			
		||||
          described_class.new.execute({ topic_id: topic.id, post_id: post.id, assigned_to_id: group.id, assigned_to_type: 'Group', assigned_by_id: user1.id, skip_small_action_post: false })
 | 
			
		||||
        end
 | 
			
		||||
        expect(messages.length).to eq(1)
 | 
			
		||||
        expect(messages.first.data[:excerpt]).to eq("assigned to Developers the topic 'Basic topic title'")
 | 
			
		||||
 | 
			
		||||
        messages = MessageBus.track_publish("/notification-alert/#{user3.id}") do
 | 
			
		||||
          described_class.new.execute({ topic_id: topic.id, post_id: post.id, assigned_to_id: group.id, assigned_to_type: 'Group', assigned_by_id: user1.id, silent: false })
 | 
			
		||||
          described_class.new.execute({ topic_id: topic.id, post_id: post.id, assigned_to_id: group.id, assigned_to_type: 'Group', assigned_by_id: user1.id, skip_small_action_post: false })
 | 
			
		||||
        end
 | 
			
		||||
        expect(messages.length).to eq(1)
 | 
			
		||||
        expect(messages.first.data[:excerpt]).to eq("assigned to Developers the topic 'Basic topic title'")
 | 
			
		||||
 | 
			
		||||
        messages = MessageBus.track_publish("/notification-alert/#{user4.id}") do
 | 
			
		||||
          described_class.new.execute({ topic_id: topic.id, post_id: post.id, assigned_to_id: group.id, assigned_to_type: 'Group', assigned_by_id: user1.id, silent: false })
 | 
			
		||||
          described_class.new.execute({ topic_id: topic.id, post_id: post.id, assigned_to_id: group.id, assigned_to_type: 'Group', assigned_by_id: user1.id, skip_small_action_post: false })
 | 
			
		||||
        end
 | 
			
		||||
        expect(messages.length).to eq(0)
 | 
			
		||||
      end
 | 
			
		||||
| 
						 | 
				
			
			@ -109,7 +109,7 @@ RSpec.describe Jobs::AssignNotification do
 | 
			
		|||
          )
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        described_class.new.execute({ topic_id: topic.id, post_id: post.id, assigned_to_id: group.id, assigned_to_type: 'Group', assigned_by_id: user1.id, silent: false })
 | 
			
		||||
        described_class.new.execute({ topic_id: topic.id, post_id: post.id, assigned_to_id: group.id, assigned_to_type: 'Group', assigned_by_id: user1.id, skip_small_action_post: false })
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,7 +27,7 @@ RSpec.describe Jobs::UnassignNotification do
 | 
			
		|||
 | 
			
		||||
    context 'User' do
 | 
			
		||||
      it 'deletes notifications' do
 | 
			
		||||
        Jobs::AssignNotification.new.execute({ topic_id: topic.id, post_id: post.id, assigned_to_id: user2.id, assigned_to_type: 'User', assigned_by_id: user1.id, silent: false })
 | 
			
		||||
        Jobs::AssignNotification.new.execute({ topic_id: topic.id, post_id: post.id, assigned_to_id: user2.id, assigned_to_type: 'User', assigned_by_id: user1.id, skip_small_action_post: false })
 | 
			
		||||
 | 
			
		||||
        expect {
 | 
			
		||||
          described_class.new.execute({ topic_id: topic.id, post_id: post.id, assigned_to_id: user2.id, assigned_to_type: 'User' })
 | 
			
		||||
| 
						 | 
				
			
			@ -55,7 +55,7 @@ RSpec.describe Jobs::UnassignNotification do
 | 
			
		|||
      end
 | 
			
		||||
 | 
			
		||||
      it 'deletes notifications' do
 | 
			
		||||
        Jobs::AssignNotification.new.execute({ topic_id: topic.id, post_id: post.id, assigned_to_id: group.id, assigned_to_type: 'Group', assigned_by_id: user1.id, silent: false })
 | 
			
		||||
        Jobs::AssignNotification.new.execute({ topic_id: topic.id, post_id: post.id, assigned_to_id: group.id, assigned_to_type: 'Group', assigned_by_id: user1.id, skip_small_action_post: false })
 | 
			
		||||
 | 
			
		||||
        expect {
 | 
			
		||||
          described_class.new.execute({ topic_id: topic.id, post_id: post.id, assigned_to_id: group.id, assigned_to_type: 'Group' })
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -147,8 +147,6 @@ RSpec.describe Assigner do
 | 
			
		|||
      assigner.assign(assignee).fetch(:success)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    fab!(:admin) { Fabricate(:admin) }
 | 
			
		||||
 | 
			
		||||
    context "forbidden reasons" do
 | 
			
		||||
      it "doesn't assign if the user has too many assigned topics" do
 | 
			
		||||
        SiteSetting.max_assigned_topics = 1
 | 
			
		||||
| 
						 | 
				
			
			@ -203,7 +201,7 @@ RSpec.describe Assigner do
 | 
			
		|||
      end
 | 
			
		||||
 | 
			
		||||
      it 'fails to assign when the assigned user and note is the same' do
 | 
			
		||||
        assigner = described_class.new(topic, admin)
 | 
			
		||||
        assigner = described_class.new(topic, moderator_2)
 | 
			
		||||
        assigner.assign(moderator, note: "note me down")
 | 
			
		||||
 | 
			
		||||
        assign = assigner.assign(moderator, note: "note me down")
 | 
			
		||||
| 
						 | 
				
			
			@ -213,7 +211,7 @@ RSpec.describe Assigner do
 | 
			
		|||
      end
 | 
			
		||||
 | 
			
		||||
      it 'allows assign when the assigned user is same but note is different' do
 | 
			
		||||
        assigner = described_class.new(topic, admin)
 | 
			
		||||
        assigner = described_class.new(topic, moderator_2)
 | 
			
		||||
        assigner.assign(moderator, note: "note me down")
 | 
			
		||||
 | 
			
		||||
        assign = assigner.assign(moderator, note: "note me down again")
 | 
			
		||||
| 
						 | 
				
			
			@ -222,28 +220,28 @@ RSpec.describe Assigner do
 | 
			
		|||
      end
 | 
			
		||||
 | 
			
		||||
      it 'fails to assign when the assigned user cannot view the pm' do
 | 
			
		||||
        assign = described_class.new(pm, admin).assign(moderator)
 | 
			
		||||
        assign = described_class.new(pm, moderator_2).assign(moderator)
 | 
			
		||||
 | 
			
		||||
        expect(assign[:success]).to eq(false)
 | 
			
		||||
        expect(assign[:reason]).to eq(:forbidden_assignee_not_pm_participant)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'fails to assign when not all group members has access to pm' do
 | 
			
		||||
        assign = described_class.new(pm, admin).assign(moderator.groups.first)
 | 
			
		||||
        assign = described_class.new(pm, moderator_2).assign(moderator.groups.first)
 | 
			
		||||
 | 
			
		||||
        expect(assign[:success]).to eq(false)
 | 
			
		||||
        expect(assign[:reason]).to eq(:forbidden_group_assignee_not_pm_participant)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'fails to assign when the assigned user cannot view the topic' do
 | 
			
		||||
        assign = described_class.new(secure_topic, admin).assign(moderator)
 | 
			
		||||
        assign = described_class.new(secure_topic, moderator_2).assign(moderator)
 | 
			
		||||
 | 
			
		||||
        expect(assign[:success]).to eq(false)
 | 
			
		||||
        expect(assign[:reason]).to eq(:forbidden_assignee_cant_see_topic)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'fails to assign when the not all group members can view the topic' do
 | 
			
		||||
        assign = described_class.new(secure_topic, admin).assign(moderator.groups.first)
 | 
			
		||||
        assign = described_class.new(secure_topic, moderator_2).assign(moderator.groups.first)
 | 
			
		||||
 | 
			
		||||
        expect(assign[:success]).to eq(false)
 | 
			
		||||
        expect(assign[:reason]).to eq(:forbidden_group_assignee_cant_see_topic)
 | 
			
		||||
| 
						 | 
				
			
			@ -253,7 +251,7 @@ RSpec.describe Assigner do
 | 
			
		|||
    it "assigns the PM to the moderator when it's included in the list of allowed users" do
 | 
			
		||||
      pm.allowed_users << moderator
 | 
			
		||||
 | 
			
		||||
      assign = described_class.new(pm, admin).assign(moderator)
 | 
			
		||||
      assign = described_class.new(pm, moderator_2).assign(moderator)
 | 
			
		||||
 | 
			
		||||
      expect(assign[:success]).to eq(true)
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			@ -261,7 +259,7 @@ RSpec.describe Assigner do
 | 
			
		|||
    it "assigns the PM to the moderator when it's a member of an allowed group" do
 | 
			
		||||
      pm.allowed_groups << assign_allowed_group
 | 
			
		||||
 | 
			
		||||
      assign = described_class.new(pm, admin).assign(moderator)
 | 
			
		||||
      assign = described_class.new(pm, moderator_2).assign(moderator)
 | 
			
		||||
 | 
			
		||||
      expect(assign[:success]).to eq(true)
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue