diff --git a/app/models/project.rb b/app/models/project.rb index 5747eba..c326cf7 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -7,4 +7,6 @@ class Project < ApplicationRecord belongs_to :slack_workspace has_many :developers + + has :related_project, class_name: 'Project', foreign_key: 'related_project_id' end diff --git a/app/services/slack/action/add_code_review.rb b/app/services/slack/action/add_code_review.rb index 221f94d..3c96ae5 100644 --- a/app/services/slack/action/add_code_review.rb +++ b/app/services/slack/action/add_code_review.rb @@ -19,7 +19,11 @@ def initialize(slack_workspace, url, requester, given_reviewers_tags) reviewers = given_reviewers reviewers += pick_reviewers_in_project(reviewers, requester) - reviewers += pick_external_reviewers(reviewers, requester) + + related_project = Project.find(project.related_project_id) + + reviewers += pick_external_reviewers_by_project(reviewers, requester, related_project) if related_project.present? + reviewers += pick_external_reviewers(reviewers, requester) if related_project.blank? create_code_review(url, reviewers, given_reviewers, requester) rescue ActiveRecord::RecordNotFound => e @@ -66,6 +70,17 @@ def pick_external_reviewers(reviewers, requester) .limit(to_take) end + def pick_external_reviewers_by_project(reviewers, requester, project) + to_take = REQUIRED_NUMBER_OF_REVIEWERS - reviewers.length + + Developer + .queue + .where.not(id: reviewers + [requester]) + .where(slack_workspace: @slack_workspace) + .where(project: project) + .limit(to_take) + end + def pick_reviewers_by_tags(tags) return [] if tags.empty? diff --git a/app/services/slack/action/add_related_project.rb b/app/services/slack/action/add_related_project.rb new file mode 100644 index 0000000..c93cb9d --- /dev/null +++ b/app/services/slack/action/add_related_project.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +module Slack + module Action + # Adds a project to another project so that they are related for code reviews + class AddRelatedProject < Slack::AbstractAction + def initialize(slack_workspace, project_name, related_project_name) + super(slack_workspace) + project = @slack_workspace.projects.find_by(name: project_name) + related_project = @slack_workspace.projects.find_by(name: related_project_name) + + project.related_project_id = related_project.id + project.save! + + @text = 'Projects are now related.' + end + end + end +end diff --git a/db/migrate/20200221020120_add_related_project_id_to_project.rb b/db/migrate/20200221020120_add_related_project_id_to_project.rb new file mode 100644 index 0000000..e8a590b --- /dev/null +++ b/db/migrate/20200221020120_add_related_project_id_to_project.rb @@ -0,0 +1,5 @@ +class AddRelatedProjectIdToProject < ActiveRecord::Migration[6.0] + def change + add_column :projects, :related_project_id, :integer + end +end diff --git a/db/schema.rb b/db/schema.rb index 8938be1..be5f384 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_01_24_013912) do +ActiveRecord::Schema.define(version: 2020_02_21_020120) do create_table "code_reviews", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t| t.string "url" @@ -47,6 +47,7 @@ t.bigint "slack_workspace_id" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false + t.integer "related_project_id" t.index ["slack_workspace_id"], name: "index_projects_on_slack_workspace_id" end