Skip to content

Commit

Permalink
Create PullRequest object when payload is recieved
Browse files Browse the repository at this point in the history
  • Loading branch information
EJ Allen committed Dec 11, 2014
1 parent f5bd0ff commit e2ae16e
Show file tree
Hide file tree
Showing 10 changed files with 540 additions and 2 deletions.
1 change: 0 additions & 1 deletion .rspec
@@ -1,3 +1,2 @@
--color
--warnings
--require spec_helper
23 changes: 23 additions & 0 deletions app/controllers/github_payloads_controller.rb
@@ -0,0 +1,23 @@
class GithubPayloadsController < ApplicationController
def create
if pr_is_new?
PullRequest.create(pr_params)
end

render nothing: true
end

private

def pr_is_new?
parser.action == "opened"
end

def parser
@_parser ||= PayloadParser.new(params[:payload])
end

def pr_params
parser.params
end
end
6 changes: 6 additions & 0 deletions app/models/pull_request.rb
@@ -0,0 +1,6 @@
class PullRequest < ActiveRecord::Base
validates :github_issue_id, presence: true
validates :github_url, presence: true
validates :repo_name, presence: true
validates :status, presence: true
end
35 changes: 35 additions & 0 deletions app/services/payload_parser.rb
@@ -0,0 +1,35 @@
class PayloadParser
def initialize(payload)
@payload = payload
end

def action
payload["action"]
end

def params
{
github_issue_id: github_issue_id,
github_url: github_url,
repo_name: repo_name,
}
end

private

def github_issue_id
payload["pull_request"]["id"]
end

def github_url
payload["pull_request"]["html_url"]
end

def repo_name
payload["pull_request"]["head"]["repo"]["full_name"]
end

def payload
@_payload ||= JSON.parse(@payload)
end
end
1 change: 1 addition & 0 deletions config/routes.rb
@@ -1,3 +1,4 @@
Rails.application.routes.draw do
resources :github_payloads, only: [:create]
root to: "pull_requests#index"
end
12 changes: 12 additions & 0 deletions db/migrate/20141211190456_create_pull_requests.rb
@@ -0,0 +1,12 @@
class CreatePullRequests < ActiveRecord::Migration
def change
create_table :pull_requests do |t|
t.timestamps null: false

t.integer :github_issue_id, null: false
t.string :github_url, null: false
t.string :repo_name, null: false
t.string :status, null: false, default: 'needs review', index: true
end
end
end
13 changes: 12 additions & 1 deletion db/schema.rb
Expand Up @@ -11,7 +11,7 @@
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema.define(version: 20141211175300) do
ActiveRecord::Schema.define(version: 20141211190456) do

# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
Expand All @@ -32,4 +32,15 @@

add_index "delayed_jobs", ["priority", "run_at"], name: "delayed_jobs_priority", using: :btree

create_table "pull_requests", force: true do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "github_issue_id", null: false
t.string "github_url", null: false
t.string "repo_name", null: false
t.string "status", default: "needs review", null: false
end

add_index "pull_requests", ["status"], name: "index_pull_requests_on_status", using: :btree

end
27 changes: 27 additions & 0 deletions spec/controllers/github_payloads_controller_spec.rb
@@ -0,0 +1,27 @@
require "rails_helper"

describe GithubPayloadsController do
context "POST#create" do
describe "when the action is 'opened'" do
it "creates a new PullRequest" do
send_pull_request_payload(action: "opened")
expect(last_pull_request.status).to eq("needs review")
end
end

describe "when the action is not 'opened'" do
it "does not create a pull request" do
send_pull_request_payload(action: "merged")
expect(last_pull_request).to be_nil
end
end
end

def send_pull_request_payload(action:)
post :create, payload: pull_request_payload(action: action)
end

def last_pull_request
PullRequest.last
end
end
8 changes: 8 additions & 0 deletions spec/models/pull_request_spec.rb
@@ -0,0 +1,8 @@
require "rails_helper"

describe PullRequest do
it { should validate_presence_of(:github_issue_id) }
it { should validate_presence_of(:github_url) }
it { should validate_presence_of(:repo_name) }
it { should validate_presence_of(:status) }
end
416 changes: 416 additions & 0 deletions spec/support/github_payloads/sample_payload.rb

Large diffs are not rendered by default.

0 comments on commit e2ae16e

Please sign in to comment.